信号发射后如何继续?

时间:2017-02-02 17:18:28

标签: qt qml signals qtquick2

我在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();
    }
} 

1 个答案:

答案 0 :(得分:1)

由于这是一个回合制游戏,你只需要一个不同的来源来触发下一个回合。

不是直接调用flipTurn(),而是通过Qt的事件循环调用它。

因为您可能希望计算机前的人看到游戏进展,很可能会有延迟。

例如使用单发计时器

// instead of calling flipTurn() directly
QTimer::singleShot(500, this, SLOT(flipTurn()));

flipTurn()毫秒后调用下一个500