我正在制作一个 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);
}
}