Компьютер заявляет, что выигрывает каждый раз, даже если это не правильный результат в приложении для Android

Я почти завершил приложение для игры в крестики-нолики (игрок против компьютера) на Android, но заметил сбой в своей игре. Независимо от результата на доске, Компьютер всегда побеждает. Так что, если у игрока три в ряд или это ничья, в нем все равно говорится, что компьютер побеждает, и я не совсем уверен, какую ошибку я добавил в свой код, чтобы вызвать это. Как я могу получить правильные результаты для игры?

Ниже приведен полный код:

public class MainActivityPlayer1 extends AppCompatActivity implements View.OnClickListener {

    private Button[][] buttons = new Button[3][3];

    private boolean playerOneMove = true;

    private int turnsCount;

    private int playerOnePoints;
    private int playerTwoPoints;

    private TextView textViewPlayerOne;
    private TextView textViewPlayerTwo;
    private TextView textViewPlayerOneTurn;
    private TextView textViewPlayerTwoTurn;

    int playerX = Color.parseColor("#e8e5e5");
    int playerO = Color.parseColor("#737374");


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main_player2);

        textViewPlayerOne = findViewById(R.id.textView_player1);
        textViewPlayerTwo = findViewById(R.id.textView_player2);
        textViewPlayerOneTurn = findViewById(R.id.textView_player1Turn);
        textViewPlayerTwoTurn = findViewById(R.id.textView_player2Turn);


        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                String buttonID = "button_" + i + j;
                int resID = getResources().getIdentifier(buttonID, "id", getPackageName());
                buttons[i][j] = findViewById(resID);
                buttons[i][j].setOnClickListener(this);

                if (savedInstanceState != null) {
                    String btnState = savedInstanceState.getCharSequence(buttonID).toString();
                    if (btnState.equals("X")) {
                        buttons[i][j].setTextColor(playerX);
                    } else {
                        buttons[i][j].setTextColor(playerO);
                    }

                }

            }
        }

        Button buttonReset = findViewById(R.id.button_reset);
        buttonReset.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                resetGame();
            }
        });

        Button buttonExit = findViewById(R.id.button_exit);
        buttonExit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                backToMainActivity();
            }
        });

    }

    @Override
    public void onClick(View v) {

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

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

        turnsCount++;

        if (checkGameIsWon()) {
            if (playerOneMove) {
                player1Wins();
            } else {
                player2Wins();
            }
        } else if (turnsCount == 9) {
            draw();
        } else {
            playerOneMove = !playerOneMove;
            switchPlayerTurn();
        }
    }

    private boolean computerMove() {
        playerOneMove = false;
        String[][] field = new String[3][3];

        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("")) {
                    buttons[i][j].setText("O");
                    buttons[i][j].setTextColor(playerO);
                    turnsCount++;
                    switchPlayerTurn();
                    return true;
                }
            }
        }
        return false;
    }



    private boolean checkGameIsWon() {
        String[][] field = new String[3][3];

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

        for (int i = 0; i < 3; i++) {
            if (field[i][0].equals(field[i][1])
                    && field[i][0].equals(field[i][2])
                    && !field[i][0].equals("")) {
                return true;
            }
        }

        for (int i = 0; i < 3; i++) {
            if (field[0][i].equals(field[1][i])
                    && field[0][i].equals(field[2][i])
                    && !field[0][i].equals("")) {
                return true;
            }
        }

        if (field[0][0].equals(field[1][1])
                && field[0][0].equals(field[2][2])
                && !field[0][0].equals("")) {
            return true;
        }

        if (field[0][2].equals(field[1][1])
                && field[0][2].equals(field[2][0])
                && !field[0][2].equals("")) {
            return true;
        }

        return false;
    }

    private void player1Wins() {
        playerOnePoints++;
        Toast.makeText(this, "Player 1 wins!", Toast.LENGTH_SHORT).show();
        updatePointsText();
        resetBoard();
    }

    private void player2Wins() {
        playerTwoPoints++;
        Toast.makeText(this, "Computer wins!", Toast.LENGTH_SHORT).show();
        updatePointsText();
        resetBoard();
        computerMove();
        playerOneMove = true;
        switchPlayerTurn();
    }

    private void draw() {
        Toast.makeText(this, "Draw!", Toast.LENGTH_SHORT).show();
        resetBoard();
        if (!playerOneMove){
            computerMove();
            turnsCount++;
        }
    }

    @SuppressLint("SetTextI18n")
    private void updatePointsText() {
        textViewPlayerOne.setText("Player 1:  " + playerOnePoints + " ");
        textViewPlayerTwo.setText("Computer: " + playerTwoPoints + " ");
    }

    private void resetBoard() {
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                buttons[i][j].setText("");
            }
        }

        turnsCount = 0;
        switchPlayerTurn();
    }

    private void resetGame() {
        playerOnePoints = 0;
        playerTwoPoints = 0;
        turnsCount = 0;
        playerOneMove = true;
        updatePointsText();
        resetBoard();
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);

        outState.putInt("turnsCount", turnsCount);
        outState.putInt("playerOnePoints", playerOnePoints);
        outState.putInt("playerTwoPoints", playerTwoPoints);
        outState.putBoolean("playerOneMove", playerOneMove);
        switchPlayerTurn();

        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                String buttonID = "button_" + i + j;
                Button btn = buttons[i][j];
                outState.putCharSequence(buttonID, btn.getText());
            }
        }

    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) { ;
        super.onRestoreInstanceState(savedInstanceState);

        turnsCount = savedInstanceState.getInt("turnsCount");
        playerOnePoints = savedInstanceState.getInt("playerOnePoints");
        playerTwoPoints = savedInstanceState.getInt("playerTwoPoints");
        playerOneMove = savedInstanceState.getBoolean("playerOneMove");
        switchPlayerTurn();

        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                String buttonID = "button_" + i + j;
                Button btn = buttons[i][j];
                savedInstanceState.putCharSequence(buttonID, btn.getText());

            }
        }

    }

    private void switchPlayerTurn(){
        if (playerOneMove){
            textViewPlayerOneTurn.setVisibility(View.VISIBLE);
            textViewPlayerTwoTurn.setVisibility(View.INVISIBLE);
        }
        else{
            textViewPlayerOneTurn.setVisibility(View.INVISIBLE);
            textViewPlayerTwoTurn.setVisibility(View.VISIBLE);
        }

    }

    private void backToMainActivity(){
        Intent intentMainActivity = new Intent(this, MainActivity.class);
        startActivity(intentMainActivity);
    }

}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это потому, что вы устанавливаете playerOneMove = false;if (playerOneMove) {) каждый раз, когда первый проигрыватель включается, вызывая computerMove(), и в этом методе вы сразу же устанавливаете playeOneMove = false;.

