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