我正在制作一个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);
}
}
答案 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应该响应......几乎。