Android - Игра крестики нолики

324
05 ноября 2017, 16:17

Как сделать, чтобы после того, как поставили крестик, то через некоторое время, вставился нолик, а не сразу?

Тут только для первой кнопки, остальное будет аналогичным способом:

btn1.setOnClickListener(new View.OnClickListener() {
    @Override public void onClick (View view){
    if (btn1.getText().toString().equals("")) {
        btn1.setText("X");
        btn1.setTextColor(Color.RED);
        Thread thread = new Thread() {
            @Override
            public void run() {
                super.run();
                try {
                    Main4Activity.this.runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            int a = new Random().nextInt(3);
                            if (btn2.getText().toString().equals("O") && btn5.getText().toString().equals("O")
                                && btn8.getText().toString().equals("")) {
                                btn8.setText("O");
                            } else if (btn2.getText().toString().equals("O") && btn8.getText()
                                .toString()
                                .equals("O") && btn5.getText().toString().equals("")) {
                                btn5.setText("O");
                            } else if (btn3.getText().toString().equals("O") && btn5.getText()
                                .toString()
                                .equals("O") && btn7.getText().toString().equals("")) {
                                btn7.setText("O");
                            } else if (btn3.getText().toString().equals("O") && btn7.getText()
                                .toString()
                                .equals("O") && btn5.getText().toString().equals("")) {
                                btn5.setText("O");
                            } else if (btn3.getText().toString().equals("O") && btn6.getText()
                                .toString()
                                .equals("O") && btn9.getText().toString().equals("")) {
                                btn9.setText("O");
                            } else if (btn3.getText().toString().equals("O") && btn9.getText()
                                .toString()
                                .equals("O") && btn6.getText().toString().equals("")) {
                                btn6.setText("O");
                            } else if (btn4.getText().toString().equals("O") && btn5.getText()
                                .toString()
                                .equals("O") && btn6.getText().toString().equals("")) {
                                btn6.setText("O");
                            } else if (btn4.getText().toString().equals("O") && btn6.getText()
                                .toString()
                                .equals("O") && btn5.getText().toString().equals("")) {
                                btn5.setText("O");
                            } else if (btn5.getText().toString().equals("O") && btn2.getText()
                                .toString()
                                .equals("O") && btn8.getText().toString().equals("")) {
                                btn8.setText("O");
                            } else if (btn5.getText().toString().equals("O") && btn8.getText()
                                .toString()
                                .equals("O") && btn2.getText().toString().equals("")) {
                                btn2.setText("O");
                            } else if (btn5.getText().toString().equals("O") && btn3.getText()
                                .toString()
                                .equals("O") && btn7.getText().toString().equals("")) {
                                btn7.setText("O");
                            } else if (btn5.getText().toString().equals("O") && btn7.getText()
                                .toString()
                                .equals("O") && btn3.getText().toString().equals("")) {
                                btn3.setText("O");
                            } else if (btn5.getText().toString().equals("O") && btn4.getText()
                                .toString()
                                .equals("O") && btn6.getText().toString().equals("")) {
                                btn6.setText("O");
                            } else if (btn5.getText().toString().equals("O") && btn6.getText()
                                .toString()
                                .equals("O") && btn4.getText().toString().equals("")) {
                                btn4.setText("O");
                            } else if (btn6.getText().toString().equals("O") && btn3.getText()
                                .toString()
                                .equals("O") && btn9.getText().toString().equals("")) {
                                btn9.setText("O");
                            } else if (btn6.getText().toString().equals("O") && btn9.getText()
                                .toString()
                                .equals("O") && btn3.getText().toString().equals("")) {
                                btn3.setText("O");
                            } else if (btn6.getText().toString().equals("O") && btn4.getText()
                                .toString()
                                .equals("O") && btn5.getText().toString().equals("")) {
                                btn5.setText("O");
                            } else if (btn6.getText().toString().equals("O") && btn5.getText()
                                .toString()
                                .equals("O") && btn4.getText().toString().equals("")) {
                                btn4.setText("O");
                            } else if (btn7.getText().toString().equals("O") && btn3.getText()
                                .toString()
                                .equals("O") && btn5.getText().toString().equals("")) {
                                btn5.setText("O");
                            } else if (btn7.getText().toString().equals("O") && btn5.getText()
                                .toString()
                                .equals("O") && btn3.getText().toString().equals("")) {
                                btn3.setText("O");
                            } else if (btn7.getText().toString().equals("O") && btn8.getText()
                                .toString()
                                .equals("O") && btn9.getText().toString().equals("")) {
                                btn9.setText("O");
                            } else if (btn7.getText().toString().equals("O") && btn9.getText()
                                .toString()
                                .equals("O") && btn8.getText().toString().equals("")) {
                                btn8.setText("O");
                            } else if (btn8.getText().toString().equals("O") && btn5.getText()
                                .toString()
                                .equals("O") && btn2.getText().toString().equals("")) {
                                btn2.setText("O");
                            } else if (btn8.getText().toString().equals("O") && btn2.getText()
                                .toString()
                                .equals("O") && btn5.getText().toString().equals("")) {
                                btn5.setText("O");
                            } else if (btn8.getText().toString().equals("O") && btn7.getText()
                                .toString()
                                .equals("O") && btn9.getText().toString().equals("")) {
                                btn9.setText("O");
                            } else if (btn8.getText().toString().equals("O") && btn9.getText()
                                .toString()
                                .equals("O") && btn7.getText().toString().equals("")) {
                                btn7.setText("O");
                            } else if (btn9.getText().toString().equals("O") && btn3.getText()
                                .toString()
                                .equals("O") && btn6.getText().toString().equals("")) {
                                btn6.setText("O");
                            } else if (btn9.getText().toString().equals("O") && btn6.getText()
                                .toString()
                                .equals("O") && btn3.getText().toString().equals("")) {
                                btn3.setText("O");
                            } else if (btn9.getText().toString().equals("O") && btn7.getText()
                                .toString()
                                .equals("O") && btn8.getText().toString().equals("")) {
                                btn8.setText("O");
                            } else if (btn9.getText().toString().equals("O") && btn8.getText()
                                .toString()
                                .equals("O") && btn7.getText().toString().equals("")) {
                                btn7.setText("O");
                            } else if (btn1.getText().toString().equals("X") && btn2.getText()
                                .toString()
                                .equals("X") && btn3.getText().toString().equals("")) {
                                btn3.setText("O");
                                btn3.setTextColor(Color.BLUE);
                            } else if (btn1.getText().toString().equals("X") && btn3.getText()
                                .toString()
                                .equals("X") && btn2.getText().toString().equals("")) {
                                btn2.setText("O");
                                btn2.setTextColor(Color.BLUE);
                            } else if (btn1.getText().toString().equals("X") && btn4.getText()
                                .toString()
                                .equals("X") && btn7.getText().toString().equals("")) {
                                btn7.setText("O");
                                btn7.setTextColor(Color.BLUE);
                            } else if (btn1.getText().toString().equals("X") && btn7.getText()
                                .toString()
                                .equals("X") && btn4.getText().toString().equals("")) {
                                btn4.setText("O");
                                btn4.setTextColor(Color.BLUE);
                            } else if (btn1.getText().toString().equals("X") && btn5.getText()
                                .toString()
                                .equals("X") && btn9.getText().toString().equals("")) {
                                btn9.setText("O");
                                btn9.setTextColor(Color.BLUE);
                            } else if (btn1.getText().toString().equals("X") && btn9.getText()
                                .toString()
                                .equals("X") && btn5.getText().toString().equals("")) {
                                btn5.setText("O");
                                btn5.setTextColor(Color.BLUE);
                            } else if (a == 0) {
                                if (btn2.getText().toString().equals("")) {
                                    btn2.setText("O");
                                    btn2.setTextColor(Color.BLUE);
                                } else if (btn4.getText().toString().equals("")) {
                                    btn4.setText("O");
                                    btn4.setTextColor(Color.BLUE);
                                } else if (btn5.getText().toString().equals("")) {
                                    btn5.setText("O");
                                    btn5.setTextColor(Color.BLUE);
                                } else if (btn3.getText().toString().equals("")) {
                                    btn3.setText("O");
                                    btn3.setTextColor(Color.BLUE);
                                } else if (btn6.getText().toString().equals("")) {
                                    btn6.setText("O");
                                    btn6.setTextColor(Color.BLUE);
                                } else if (btn7.getText().toString().equals("")) {
                                    btn7.setText("O");
                                    btn7.setTextColor(Color.BLUE);
                                } else if (btn8.getText().toString().equals("")) {
                                    btn8.setText("O");
                                    btn8.setTextColor(Color.BLUE);
                                } else if (btn9.getText().toString().equals("")) {
                                    btn9.setText("O");
                                    btn9.setTextColor(Color.BLUE);
                                }
                            } else if (a == 1) {
                                if (btn4.getText().toString().equals("")) {
                                    btn4.setText("O");
                                    btn4.setTextColor(Color.BLUE);
                                } else if (btn2.getText().toString().equals("")) {
                                    btn2.setText("O");
                                    btn2.setTextColor(Color.BLUE);
                                } else if (btn5.getText().toString().equals("")) {
                                    btn5.setText("O");
                                    btn5.setTextColor(Color.BLUE);
                                } else if (btn3.getText().toString().equals("")) {
                                    btn3.setText("O");
                                    btn3.setTextColor(Color.BLUE);
                                } else if (btn6.getText().toString().equals("")) {
                                    btn6.setText("O");
                                    btn6.setTextColor(Color.BLUE);
                                } else if (btn7.getText().toString().equals("")) {
                                    btn7.setText("O");
                                    btn7.setTextColor(Color.BLUE);
                                } else if (btn8.getText().toString().equals("")) {
                                    btn8.setText("O");
                                    btn8.setTextColor(Color.BLUE);
                                } else if (btn9.getText().toString().equals("")) {
                                    btn9.setText("O");
                                    btn9.setTextColor(Color.BLUE);
                                }
                            } else if (a == 2) {
                                if (btn5.getText().toString().equals("")) {
                                    btn5.setText("O");
                                    btn5.setTextColor(Color.BLUE);
                                } else if (btn4.getText().toString().equals("")) {
                                    btn4.setText("O");
                                    btn4.setTextColor(Color.BLUE);
                                } else if (btn2.getText().toString().equals("")) {
                                    btn2.setText("O");
                                    btn2.setTextColor(Color.BLUE);
                                } else if (btn3.getText().toString().equals("")) {
                                    btn3.setText("O");
                                    btn3.setTextColor(Color.BLUE);
                                } else if (btn6.getText().toString().equals("")) {
                                    btn6.setText("O");
                                    btn6.setTextColor(Color.BLUE);
                                } else if (btn7.getText().toString().equals("")) {
                                    btn7.setText("O");
                                    btn7.setTextColor(Color.BLUE);
                                } else if (btn8.getText().toString().equals("")) {
                                    btn8.setText("O");
                                    btn8.setTextColor(Color.BLUE);
                                } else if (btn9.getText().toString().equals("")) {
                                    btn9.setText("O");
                                    btn9.setTextColor(Color.BLUE);
                                }
                            }
                        }
                    });
                    Thread.sleep(2000);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        };
        thread.start();
    }
    endgame();
}
});

