Exemplo n.º 1
0
void CAIThread::ComputeMove()
{
	if ( m_pDoMove == NULL )
	{
		SelectMove();
	}
	if ( PrepareMove() )
	{
		( this->*m_pDoMove )();
		SendMove();
	}
}
Exemplo n.º 2
0
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++;
    }
Exemplo n.º 3
0
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
}