void Search(){
    // 根据当前的curblk的状态找出最佳移动路径
//    EnterCriticalSection(&cs);
//    cout << "isSearching" << endl;
    // Find the Top Line
    int i,j,TopLine = BOX_R;
    int path[BOX_C][BOX_R],evaluated[BOX_C][BOX_R];
    curblk.ClearCube();
    Block SearchBlk = curblk;
    BestScore = -0xff;
    BestRotate = 0;
    memset(path,0,sizeof(path));

//    path[SearchBlk.x][SearchBlk.y] = 1;
    for( i=SearchBlk.y+4; i<BOX_R; i++){
        for( j=0; j<BOX_C; j++){
            if( box[j][i] ){
                TopLine = i;
                i = BOX_R;
                break;
            }
        }
    }
    for( i=SearchBlk.y; i<TopLine-6; i++){
        path[SearchBlk.x][SearchBlk.y] = 1;
        SearchBlk.y++;
    }
    Search_start = SDL_GetTicks();
    for( i=0; i<3; i++){                         // 四种旋转变换的循环
        memset(evaluated,0,sizeof(evaluated));
        DFS(SearchBlk,path,evaluated);
        if( SearchBlk.Rotate() == -1) break;     // 无法再旋转则退出
    }
//    LeaveCriticalSection(&cs);
//    cout << "Searching Complete" << endl;
    return ;
}
int ThreadFunc(void * unused){
    int old_time,cur_time,x,y;
    old_time = cur_time = SDL_GetTicks();
    while( !gameOver ){
        while( alive ){
            while( !Operation.isEmpty() && alive){
                EnterCriticalSection(&cs);
                Operation.DeleteQ(command);
                curblk.ClearCube();
                switch( command ){
                    case MOVEDOWN: curblk.MoveDown();
                                   break;
                    case MOVELEFT: curblk.MoveLeft();
                                   break;
                    case MOVERIGHT:curblk.MoveRight();
                                   break;
                    case ROTATE  : curblk.Rotate();
                                   break;
                 }
                 if( command == TURNNEXT ){                 //有的特殊命令最好特殊处理
                    curblk.TurnNext();
                    break;
                 }
                 curblk.DrawCube();
                 Screen.flip();
                 LeaveCriticalSection(&cs);
            }
            cur_time = SDL_GetTicks();
            SDL_Delay(1);
            if( !AIMode ){
                if( cur_time - old_time < 500 ) continue;
                old_time = cur_time;
                Operation.AddQ(MOVEDOWN);
            }else{
                if( cur_time - old_time < 50 ) continue;
                old_time = cur_time;
                x = curblk.x;
                y = curblk.y;
                if( BestRotate>0 ){
                    Operation.AddQ(ROTATE);
                    BestRotate -= 1;
                    continue;
                }
                if( BestPath[x][y+1] ){
                    Operation.AddQ(MOVEDOWN);
                    BestPath[x][y+1] = 0;
                    y += 1;
                    continue;
                }else if( BestPath[x+1][y] ){
                    Operation.AddQ(MOVERIGHT);
                    BestPath[x+1][y] = 0;
                    x += 1;
                    continue;
                }else if( BestPath[x-1][y] ){
                    Operation.AddQ(MOVELEFT);
                    BestPath[x-1][y] = 0;
                    x -= 1;
                    continue;
                }
                alive = 0;
            }
        }
        while(DelLine());
        Operation.ClearQ();
        ShowCube();
        ShowScore();
        if( AIMode ) Search();
        alive = 1;
    }
    return 0;
}
Пример #3
0
void PlayState::HandleInput()
{
	static bool down_is_pressed = false;
	static bool left_is_pressed = false;
	static bool right_is_pressed = false;


	if (SDL_PollEvent(&event))
	{
		if (event.type == SDL_QUIT)
		{
			while (!TheGame::Instance()->GetGameStates()->empty())
			{
				TheGame::Instance()->GetGameStates()->pop();
			}
			return;
		}
		if (event.type == SDL_KEYDOWN)
		{
			
			if (event.key.keysym.sym == SDLK_ESCAPE)
			{
				TheGame::Instance()->GetGameStates()->pop();

				return;
			}

			Block* nextBlock = TheGame::Instance()->GetNextBlock();

			if (event.key.keysym.sym == SDLK_SPACE)
			{
				if (!nextBlock->CheckEntityCollision(LEFT) && !nextBlock->CheckEntityCollision(RIGHT) && !nextBlock->CheckEntityCollision(DOWN))
				{
					TheGame::Instance()->SwapBlock();
				}
			}

			Block* focusBlock = TheGame::Instance()->GetFocusBlock();

			if (event.key.keysym.sym == SDLK_UP)
			{
				if (!focusBlock->CheckRotationCollision())
				{
					focusBlock->Rotate();
				}
			}
			// TODO: Consolidate Wall and Entity Collision into a signle function for readability.

			if (event.key.keysym.sym == SDLK_LEFT)
			{
				left_is_pressed = true;
				if (!focusBlock->CheckWallCollision(LEFT) && !focusBlock->CheckEntityCollision(LEFT))
				{
					focusBlock->Move(LEFT);
				}
			}
			if (event.key.keysym.sym == SDLK_RIGHT)
			{
				right_is_pressed = true;
				if (!focusBlock->CheckWallCollision(RIGHT) && !focusBlock->CheckEntityCollision(RIGHT))
				{
					focusBlock->Move(RIGHT);
				}
			}
			if (event.key.keysym.sym == SDLK_DOWN)
			{
				down_is_pressed = true;
				if (!focusBlock->CheckWallCollision(DOWN) && !focusBlock->CheckEntityCollision(DOWN))
				{
					focusBlock->Move(DOWN);
				}
			}
		}
	}
}