Но так не работает.

Answer 1

переместите Thread.sleep(2000); на место перед строкой thread.start();

Answer 2

1) Проблема вероятно решиться если перенести Thread.sleep(2000) сразу после public void run()

2) Извините, но такой код за гранью добра и зла. Вы пишите огромную простыню кода, а потом тратите кучу времени чтобы разобраться что там не работает, хотя тот же код пишется куда проще. Даже если вы просто создадите простейшие функции код сократиться в несколько раз:

btn1.setOnClickListener(new View.OnClickListener()
{
    @Override public void onClick (View view){
    if (btn1.getText().toString().equals("")) {
        btn1.setText("X");
        btn1.setTextColor(Color.RED);
        Thread thread = new Thread() {
            @Override
            public void run() {
                super.run();
                try {
                    Main4Activity.this.runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            setRandomZero();
                        }
                    });
                    Thread.sleep(2000);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        };
        thread.start();
    }
    endgame();
}
});
private void setRandomZero() {
    int a = new Random().nextInt(3);
    if (isZero(btn2) && isZero(btn5) && isEmpty(btn8)) {
        setZero(btn8);
    } else if 
       ...
    }      
}
private static boolean isZero(Button btn) {
    return btn.getText().toString().equals("O"); 
}
private static boolean isEmpty(Button btn) {
    return btn.getText().toString().equals("");
}
private static void setZero(Button btn) {
    btn.setText("O");
}

