当另一个方法在Windows窗体中结束时调用方法

时间:2012-09-08 07:32:51

标签: c# .net winforms

我正在制作一个tictactoe游戏,你可以在那里与另一个人或AI玩游戏。两个人工智能也可以互相对抗。当两个AI相互对战时,我得到了一个stackover流程,防护页面错误。

发生了什么,当AI点击一个按钮时,我的“ClickHandler”方法就会被调用。在这个方法结束时,我会用calla方法(playATurn)让其他玩家选择一个按钮并再次调用“ClickHandler”,我会有一个无休止的递归。

我已经在方法结束时使用定时器解决了这个问题,该方法在1ms后调用“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);
    }
}

1 个答案:

答案 0 :(得分: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应该响应......几乎。