2016-04-17 10 views
-1

私はAndroidでTic-Tac-Toeゲームを作っています。私のゲームはうまく走っていますが、私はそれに問題があります。ユーザーがタイルをタッチするとUIが更新され、ComputerPlay()メソッドが呼び出されます。しかし、UIはComputerPlay()メソッドが完了した後にのみ更新されます。私はどうやって、すみません、私の英語は悪く、答えを探す方法がわかりません。メソッドの開始前にAndroid UIが更新されていません

@Override 
public boolean onTouch(View v, MotionEvent event) { 
    switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      if (currentTurn == Constants.HUMAN && board.isEmptyCell(r, c)) {          
        //update the UI 
        v.setBackgroundResource(R.drawable.cell_touched); 
      } 
      return true; 
     case MotionEvent.ACTION_UP: 
      if (currentTurn == Constants.HUMAN && board.isEmptyCell(r, c)) {         
       //update the tile where user touched 
       v.setBackgroundResource(R.drawable.cell_normal); 
       board.makeMove(r, c, currentTurn, options.getHumanPiece()); 

       if (board.checkWinner(currentTurn)) {//if user wins 
        win++; 
        tvWin.setText(String.format("Win: %d", win)); 
        tvNotice.setText(R.string.winNotice); 
       } else if (board.isFull()) { //if draw 
        draw++; 
        tvDraw.setText(String.format("Draw: %d", draw)); 
        tvNotice.setText(R.string.drawNotice); 
       } else { 
        // computer's turn 
        currentTurn = Constants.COMPUTER; 
        ComputerPlay(); 
       } 
      } 
      return true; 
    } 
    return false; 
} 

以下のコードでは、ユーザーがタイルをタッチすると、まずUIを更新してゲームの状態を確認します。ゲームが終了していない場合は、方法ComputerPlay()を呼び出します。しかし、問題は次のとおりです。ComputerPlay()メソッドが完了した後、UIが実際に更新されます(コンピュータの最善の移動を検索するのに時間がかかります)。 ComputerPlay()メソッドの開始前にUIを更新したい。これどうやってするの?

+0

ビューに変更を加えた後に 'v.invalidate()'を呼び出すだけです。 – NSimon

+0

@Nicolas Simon:私は 'v.setBackgroundResource(R.drawable.cell_normal)の後に' v.invalidate ); '? –

+0

またはafter board.MakeMove()の場合、この関数のビューで計算を増やしている場合 – NSimon

答えて

1

ComputerPlay()が長時間実行されていて、完了する前にUIを更新したい場合は、他のスレッドでComputerPlay()を実行する必要があります。

関連する問題