我在Qt quick和C ++中构建了一个奥赛罗游戏。
我使用QML对话框中的代码开始新游戏,当一个玩家是人类时,我等待输入。当两个玩家都是PC时,我面临的问题是GUI将等待插槽完成,在PC播放器中的插槽调用flipTurn()
(因为它是PC,没有输入等待),flipTurn
是递归的,因此GUI将阻塞直到游戏结束。
我想让它在每次移动后更新电路板。项目链接:
reversi project
myBroker.createGame(blacktypebutton.checkedButton.playertype,
whitetypebutton.checkedButton.playertype,
getBlackAlgo(),
getWhiteAlgo(),
getBlackDep(),
getWhiteDep());
console.log("finished creating game !");
void Broker::flipTurn()
{
if(someoneWon()){
emit gameEnd();
return;
}
emit updateBoard();
if (currentGame->getTurn() == Constants::BLACK){
currentGame->setTurn(Constants::WHITE);
if (currentGame->getWhitePlayer().getType() == Constants::PC){
currentGame->pcMove(Constants::WHITE);
flipTurn();
}
else
currentGame->updatePossible();
}
else{
currentGame->setTurn(Constants::BLACK);
if (currentGame->getBlackPlayer().getType() == Constants::PC){
currentGame->pcMove(Constants::BLACK);
flipTurn();
}
else
currentGame->updatePossible();
return;
}
emit updateBoard();
}
bool Broker::createGame(int blacktype, int whitetype, int blackalg, int whitealg, int blackdep, int whitedep)
{
currentGame = new Game(blacktype,whitetype,blackalg,whitealg,blackdep,whitedep);
currentGame->setGameBoard(&gameBoard);
updatePossible();
emit gameStart();
}
void Broker::onGameStart()
{
if(currentGame->getTurnType() == Constants::PC){
currentGame->pcMove(currentGame->getTurn());
cout<<"in ongamestart slot"<<endl;
flipTurn();
}
}
答案 0 :(得分:1)
由于这是一个回合制游戏,你只需要一个不同的来源来触发下一个回合。
不是直接调用flipTurn()
,而是通过Qt的事件循环调用它。
因为您可能希望计算机前的人看到游戏进展,很可能会有延迟。
例如使用单发计时器
// instead of calling flipTurn() directly
QTimer::singleShot(500, this, SLOT(flipTurn()));
在flipTurn()
毫秒后调用下一个500
。