Если это не так, опубликуйте также метод switchPlayerTurn().

Кроме того, я думаю, что вам следует перенести тестирование условий выигрыша на более высокий уровень до if (playerOneMove).

Пример (я изменил ваше условие, переместил код для проверки условий выигрыша, создал дополнительный метод ...):

   @Override
    public void onClick(View v) {
        if (!((Button) v).getText().toString().equals("")) {
            return;
        }
                ((Button) v).setText("X");
                ((Button) v).setTextColor(playerX);
                playerOneMove = false;
                switchPlayerTurn();
                computerMove();
                playerOneMove = true;
                switchPlayerTurn();

        turnsCount++;
    }

    private boolean computerMove() {

        String[][] field = new String[3][3];

        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("")) {
                    buttons[i][j].setText("O");
                    buttons[i][j].setTextColor(playerO);
                    turnsCount++;
                    return true;
                }
            }
        }
        return false;
    }



    private boolean checkGameIsWon() {
        String[][] field = new String[3][3];
        Boolean isDone = false.
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                field[i][j] = buttons[i][j].getText().toString();
            }
        }

        for (int i = 0; i < 3; i++) {
            if (field[i][0].equals(field[i][1])
                    && field[i][0].equals(field[i][2])
                    && !field[i][0].equals("")) {
                isDone = true;
            }
        }

        for (int i = 0; i < 3; i++) {
            if (field[0][i].equals(field[1][i])
                    && field[0][i].equals(field[2][i])
                    && !field[0][i].equals("")) {
                isDone = true;
            }
        }

        if (field[0][0].equals(field[1][1])
                && field[0][0].equals(field[2][2])
                && !field[0][0].equals("")) {
            isDone = true;
        }

        if (field[0][2].equals(field[1][1])
                && field[0][2].equals(field[2][0])
                && !field[0][2].equals("")) {
            isDone = true;
        }
           if (isDone){
              if (playerOneMove) {
                  player1Wins();
                  return true;
              } else {
                  player2Wins();
                  return true;
              }
          }
          if (turnsCount == 9) {
              draw();
              return true;
          }
      }
    return false;
    }

    private void player1Wins() {
        playerOnePoints++;
        Toast.makeText(this, "Player 1 wins!", Toast.LENGTH_SHORT).show();
        updatePointsText();
        resetBoard();
    }

    private void player2Wins() {
        playerTwoPoints++;
        Toast.makeText(this, "Computer wins!", Toast.LENGTH_SHORT).show();
        updatePointsText();
        resetBoard();
        computerMove();
        playerOneMove = true;
        switchPlayerTurn();
    }

