Java 在android应用程序中实现延时

Java 在android应用程序中实现延时,java,android,Java,Android,下面是一段代码,玩家点击后将通过放置X计数器进行移动,然后计算机将通过放置O计数器进行移动。这个 目前该代码的唯一问题是,当玩家放置X计数器时,O计数器也同时放置。所以看起来这两个球员 电脑在同一时间做出动作,每次玩家做出动作时都会发生这种情况 我想问的是,是否可以包括2秒的延时,让玩家放置X,然后在2秒后计算机放置O 提前谢谢 @Override public void onClick(View v) { if (!((Button) v).getText().

下面是一段代码,玩家点击后将通过放置X计数器进行移动,然后计算机将通过放置O计数器进行移动。这个 目前该代码的唯一问题是,当玩家放置X计数器时,O计数器也同时放置。所以看起来这两个球员 电脑在同一时间做出动作,每次玩家做出动作时都会发生这种情况

我想问的是,是否可以包括2秒的延时,让玩家放置X,然后在2秒后计算机放置O

提前谢谢

   @Override
    public void onClick(View v) {

        if (!((Button) v).getText().toString().equals("")) {
            return;
        }

        if (playerOneMove) {
            ((Button) v).setText("X");
            ((Button) v).setTextColor(playerX);
            computerMove();
        }
}

private void computerMove() {
    String[][] field = new String[3][3];
    Random random = new Random(); //you may want to declare this as a class field
    List<Button> emptyButtons = new ArrayList<>();

    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            field[i][j] = buttons[i][j].getText().toString();
            if (field[i][j].equals("")) {
                emptyButtons.add(buttons[i][j]);
            }
        }
    }

    Button selectButton;

    for (int i = 0; i < 3; i++) {
        if (field[i][0].equals(field[i][1])
                && field[i][2].equals("")){
            //prevent win/win on rows by selecting the correct button here
        }
        else if (field[i][0].equals(field[i][2])
                && field[i][1].equals("")){
             //prevent win/win on rows by selecting the correct button here
        }
        else if (field[i][1].equals(field[i][2])
                && field[i][0].equals("")){
            //prevent win/win on rows by selecting the correct button here
        }
        else {
            selectButton = emptyButtons.get(random.nextInt(emptyButtons.size()));
        }

    selectButton.setText("O");
    selectButton.setTextColor(playerO);
}
@覆盖
公共void onClick(视图v){
if(!((按钮)v.getText().toString()等于(“”){
返回;
}
如果(移动){
((按钮)v.setText(“X”);
(按钮)v.setTextColor(playerX);
computerMove();
}
}
私有计算机移动(){
字符串[][]字段=新字符串[3][3];
Random Random=new Random();//您可能希望将其声明为类字段
List emptyButtons=new ArrayList();
对于(int i=0;i<3;i++){
对于(int j=0;j<3;j++){
字段[i][j]=按钮[i][j].getText().toString();
if(字段[i][j]。等于(“”){
添加(按钮[i][j]);
}
}
}
按钮选择按钮;
对于(int i=0;i<3;i++){
如果(字段[i][0]。等于(字段[i][1])
&&字段[i][2]。等于(“”){
//通过在此处选择正确的按钮防止行上的赢/赢
}
else如果(字段[i][0]。等于(字段[i][2])
&&字段[i][1]。等于(“”){
//通过在此处选择正确的按钮防止行上的赢/赢
}
else如果(字段[i][1]。等于(字段[i][2])
&&字段[i][0]。等于(“”){
//通过在此处选择正确的按钮防止行上的赢/赢
}
否则{
selectButton=emptyButtons.get(random.nextInt(emptyButtons.size());
}
选择按钮。设置文本(“O”);
selectButton.setTextColor(playerO);
}

您可以将计算机逻辑放入处理程序或计时器任务中:


但您还需要一些标志,它将阻止用户在等待计算机移动时放置X。

您可以将计算机逻辑放入处理程序或计时器任务中:


但你们也需要一些标志,当你们在等待计算机移动时,它会阻止用户放置X。

我用延迟编辑了你们的onclick,我想你们需要一些标志,它会阻止用户,直到计算机移动

 @Override
public void onClick(View v) {

    if (!((Button) v).getText().toString().equals("")) {
        return;
    }

    if (playerOneMove) {
        ((Button) v).setText("X");
        ((Button) v).setTextColor(playerX);

          //2000 is your delay in mills format
        v.postDelayed(new Runnable() {
            @Override
            public void run() {
                computerMove();
            }
        },2000)

    }
}

我认为最好使用1秒到3秒之间的随机数作为延迟,而不是恒定的延迟。它为用户创造了更好的体验。

我用延迟编辑了你的onclick,我认为你需要某种标志来阻止用户,直到计算机移动

 @Override
public void onClick(View v) {

    if (!((Button) v).getText().toString().equals("")) {
        return;
    }

    if (playerOneMove) {
        ((Button) v).setText("X");
        ((Button) v).setTextColor(playerX);

          //2000 is your delay in mills format
        v.postDelayed(new Runnable() {
            @Override
            public void run() {
                computerMove();
            }
        },2000)

    }
}

我认为最好使用1秒到3秒之间的随机数作为延迟,而不是常数延迟。它为用户创造了更好的体验。

您可以查看android中的处理程序Runnable类。您可以根据需要延迟方法的时间

final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
  @Override
  public void run() {
    //Do something after 100ms
  }
}, 100);

您可以在android中查看处理程序Runnable类。您可以根据需要延迟方法的时间

final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
  @Override
  public void run() {
    //Do something after 100ms
  }
}, 100);

也许暂停线程的这个问题会帮助你创建处理程序/任务,然后阻止整个UI,不是更好吗?也许暂停线程的这个问题会帮助你创建处理程序/任务,然后阻止整个UI,不是更好吗?好的,这似乎是有意义的。这个标志,我只是想知道如何设置真或假。我猜让我们调用variable playerCanMove=true。当处理程序中的是computerMove时,将playerCanMove=false设置为,然后在代码后面加上…SETEXT('O'),change the playerCanMove=true。这是正确的球场吗?如果不是,请在旗杆上举一个小例子,然后说我已经有了“isPlayerMove”作为lfag,所以我想知道我是否可以用它来代替,但只是想知道如何阻止你已经有了的球员移动(PlayerMove)如果你在那里检查玩家是否可以移动,那么你就不需要额外的检查了。是的,我想是的,很抱歉我想得太多了。谢谢,这似乎是有意义的。国旗,我只是想知道如何设置真或假。我猜让我们调用变量playerCanMove=true。当处理程序中是computerMove时,设置playerCanMove=false,然后在代码后面加上…setText('O'),change the playerCanMove=true。这是正确的球场吗?如果不是,请在旗杆上举一个小例子,然后说我已经有了“isPlayerMove”作为lfag,所以我想知道我是否可以用它来代替,但只是想知道如何阻止你已经有了的球员移动(PlayerMove)如果你在那里检查玩家是否可以移动,那么你就不需要额外的检查了。是的,我想是的,对不起我想得太多了。谢谢Hanks Amir,我想知道你是否可以举一个标记的例子,这样我就可以知道我需要做些什么来实现标记?@BigHendo你可以有一个布尔变量,当有布尔变量时计算机将该变量设置为true,当计算机移动时,将该变量设置为false,在user OnClick中,您应该检查该变量,如果该变量为false,则用户可以移动。谢谢Amir,我想知道您是否可以放置一个标记示例,以便我可以确定在实现标记方面需要做什么g?@BigHendo你可以有一个布尔变量,当有计算机旋转时,你将该变量设置为true,当计算机移动时,你将该变量设置为false,在用户OnClick中,你应该检查该变量,如果该变量为false