2012-04-18 5 views
-1

私はAndroid用のTicTacToeゲームを作成しました。ユーザーのターンかAndroidのターンのように、今度のターンが向いている画面に表示したい。 これは機能しているupdateGameInfo関数を作成しましたが、私はこの関数をどこで表示して適切な出力を得るべきかを決めることができません。 ありがとうございました。 はここ..ここイベントの変化が起こらない

 private void btnClicked(int i) { 
    if(c[i]!=0) { 
    Toast toast = Toast.makeText(getApplicationContext(), "Position occupied", Toast.LENGTH_SHORT); 
    toast.show(); 
} 
else { 
    //all OK 
    c[i] = 2; 
    updateBtn(i); 
    updateGameInfo(Player + " turn.");<---every time you are updating the value on button call updategameinfo... 
    .... 
    //remaining code... 

とも..私はあなたがこの後にupdateGameInfo部分を置くことができると思い、私のコード

public class Game extends Activity { 
private final int GAME_VICTORY = 0x1; 
private final int GAME_DEFEAT = 0x2; 
private final int GAME_TIE = 0x3; 
private final int GAME_CONTINUES = 0x4; 
private final float UNIQUE_MAX_WEIGHT=0.85f; 
static final int ACTIVITY_SELECTION = 1; 
private int x_Player_win_counter; 
private int o_Player_win_counter; 
public static TextView textlevel=null; 
public static TextView textlevel1=null; 
public static TextView textlevel2=null; 
public static TextView textlevel3=null; 
public double userBest_Time=0; 
public double cpuBest_Time=0; 
public double startTime; 
long prev_Time=0; 
double userDuration; 
double cpuDuration; 
private float[] w; 
private int[] c;   
private int[][] PosTable; 
private Button[] buttons; 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.game); 
    buttons = new Button[9]; 
    buttons[0] = (Button) findViewById(R.id.Button01); 
    buttons[0].setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      btnClicked(0); 
     } 
    }); 
    buttons[1] = (Button) findViewById(R.id.Button02); 
    buttons[1].setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      btnClicked(1); 
     } 
    }); 
    buttons[2] = (Button) findViewById(R.id.Button03); 
    buttons[2].setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      btnClicked(2); 
     } 
    }); 
    buttons[3] = (Button) findViewById(R.id.Button04); 
    buttons[3].setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      btnClicked(3); 
     } 
    }); 
    buttons[4] = (Button) findViewById(R.id.Button05); 
    buttons[4].setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      btnClicked(4); 
     } 
    }); 
    buttons[5] = (Button) findViewById(R.id.Button06); 
    buttons[5].setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      btnClicked(5); 
     } 

    }); 
    buttons[6] = (Button) findViewById(R.id.Button07); 
    buttons[6].setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      btnClicked(6); 
     } 
    }); 
    buttons[7] = (Button) findViewById(R.id.Button08); 
    buttons[7].setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      btnClicked(7); 
     } 
    }); 
    buttons[8] = (Button) findViewById(R.id.Button09); 
    buttons[8].setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      btnClicked(8); 
     } 
    }); 

    startActivityForResult(new Intent(Game.this, Game.class), ACTIVITY_SELECTION); 


    DisplayMetrics dm = getApplicationContext().getResources().getDisplayMetrics(); 
    float h = (float) (dm.heightPixels - (100.0)*dm.density); 
    float w = dm.widthPixels; 
    for(int i=0;i<9;i++) { 
     buttons[i].setHeight((int) (h/3)); 
     buttons[i].setWidth((int) (w/3)); 
    } 
} 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    beginPlay(); 
    if (requestCode == ACTIVITY_SELECTION) { 
     if (resultCode == RESULT_OK) { 
      Bundle extras = data.getExtras(); 
      if (extras.getString("result").equals("CPU")) cpuPlay(); 
     } 
    } 
} 
public void userGame() { 
    new AlertDialog.Builder(this) 
    .setTitle("User Won!!!") 
    .setMessage("want to start another game") 
    .setIcon(android.R.drawable.ic_dialog_alert) 
    .setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int which) 
     { 

      buttonsEnable(true); 
      beginPlay(); 
     } 
    }) 
    .setNegativeButton("No", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int which) 
     { 
      finish(); 
     } 
    }) 
    .show(); 


} 

