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; }
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); } } } } }