2014-10-08 71 views
1

我正在爲2個玩家編寫一個簡單的遊戲,他們必須在彼此之後輪流 - 選擇一些物體從棋盤上移除(移除實際上是將一個ImageView設置爲不可見),然後一個玩家按下「End turn」最終將轉身傳遞給另一名球員。如何在遊戲中轉向AI?

該板是GridLayoutImageView S,所有ImageView■找onClickListener(),以及他們在比賽一開始所有可見。玩家點擊幾個ImageView(在這些時刻,他們的ID被放置在一個數組中),然後點擊「結束轉彎」,分析他的移動陣列,將相應的ImageView設置爲不可見,之後轉彎被傳遞給另一個玩家(陣列被清理並且當前玩家的號碼改變)。

板上的所有物體都附有onClickListeners()。點擊後,他們的ID被放置在一個數組中,並且一個變量包含當前玩家的號碼。在「End turn」按鈕上連接的onClickListener()上的方法被切換爲onClick()方法,它只是清除ID的數組並更新當前播放器的編號。

它適用於2人玩的情況(在同一設備上)。但是如果一個人玩電腦,AI會計算並採用相同的onClick()方法。由於用戶界面僅在處理onClick()後才更新,因此(ImageView被設置爲不可見等),AI的移動不會在屏幕上繪製,並且播放器看起來好像在移動之後(點擊對象),板子隨着計算機的移動(刪除對象)所做的更改立即重新繪製。

所以,我需要以不同的方式通過輪到AI,而不是在「End turn」按鈕的onClick(),以便能夠繪製AI的選擇並隱藏選定的視圖 - 在玩家可以進行下一步之前。 但如何做到這一點,在哪裏?爲「結束轉彎」按鈕

onClick()方法:

public void onClick(View v) { 
    hideSelectedImageViews(); 
    if (currentGame.isWinningState()) { 
     //you won 
    } else { 
     changePlayer(); 
     if (playWithAI) { 
      calculateAImove(currentGame); 
      showSelectedImageViewsByAI(); //doesn't work even with .invalidate() 
      hideSelectedImageViews(); 
      if (currentGame.isWinningState()) { 
        //AI won 
      } 
      changePlayer(); 
     } 
    } 
} 

showSelectedImageViewsByAI(),特定圖像資源被設定爲ImageView S,使得它們看起來不一樣(「選擇」)。

+0

發佈您的代碼/流程/圖表/繪圖會很有幫助。 – 2014-10-08 21:21:32

+0

請發佈您的代碼。嘗試 。invalidate()「board」 – 2014-10-08 21:38:21

回答

0

您可以創建一個新的Thread它將運行AI的移動,當AI進行選擇時,您可以讓線程延遲幾秒(以便顯示它們的選擇),然後移除它們。你的代碼有問題,一旦AI進行選擇,它的瞬間(即使你沒有invalidate()兩次)

如果你不熟悉這裏的線程是一個例子刪除:

//I assume your code was inside an Activity 
public class mainActivity extends Activity implements Runnable 
{ 
    Thread aiThread; 

    /*...*/ 

    public void onClick(View v) 
    { 
     hideSelectedImageViews(); 
     if (currentGame.isWinningState()) { /*you won*/ } 
     else 
     { 
      changePlayer(); 
      if (playWithAI) 
      { 
       aiThread = new Thread(this); 
       aiThread.start(); 
      } 
     } 
    } 

    public void run() 
    { 
     calculateAImove(currentGame); 
     showSelectedImageViewsByAI(); 
     Thread.sleep(1000); //This will make thread wait for 1 second before removing selected (note the number is in milliseconds) 
     hideSelectedImageViews(); 
     if (currentGame.isWinningState()) { /*AI won*/ } 
     changePlayer(); 
    } 
} 

請注意,當使用線程來影響用戶界面時,您不應該直接影響視圖,您應該改爲撥打view.post(),如果您不熟悉Threadsview.post()方法,我建議您在線搜索它們。

+0

您的想法對我來說非常有用,我將它實現爲AsyncTask:在執行之前,它將按鈕「End turn」設置爲不可見,執行計算並在UI線程中發佈進度,設置必要的ImageViews「選定「的延遲。在onPostExecute()方法中,ImageViews隱藏在UI線程中並且玩家被更改。這讓我不用手動編寫線程的任何操作。謝謝你的回答! – Vera 2014-10-09 10:25:54

+0

@維拉我很高興能幫上忙! :) – TomTsagk 2014-10-09 12:22:09