public void cpuGame() { 
    new AlertDialog.Builder(this) 
    .setTitle("Android Won!!!") 
    .setMessage("want to start another game") 
    .setIcon(android.R.drawable.ic_dialog_alert) 
    .setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int which) 
     { 

      buttonsEnable(true); 
      beginPlay(); 
     } 
    }) 
    .setNegativeButton("No", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int which) 
     { 
      finish(); 
     } 
    }) 
    .show(); 


} 

public void tieGame() { 
    new AlertDialog.Builder(this) 
    .setTitle("TIE!!!") 
    .setMessage("want to start another game") 
    .setIcon(android.R.drawable.ic_dialog_alert) 
    .setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int which) 
     { 

      buttonsEnable(true); 
      beginPlay(); 
     } 
    }) 
    .setNegativeButton("No", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int which) 
     { 
      finish(); 
     } 
    }) 
    .show(); 


} 


private void beginPlay() { 
    //initializations start 
    w=new float[9]; 
    c=new int[9]; 
    InitTable(); 
    w[0]=0.7f; 
    w[1]=0.4f; 
    w[2]=0.7f; 
    w[3]=0.4f; 
    w[4]=0.7f; 
    w[5]=0.4f; 
    w[6]=0.7f; 
    w[7]=0.4f; 
    w[8]=0.7f; 
    //c[i] : 0 for empty, 1 for cpu, 2 for user 
    for(int i=0;i<9;i++) 
     c[i]=0; 
    //initializations done 

    //now we play! 
     startTime = System.currentTimeMillis(); 
     textlevel=(TextView)findViewById(R.id.userInfo); 
     textlevel.setText(String.valueOf(x_Player_win_counter)); 

     textlevel1=(TextView)findViewById(R.id.cpuInfo); 
     textlevel1.setText(String.valueOf(o_Player_win_counter)); 
    for(int i=0;i<9;i++) 
     {  
     updateBtn(i); 
     buttons[i].setTextColor(Color.BLACK); 
     } 
    String PlayerName="User";  
    updateGameInfo(PlayerName + " turn."); 
} 
private void cpuPlay() { 
    //computer plays first 
    int cpos=getDecision(); 
    if (cpos == -1) { 
     Toast toast = Toast.makeText(getApplicationContext(), "GAME OVER", Toast.LENGTH_SHORT); 
     toast.show(); 
     return; 
    } 
    c[cpos]=1; 
    updateBtn(cpos); 
    int gstatus = CheckGameStatus(); 
    if (gstatus == GAME_VICTORY) { 
     userDuration = (System.currentTimeMillis() - startTime)/1000; 
     Toast toast = Toast.makeText(getApplicationContext(), "Congrts You Won in " + userDuration + " seconds", Toast.LENGTH_SHORT); 
     toast.show(); 
     ++x_Player_win_counter; 
     userGame(); 
    } 
    else if (gstatus == GAME_DEFEAT) { 
     cpuDuration = (System.currentTimeMillis() - startTime)/1000; 
     Toast toast = Toast.makeText(getApplicationContext(), "Sorry, Android Won in " + cpuDuration + " seconds", Toast.LENGTH_SHORT); 
     toast.show(); 
     ++o_Player_win_counter; 
     cpuGame(); 
    } 
    else if (gstatus == GAME_TIE) { 
     Toast toast = Toast.makeText(getApplicationContext(), "Its a TIE", Toast.LENGTH_SHORT); 
     toast.show(); 
     tieGame(); 
    } 
    else if (gstatus == GAME_CONTINUES) { 
     //user plays 
    } 
} 
private void updateBtn(int i) { 
    if(c[i]==0) 
     buttons[i].setText(" "); 
    else if(c[i]==1) 
     { 
     String PlayerName="Android";   
     updateGameInfo(PlayerName + " turn."); 
     try { 
      Thread.sleep(500); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     buttons[i].setText("O"); 
     buttons[i].setTextColor(Color.RED); 

     } 
    else 
     { 
     String PlayerName="User";  
     updateGameInfo(PlayerName + " turn."); 
     buttons[i].setText("X"); 

     } 
} 
private int CheckGameStatus() { 
    int s = 0; 
    //check horizontal 
    if(c[0]==2&&c[1]==2&&c[2]==2) {s = GAME_VICTORY;} 
    if(c[3]==2&&c[4]==2&&c[5]==2) {s = GAME_VICTORY;} 
    if(c[6]==2&&c[7]==2&&c[8]==2) {s = GAME_VICTORY;} 
    if(c[0]==1&&c[1]==1&&c[2]==1) {s = GAME_DEFEAT;} 
    if(c[3]==1&&c[4]==1&&c[5]==1) {s = GAME_DEFEAT;} 
    if(c[6]==1&&c[7]==1&&c[8]==1) {s = GAME_DEFEAT;} 
    //check vertical 
    if(c[0]==2&&c[3]==2&&c[6]==2) {s = GAME_VICTORY;} 
    if(c[1]==2&&c[4]==2&&c[7]==2) {s = GAME_VICTORY;} 
    if(c[2]==2&&c[5]==2&&c[8]==2) {s = GAME_VICTORY;} 
    if(c[0]==1&&c[3]==1&&c[6]==1) {s = GAME_DEFEAT;} 
    if(c[1]==1&&c[4]==1&&c[7]==1) {s = GAME_DEFEAT;} 
    if(c[2]==1&&c[5]==1&&c[8]==1) {s = GAME_DEFEAT;} 
    //check diagonal 
    if(c[0]==2&&c[4]==2&&c[8]==2) {s = GAME_VICTORY;} 
    if(c[2]==2&&c[4]==2&&c[6]==2) {s = GAME_VICTORY;} 
    if(c[0]==1&&c[4]==1&&c[8]==1) {s = GAME_DEFEAT;} 
    if(c[2]==1&&c[4]==1&&c[6]==1) {s = GAME_DEFEAT;} 

    if (s != 0) { 
     buttonsEnable(false); 
     return s; 
    } 

    boolean box_empty = false; 
    for(int i=0;i<9;i++) { 
     if (c[i] == 0) box_empty = true; 
    } 
    if (box_empty) { //if any box is empty -> game continues 
     return GAME_CONTINUES; 
    } 
    else { //else there is tie 
     buttonsEnable(false); 
     return GAME_TIE; 
    } 
} 

private void buttonsEnable(boolean b) { 
    for(int i=0;i<9;i++) 
     buttons[i].setEnabled(b); 
} 

private void btnClicked(int i) { 
    if(c[i]!=0) { 
     Toast toast = Toast.makeText(getApplicationContext(), "Position occupied", Toast.LENGTH_SHORT); 
     toast.show(); 
    } 
    else { 
     //all OK 
     c[i] = 2; 
     updateBtn(i); 
     int gstatus = CheckGameStatus(); 
     if (gstatus == GAME_VICTORY) { 
      userDuration = (System.currentTimeMillis() - startTime)/1000; 
      Toast toast = Toast.makeText(getApplicationContext(), "Congrats You Won in " + userDuration + " seconds", Toast.LENGTH_SHORT); 
      toast.show(); 
      ++x_Player_win_counter; 
      userGame(); 
     } 
     else if (gstatus == GAME_DEFEAT) { 
      cpuDuration = (System.currentTimeMillis() - startTime)/1000; 
      Toast toast = Toast.makeText(getApplicationContext(), "Sorry, Android Won in " + cpuDuration + " seconds", Toast.LENGTH_SHORT); 
      toast.show(); 
      ++o_Player_win_counter; 
      cpuGame(); 
     } 
     else if (gstatus == GAME_TIE) { 
      Toast toast = Toast.makeText(getApplicationContext(), "Its a TIE", Toast.LENGTH_SHORT); 
      toast.show(); 
      tieGame(); 
     } 
     else if (gstatus == GAME_CONTINUES) { 
      cpuPlay(); 
     } 
    } 
} 

private int getDecision() { 
    String Player="Android"; 
// updateGameInfo(Player + " turn."); 
    try { 
     Thread.sleep(500); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
    for(int i=0;i<9;i++) 
     for(int j=0;j<9;j++) { 
      if(c[i]==1&&c[j]==1) //place 'o' to win 
       if(PosTable[i][j]!=-1) //if we have 3 in a row 
        if(c[PosTable[i][j]]==0) //if position is free 
         return PosTable[i][j]; 
      if(c[i]==2&&c[j]==2) //place 'o' to prevent user's victory 
       if(PosTable[i][j]!=-1) //if we have 3 in a row 
        if(c[PosTable[i][j]]==0) //if position is free 
         return PosTable[i][j]; 
     } 

    if(c[0]==1&&c[8]==0) return 8; 
    if(c[2]==1&&c[6]==0) return 6; 
    if(c[8]==1&&c[0]==0) return 0; 
    if(c[6]==1&&c[2]==0) return 2; 
    Random r=new Random(); 
    boolean exist07=false; 
    boolean[] free=new boolean[9]; //will hold the free positions 
    for(int i=0;i<9;i++) 
     free[i]=false; 
    for(int i=0;i<9;i++) 
     if(c[i]==0) { //free ?? 
      free[i]=true; //add position to free 
      if(w[i]==UNIQUE_MAX_WEIGHT) return i; 
     } 
    //more than 1 positions with same weight 
    for(int i=0;i<9;i++) 
     if(free[i]) //if position is free 
      if(w[i]==0.7f) exist07=true; 
    if(exist07) 
     for(int i=0;i<9;i++) 
      if(free[i]) //if position is free 
       if(w[i]==0.4f) free[i]=false; 

    int j=0; 
    int rn=0; 
    int[] tmp; 
    for(int i=0;i<9;i++) 
     if(free[i]) j++; 
    if(j!=0) { 
     tmp=new int[j]; 
     rn=r.nextInt(j); 
     j=0; 
     for(int i=0;i<9;i++) 
      if(free[i]) tmp[j++]=i; 
     return tmp[rn]; 
    } 
    else { 
     return -1; //else GAME OVER 
    } 
} 
private void InitTable() { 

    PosTable=new int[9][9]; 
    for(int i=0;i<9;i++) 
     for(int j=0;j<9;j++) 
      PosTable[i][j]=-1; 
    PosTable[0][1]=2; 
    PosTable[0][2]=1; 
    PosTable[0][3]=6; 
    PosTable[0][4]=8; 
    PosTable[0][6]=3; 
    PosTable[0][8]=4; 
    PosTable[1][2]=0; 
    PosTable[1][4]=7; 
    PosTable[1][7]=4; 
    PosTable[2][4]=6; 
    PosTable[2][5]=8; 
    PosTable[2][6]=4; 
    PosTable[2][8]=5; 
    PosTable[3][4]=5; 
    PosTable[3][5]=4; 
    PosTable[3][6]=0; 
    PosTable[4][5]=3; 
    PosTable[4][6]=2; 
    PosTable[4][7]=1; 
    PosTable[4][8]=0; 
    PosTable[5][8]=2; 
    PosTable[6][7]=8; 
    PosTable[6][8]=7; 
    PosTable[7][8]=6; 

} 
private void updateGameInfo(String info) 
{ 
    TextView infoView =(TextView) findViewById(R.id.gameInfo); 
    infoView.setText(info); 
} 

}

答えて

1

ねえ、あなたを変更しますbtnClicked内のgame_contiuesのコード

String name= "Android"; 
      updateGameInfo("Wait it's" + name + " turn"); 
      new Handler().postDelayed(new Runnable() { 

       @Override 
       public void run() { 
        cpuPlay(); 
       } 
      },500); 

これはあなたの問題

1

 private void cpuPlay() { 
    //computer plays first 
    int cpos=getDecision(); 
    if (cpos == -1) { 
    Toast toast = Toast.makeText(getApplicationContext(), "GAME OVER", Toast.LENGTH_SHORT); 
     toast.show(); 
    return; 
    } 
    c[cpos]=1; 
    updateBtn(cpos); 
    updateGameInfo(Player + " turn.");<----- 
    //remaining code here... 
+0

おかげでチームメイトのテキストを設定したいところはどこでも、これは実際に働いているが、実際に、それはとても速く、そのコンピュータドン」が起こりますそのフィールドを更新する時間を得る。だから、私はcpuPlay()の前にsleep()メソッドを実装しようとしましたが、両方ともユーザーとアンドロイドを一緒にして一緒に目を覚ますためにスリープ状態になりますので、コンピュータは更新する時間がありません。 sleep()を使う方法を教えてもらえますか、wait()を使う必要がありますか?ありがとうございました –

+0

あなたはこの行の後でsleepを使うことができます.. updateGameInfo(Player + "turn。"); <----- ..私の答えの最後の行...しかし、ここでは..その後CPUの再生後..わずか1秒後にスレッドがその時間のためにスリープし、タッチのような入力を取ることができないので... – 5hssba

+0

助けをもう一度感謝、それは睡眠を使用して動作していない両方のメソッドが同じスレッドによって実行されているため、両方のメソッドをスリープ状態にします。しかし、私はハンドラを使用して解決策を得ているので問題はありません。 –

1

使用ハンドラ無愛想な整理はあなたがゲームを保持し、

関連する問題