
I built a TicTacToe game for android. And i want that there should be some time gap or time difference between User's turn and Computer's turn. Mean i want like a sleep() or any other method should be invoked between User's turn and Computer's turn. But when i call Sleep() before cpuPlay() method or after userPlay() it makes sleep to both user and Android and both wake up together. I really tried very hard to find why it is making sleep() to both method together but i am unable to find. Please help me with this. Thanks in advance. Here's my code
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 double startTime;
double userDuration;
double cpuDuration;
private float[] w;
private int[] c;
private int[][] PosTable;
private Button[] buttons;
private int lineH = -1;
private int lineV = -1;
private int lineD = -1;
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()
{
int cpos=getDecision();
if (cpos == -1)
{
Toast toast = Toast.makeText(getApplicationContext(), "GAME OVER", Toast.LENGTH_SHORT);
toast.show();
return;
}
else
{
c[cpos]=1;
updateBtn(cpos);
String name= "user";
updateGameInfo(name + " turn");
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)
{
buttons[i].setText("O");
buttons[i].setTextColor(Color.RED);
}
else
{
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);
String name= "Android";
// updateGameInfo(name + " turn");
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) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
cpuPlay();
}
}
}
private int getDecision()
{
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)
{
Toast.makeText(this, info, Toast.LENGTH_SHORT).show();
TextView infoView =(TextView) findViewById(R.id.gameInfo);
infoView.setText(info);
}
If you are facing any programming issue, such as compilation errors or not able to find the code you are looking for.
Ask your questions, our development team will try to give answers to your questions.