0

我正在制作一个 tictactoe 游戏,您可以在其中与另一个人或 AI 对战。两个 AI 也可以互相对战。当两个 AI 互相对战时,我得到一个 stackover flow,保护页面错误。

发生的事情是,当 AI 单击按钮时,我的“ClickHandler”方法将被调用。在这个方法结束时,我会调用一个方法(playATurn),让其他玩家选择一个按钮,然后再次调用“ClickHandler”,我会有一个无休止的递归。

我已经在方法结束时使用计时器解决了这个问题,该方法在 1 毫秒后调用“playATurn”,但这很慢。

我的问题是在我的程序完成“ClickHandler”之后,我可以编写一个事件或其他东西来调用“playATurn”。

谢谢!

private void ClickHandler(object sender, System.EventArgs e)
{
    Button tempButton = (Button)sender;

    if (tempButton.Text != "")  // if is it empty
    {
        MessageBox.Show("Button already has value!", "ERROR", MessageBoxButtons.OK);
        return;
    }

    if (_isX)   // put the character in the Text property
    {
        tempButton.Text = "X";
        turn.Text = "O";
    }
    else
    {
        tempButton.Text = "O";
        turn.Text = "X";
    }
    _isX = !_isX;   // prepare for next character

    this._isGameOver = CheckAndProcessWinner();
    if (_isGameOver) gamesRemaining.Text = (--PlayerMenu.counterForNumberOfGames).ToString();
    if (_isGameOver && PlayerMenu.counterForNumberOfGames == 0)
    {
        MessageBox.Show(playerOne.name + " Wins: " + playerOne.numberOfWins + " Loses: " + playerOne.numberOfLoses + " Ties: " + playerOne.numberOfTies);
    }
    else if (_isGameOver && PlayerMenu.counterForNumberOfGames > 0)
    {
        InitTicTacToe();
    }
    else if (!_isGameOver && PlayerMenu.counterForNumberOfGames > 0)
    {
        if (_isX)
            playerOne.pickMove(_buttonArray, playerTwo);
        else
            playerTwo.pickMove(_buttonArray, playerOne);
    }
    myTimer.Start();
}

private void playATurn(object sender, System.EventArgs e)
{
    if (!_isGameOver && PlayerMenu.counterForNumberOfGames > 0)
    {
        if (_isX)
            playerOne.pickMove(_buttonArray, playerTwo);
        else
            playerTwo.pickMove(_buttonArray, playerOne);
    }
}
4

1 回答 1

2

您不想运行太紧,或者 Windows 消息循环想要运行并且它不会更新。也许考虑:

private void PerformMove() {
    // ... Your existing code
    if(runAgain) {
        this.BeginInvoke((MethodInvoker)delegate{
            PerformMove();
        });
    }
}
private void ClickHandler(object sender, System.EventArgs e) {
    PerformMove();
}

然后通过每次迭代的消息循环进行,因此 UI 应该是响应式的……差不多。

于 2012-09-08T07:44:31.550 回答