Java Android:当睡眠或等待不起作用时,如何在方法中设置时间间隔
我为android开发了一款TictaToe游戏。我想在用户轮到和计算机轮到之间应该有一些时间间隔或时差。意思是我想在用户轮到和计算机轮到之间调用sleep()或任何其他方法。但当我在cpuPlay()方法之前或在userPlay()之后调用Sleep()时,它会使用户和Android都处于睡眠状态,并同时醒来。我真的很努力地想找到为什么它会同时使用sleep()和sleep()两种方法,但我找不到。请帮我做这个。 提前谢谢。 这是我的密码Java Android:当睡眠或等待不起作用时,如何在方法中设置时间间隔,java,android,multithreading,Java,Android,Multithreading,我为android开发了一款TictaToe游戏。我想在用户轮到和计算机轮到之间应该有一些时间间隔或时差。意思是我想在用户轮到和计算机轮到之间调用sleep()或任何其他方法。但当我在cpuPlay()方法之前或在userPlay()之后调用Sleep()时,它会使用户和Android都处于睡眠状态,并同时醒来。我真的很努力地想找到为什么它会同时使用sleep()和sleep()两种方法,但我找不到。请帮我做这个。 提前谢谢。 这是我的密码 public class Game extends A
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);
}
公共类游戏扩展活动
{
私人决赛整场胜利=0x1;
私人决赛整场比赛失败=0x2;
私人决赛整场比赛=0x3;
私人最终整场比赛继续=0x4;
专用最终浮子唯一最大重量=0.85f;
静态最终int活动_选择=1;
私人INTX_玩家_赢_计数器;
私人INTO_玩家_win_计数器;
公共静态TextView textlevel=null;
公共静态TextView textlevel1=null;
公共双启动时间;
双用户持续时间;
双重预算;
私人浮动[]w;
私有int[]c;
私人int[][]可邮递;
专用按钮[]按钮;
私有整数lineH=-1;
私有整数lineV=-1;
私有整型=-1;
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.game);
按钮=新按钮[9];
按钮[0]=(按钮)findViewById(R.id.Button01);
按钮[0]。setOnClickListener(新视图。OnClickListener(){
公共void onClick(视图v){
btnClicked(0);
}
});
按钮[1]=(按钮)findViewById(R.id.Button02);
按钮[1]。setOnClickListener(新视图。OnClickListener(){
公共void onClick(视图v){
btnClicked(1);
}
});
按钮[2]=(按钮)findViewById(R.id.Button03);
按钮[2]。setOnClickListener(新视图。OnClickListener(){
公共void onClick(视图v){
btnClicked(2);
}
});
按钮[3]=(按钮)findViewById(R.id.Button04);
按钮[3]。setOnClickListener(新视图。OnClickListener(){
公共void onClick(视图v){
btnClicked(3);
}
});
按钮[4]=(按钮)findViewById(R.id.Button05);
按钮[4]。setOnClickListener(新视图。OnClickListener(){
公共void onClick(视图v){
btnClicked(4);
}
});
按钮[5]=(按钮)findViewById(R.id.Button06);
按钮[5]。setOnClickListener(新视图。OnClickListener(){
公共void onClick(视图v){
btnClicked(5);
}
});
按钮[6]=(按钮)findViewById(R.id.Button07);
按钮[6]。setOnClickListener(新视图。OnClickListener(){
公共void onClick(视图v){
btnClicked(6);
}
});
按钮[7]=(按钮)findViewById(R.id.Button08);
按钮[7]。setOnClickListener(新视图。OnClickListener(){
公共void onClick(视图v){
btnClicked(7);
}
});
按钮[8]=(按钮)findViewById(R.id.Button09);
按钮[8]。setOnClickListener(新视图。OnClickListener(){
公共void onClick(视图v){
btnClicked(8);
}
});
startActivityForResult(新意图(Game.this,Game.class),活动选择);
DisplayMetrics dm=getApplicationContext().getResources().getDisplayMetrics();
浮点h=(浮点)(dm.高像素-(100.0)*dm.密度);
float w=dm.width像素;
对于(inti=0;i,如果您想要延迟一些代码,那么应该在处理程序中以延迟时间发布它。
这样,处理程序将等待给定的时间,然后执行给定的runnable
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
cpuPlay();
}
}, TIME_TO_WAIT_IN_MS);
如果你想延迟一些代码,你应该在处理程序中发布一个延迟时间。
这样,处理程序将等待给定的时间,然后执行给定的runnable
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
cpuPlay();
}
}, TIME_TO_WAIT_IN_MS);
如果在UI线程中执行Thread.sleep,则需要在线程中执行sleep,或者使用处理程序或异步任务。如果在UI线程中执行Thread.sleep,则需要在线程中执行sleep,或者使用处理程序或异步任务。如果需要代码示例,请使用处理程序是的
Handler().postDelayed(new Runnable()
{
@Override
public void run() {
cpuPlay();
}
}, TIME_TO_WAIT_IN_MS);`
使用Handler。如果您想要这里的代码示例,它就是
Handler().postDelayed(new Runnable()
{
@Override
public void run() {
cpuPlay();
}
}, TIME_TO_WAIT_IN_MS);`
这是因为两个方法都由同一个线程运行,所以sleep()在这里不起作用。您必须使用处理程序来等待系统运行。这是因为两个方法都由同一个线程运行,所以sleep()不起作用在这里不起作用。你必须在你想等待系统的任何地方使用Handler嘿,我也尝试过,但没有得到,所以请你详细说明一下。嘿,我也尝试过,但没有得到,所以请你详细说明一下。