Но там нужно вообще использовать циклы и массивы, скажем проверка что выиграли нолики или крестики запишется примерно так:

private int[][] getNumbers() {
    return new int[][] {
        {getNumber(btn1), getNumber(btn2), getNumber(btn3)},
        {getNumber(btn4), getNumber(btn5), getNumber(btn6)},
        {getNumber(btn7), getNumber(btn8), getNumber(btn9)}
    };
}

private boolean isZeroWin() {       
    return isWin(3);
}
private boolean isXWin() {       
    return isWin(-3);
}
private boolean isWin(int winNumber) {
    int[][] arr = getNumbers();
    int sum1, sum2;
    for(int i = 0; i<= 3; i++) {
        sum1 = 0; sum2 = 0;
        for(int j = 0; j <= 3; j++) {
            sum1 += arr[i][j];
            sum2 += arr[j][i];
        }
        if(sum1 == winNumber || sum2 == winNumber) {
            return true;
        }
    }
    sum1 = 0; sum2 = 0;
    for(int i = 0; i<= 3; i++) {
        sum1 += arr[i][i];
        sum2 += arr[2-i][2-i];
    }
    if (sum1 == winNumber || sum2 == winNumber) {
        return true;
    }
    return false;
}
private static int getNumber(Button btn) {
    String str = btn.getText().toString();
    if(str.equals("O")) {
        return 1;
    } else if(str.equals("")) {
        return 0;
    } else {
        return -1;
    }
} 

Да такой код писать несколько сложнее чем миллион if'ов, но научившись писать такой код, вы сократите время написания кода в разы, плюс намного легче его будет отлаживать. В крайнем случае, даже тот код что выше позволит вам во много раз сократить все ваши функции.

READ ALSO
Добавление кнопки на окно

Добавление кнопки на окно

Создаю окно с некоторой надписью и реакцией на нажатие клавиш(отображение нажатых символов на окне)Помогите пожулуйста создать кнопку на этом...

277
Не работает setImageResource

Не работает setImageResource

Осваивая AndroidStudio, столкнулся с такой проблемойСледующий код должен рисовать на экране бутылку, и далее с помощью многократного вызова fly() , например...

258
e.printStackTrace() заменяет throw?

e.printStackTrace() заменяет throw?

Часто встречаю подобный код:

296
Ошибка версии приложения; Error &ldquo;application_version&rdquo;

Ошибка версии приложения; Error “application_version”

При запуске выскакивают ошибки:

394