2012-09-08 72 views
0

我正在製作一個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); 
    } 
} 
+0

我不太清楚你的意思。您可以將playATurn(sender,e)放在方法ClickHandler()的末尾。 –

+0

如果我這樣做,我會得到無盡的遞歸和一個計算器。由於我playATurn調用ClickHandler()。 –

回答

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應響應......快了。

+0

謝謝@Marc Gravell。 –

+0

函數clickhandler //我的現有代碼[代碼] this.BeginInvoke((MethodInvoker)代表 { playATurn(發件人,E); }); [/代碼] –

相關問題