我正在製作一個tictactoe遊戲,您可以在其中玩別人或AI。兩個AI也可以相互對抗。當兩個AI對戰時,我得到了一個疊加流,守衛頁錯誤。當另一個方法在Windows窗體中結束時調用方法
發生了什麼,當AI點擊一個按鈕時,我的「ClickHandler」方法會被調用。在這個方法的最後,我會爲另一個玩家選擇一個按鈕並且再次調用「ClickHandler」的calla方法(playATurn),並且我會有一個無限的遞歸。
我已經解決了這個問題,在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);
}
}
我不太清楚你的意思。您可以將playATurn(sender,e)放在方法ClickHandler()的末尾。 –
如果我這樣做,我會得到無盡的遞歸和一個計算器。由於我playATurn調用ClickHandler()。 –