Могу ли я попросить показать мне, как это должно выглядеть в коде, пожалуйста, поскольку я могу ошибаться в изменениях, которые пытаюсь внести, на основе вашего ответа?

Merlin 06.06.2018 06:39

@Merlin Эээ, это довольно сложно, потому что я не вижу остальной части вашего кода (у меня нет вашей полной логики), но это должно быть что-то вроде кода, который я добавил в ответ.

someRandomSerbianGuy 06.06.2018 06:41

@Merlin Я снова отредактировал код, это должно сработать. Если это не так, просто включите отладчик и следите за своими переменными шаг за шагом, пока не поймете, в чем ошибка. Это логическая ошибка, вы сможете легко решить ее с помощью отладчика, если это не сработает.

someRandomSerbianGuy 06.06.2018 06:50

Я попробую отредактировать 2, но не смогу сделать еще {computerMove () ,,, потому что это относится к методу onClick. Если я сделаю n else, компьютер не двинется с места, пока я не нажму кнопку дважды.

Merlin 06.06.2018 06:50

@Merlin Я снова отредактировал. Это должно сработать, я надеюсь, по крайней мере:

someRandomSerbianGuy 06.06.2018 06:56

Круто, я сдаюсь, я действительно не хочу добавлять isGameOver, поскольку я думаю, что checkGameisWon будет достаточно. Я могу попробовать отладку, чтобы узнать, что происходит, но проблема в том, что MainActivity1 должен находиться в фильтре намерений, и мне нужно выяснить, что это значит.

Merlin 06.06.2018 07:01

Могу я тем временем спросить и назвать это последним редактированием, чтобы попытаться обновить ответ, чтобы он не содержал «Игра окончена»? Я попробую и посмотрю, смогу ли я где-нибудь добраться с отладчиком

Merlin 06.06.2018 07:05

@Merlin Я сейчас не на ПК. Постараюсь обновить его, хотя

someRandomSerbianGuy 06.06.2018 07:12

Круто, у меня работает отладчик, поэтому я попытаюсь отладить, но если вы не видите, что я размещаю и обновляю комментарий в следующие 45 минут, это означает, что я направился на работу и не понял этого, поэтому, если вы этого не сделаете, Не смотрите на это, если это произойдет, мы будем очень признательны :)

Merlin 06.06.2018 07:18

@Merlin Я отредактировал его снова, я удалил тот метод, который вам не нужен.

someRandomSerbianGuy 06.06.2018 07:24

Мне удалось отладить это и исправить. Еще раз спасибо за помощь :)

Merlin 06.06.2018 07:51

Другие вопросы по теме