Игра в крестики-нолики каждый раз приводит к ничьей

#java

#java

Вопрос:

Я хотел бы думать, что код довольно понятен. Я начинающий программист, и для меня все выглядит нормально. Что вы должны делать в подобных ситуациях, когда все выглядит идеально, но программа работает не так, как планировалось?

Короче говоря, я прошу совета для outlook по проектам кодирования и решения вопроса о том, почему мой метод, на который я потратил более 45 минут, ничего не делает.

 import java.util.Scanner;

public class TicTacToe {

    public static boolean elementsAreAllEqual(char[] arr) {

        for(int i = 0; i < arr.length; i  ) {
            if(arr[i] != arr[i   1]) {
                return false;
            }
        }
        return true;
    }

    public static boolean some1HasWon(char[][] g) {

        char[] treE = new char[3];

        // horizontal straight lines (rows of 3 alike)
        for(int r = 0; r < g.length; r  ) {
            for(int c = 0; c < g.length; c  ) {
                treE[c] = g[r][c];
            }
            if(elementsAreAllEqual(treE)) {
                            return true;
                    }
            treE = new char[3];
        }

        // vertical straight lines (columns of 3 alike)
        for(int c = 0; c < g.length; c  ) {
                        for(int r = 0; r < g.length; r  ) {
                                treE[r] = g[c][r];
                        }
                        if(elementsAreAllEqual(treE)) {
                            return true;
                    }
                        treE = new char[3];
                }

        // upward diagonal
        for(int i = 0; i < g.length; i  ) {
            treE[i] = g[g.length-i-1][i];
        }
        if(elementsAreAllEqual(treE)) {
            return true;
        }
        treE = new char[3];

        // downward diagonal
        for(int i = 0; i < g.length; i  ) {
            treE[i] = g[i][i];
        }
        if(elementsAreAllEqual(treE)) {
                        return true;
                }

        return false;
    }

    public static void main(String args[]) {

        char[][] grid = new char[3][3];
        Scanner s = new Scanner(System.in);
        System.out.println("Tic-Tac-Toen");

        int goCount = 0;
        char player;
        boolean draw = true;
        boolean end = false;

        do {
            if(goCount % 2 == 0) {
                player = 'X';
                System.out.print("'"   player   "', choose your location (row, column): ");
            }
            else {
                player = 'O';
                System.out.print("'"   player   "', choose your location (row, column): ");
            }
            String position = s.nextLine();
            String[] p = position.split(" ");
            int[] pos = {Integer.parseInt(p[0]), Integer.parseInt(p[1])}; 

            grid[pos[0]][pos[1]] = player;

            System.out.println();

            for(int y = 0; y < 3; y  ) {
                System.out.print("t");
                for(int x = 0; x < 3; x  ) {
                    if(grid[y][x] != ' ') {
                        System.out.print(grid[y][x]   " ");
                    }
                    else {
                        System.out.print("  ");
                    }
                }
                System.out.println();
            }

            System.out.println();

            if(goCount > 4) {
                if(some1HasWon(grid)) {
                    end = true;
                }
                else if(goCount >= 8) {
                    draw = true;
                    end = true;
                }
            }
            goCount  ;
        }
        while(end != true);

        if(draw) {
            System.out.println("The game was a draw.");
        }
        else if(goCount % 2 == 0) {
            System.out.println("Player 'X' wins the game.");
        }
        else {
            System.out.println("Player 'O' wins the game.");
        }
    }

}

  

Комментарии:

1. Вы можете использовать инструмент отладки и пройти свой код шаг за шагом.

Ответ №1:

Ваш метод elementaAreAllEqual обращается к элементам за пределами массива, когда i = arr.length - 1 вы должны выполнять итерацию только до arr.length - 1 .

 public static boolean elementsAreAllEqual(char[] arr) {

        for(int i = 0; i < arr.length - 1; i  ) {
            if(arr[i] != arr[i   1]) {
                return false;
            }
        }
        return true;
    }
  

Ваша инициализация draw = true является причиной, по которой вы каждый раз получаете ничью. Независимо от результата some1HasWon переменной draw всегда true .

 if(goCount > 4) {
   if(some1HasWon(grid)) {
        end = true;
        draw = false;
   } else if(goCount >= 8) {
         draw = true;
         end = true;
   }
}