void CAIThread::ComputeMove() { if ( m_pDoMove == NULL ) { SelectMove(); } if ( PrepareMove() ) { ( this->*m_pDoMove )(); SendMove(); } }
void BattleForm::ReSetMoves(QList<QString>moves) { QLayoutItem * child; while((child = ui->MoveLayout->takeAt(0)) != 0) { ui->MoveLayout->removeItem(child); delete child->widget(); } int i = 0; foreach(QString move, moves) { QPushButton * btn = new QPushButton(); btn->setText(move); connect(btn,SIGNAL(clicked()),this,SLOT(SendMove())); ui->MoveLayout->addWidget(btn,i,0); i++; }
int MatchCSA::MatchNetwork(){ /************************************************ 通信連続対局 ************************************************/ #ifdef WIN32 HANDLE hTh_r; // レシーブスレッド HANDLE hTh_e; // 相手番思考スレッド #else pthread_t tid_r; // レシーブスレッド pthread_t tid_e; // 相手番思考スレッド #endif // スレッドを沸かしたかどうか bool bTh_r = false; // レシーブスレッド bool bTh_e = false; // 相手番思考スレッド bool started; int i; LoadConfig(); for( i = 0 ; i < repeat ; i++ ){ started = false; // 定刻まで待機 cout << "Waiting.." << '\n'; if( !Timer() ){ // 打ち切り cout << "Stop!" << '\n'; return 1; } // フラグを下げる。 rflag = 0U; // 接続 if( !Connect() ){ return 0; } cout << "Connected." << '\n'; // 受信スレッドを沸かす。 #ifdef WIN32 if( INVALID_HANDLE_VALUE != ( hTh_r = (HANDLE)_beginthreadex( NULL, 0, ReceiveThread, (LPVOID)this, 0, NULL ) ) ){ #else if( 0 == pthread_create( &tid_r, NULL, ReceiveThread, (void*)this ) ){ #endif bTh_r = true; } // ログイン if( !Login() ){ Disconnect(); return 0; } cout << "Login OK." << '\n'; // 対局条件取得 if( !GetRecFlag( MATCH_CSA_SUMMARY ) ){ goto lab_logout; } #if USE_QUICKCOPY pcons->PresetTrees( pshogi ); #endif // 対局開始 if( !SendAgree() ){ goto lab_logout; } started = true; MutexLock(); cout << "Start." << '\n'; MutexUnlock(); // 開始時刻 start.setNow(); end = start; while( 1 ){ // 局面の表示 #if POSIX pshogi->PrintBan( true ); #else pshogi->PrintBan(); #endif #ifndef NDEBUG // Debug用棋譜出力 OutputFileCSA( "debug.csa" ); #endif if( pshogi->GetSengo() == info.sengo ){ // 自分の手番 THINK_INFO think_info; MOVE move; int ret; int l; memset( &think_info, 0, sizeof(THINK_INFO) ); // 思考時間 l = limit; // 時間制限あり if( atime.IsValidSetting() ){ // 秒読みあり if( atime.GetReadingOffSeconds() > 0 ){ // 秒読みも含めた残り時間を超えようとしている場合 if( atime.GetUsableTime() <= (double)limit ){ l = (int)( atime.GetUsableTime() - 1.0 ); } } // 切れ負け else{ // 持ち時間の20分の1を上限 if( atime.GetRemainingTime() < limit * 20.0 ){ l = (int)( atime.GetRemainingTime() / 20.0 ) + 1; } } } else{ cout << "unlimited.\n"; } // 乱数合議用正規乱数の偏差 pcons->SetDeviation( deviation ); // 探索 if( limit_node != U64(0) ){ pcons->SetNodeLimit( limit_node ); } pcons->SetLimit( l ); ret = pcons->SearchLimit( pshogi, pbook, &move, depth, &think_info, Think::SEARCH_DISP | Think::SEARCH_EASY ); pcons->UnsetLimit(); if( limit_node != U64(0) ){ // UnsetNodeLimitは無条件で読んでも良い。 pcons->UnsetNodeLimit(); } #ifndef NDEBUG Debug::Print( "split=%u, split_failed=%u, unused_tree=%u\n", (unsigned)think_info.split, (unsigned)think_info.split_failed, (unsigned)think_info.unused_tree ); #endif // 時間切れなど if( rflag & MATCH_CSA_MASK_END ){ SetResult(); goto lab_logout; } // 投了 if( ret == 0 || resign.bad( think_info ) ){ SendToryo(); SetResult( RES_LOSE ); goto lab_logout; } if( pshogi->MoveD( move ) ){ // 指し手の送信 if( !SendMove( &think_info ) ){ SetResult( RES_ERR ); goto lab_logout; } } else{ // 投了 SendToryo(); SetResult( RES_LOSE ); goto lab_logout; } } else{ // 相手の手番 unsigned rec; // 相手番思考を開始 // 思考スレッドを沸かす。 #if 1 eflag = 0; if( enemyTurnSearch && #ifdef WIN32 INVALID_HANDLE_VALUE != ( hTh_e = (HANDLE)_beginthreadex( NULL, 0, EnemyTurnSearchThread, (LPVOID)this, 0, NULL ) ) #else 0 == pthread_create( &tid_e, NULL, EnemyTurnSearchThread, (void*)this ) #endif ){ bTh_e = true; } #endif // 相手の手を待つ。 rec = GetRecFlag( MATCH_CSA_MASK_MOVE | MATCH_CSA_MASK_END ); // 相手番思考を終了 // スレッドの終了を待つ。 #if 1 eflag = 1; if( bTh_e ){ #ifdef WIN32 WaitForSingleObject( hTh_e, INFINITE ); CloseHandle( hTh_e ); #else pthread_join( tid_e, NULL ); #endif bTh_e = false; } #endif if( rec & MATCH_CSA_MASK_MOVE ){ // 相手の指し手の読み込み if( pshogi->InputLineCSA( MoveStrEnemy() ) ){ InputTime( MoveStrEnemy() ); // 消費時間 } else{ // 反則手? if( GetRecFlag( MATCH_CSA_MASK_END ) ){ // 反則などで終了 goto lab_logout; } else{ // 原因不明のトラブル(?) goto lab_logout; } } } else{ // 終局 or 中断 goto lab_logout; } } // 指し手の表示 pshogi->PrintMove( true ); } lab_logout: // 相手番思考を終了 eflag = 1; if( bTh_e ){ #ifdef WIN32 WaitForSingleObject( hTh_e, INFINITE ); CloseHandle( hTh_e ); #else pthread_join( tid_e, NULL ); #endif bTh_e = false; } // ログアウト Logout(); cout << "Logout." << '\n'; // 切断 Disconnect(); cout << "Disconnected." << '\n'; // スレッドの終了を待つ。 if( bTh_r ){ #ifdef WIN32 WaitForSingleObject( hTh_r, INFINITE ); CloseHandle( hTh_r ); #else pthread_join( tid_r, NULL ); #endif bTh_r = false; } // 終了時刻 end.setNow(); // 結果の記録 if( started ){ WriteResult( i ); } } return 1; } #ifdef WIN32 unsigned __stdcall MatchCSA::EnemyTurnSearchThread( LPVOID p ){ #else void* MatchCSA::EnemyTurnSearchThread( void* p ){ #endif /************************************************ 相手番で探索をするスレッド ************************************************/ MatchCSA* pmatchCSA = (MatchCSA*)p; THINK_INFO info; pmatchCSA->pcons->EnemyTurnSearch( pmatchCSA->pshogi, NULL, MAX_DEPTH, &info, &pmatchCSA->eflag, Think::SEARCH_DISP ); #ifdef WIN32 return 0; #else return NULL; #endif }