@Janna1603

Как закончить игру крестики нолики?

Привет! Я пишу программу игру крестики-нолики. Я пытаюсь сделать проверку на выигрыш, и так и сяк пыталась. Ниже моя программа и проверка "check win". НО у меня почему то теперь подчеркиваются мои переменные 'player' и 'computer'. Я уже окончательно запуталась. Помогите. И если знаете, как по другому проверку можно сделать...
import java.util.Scanner;
import java.util.Random;


public class Main {

    public static void main(String[] args) {
        System.out.println("Приветствую Вас!");
        System.out.println("Сыграем в крестики-нолики?");
        System.out.println("===============");
        initMap();
        printMap();
        while (true) {
            humanTurn();
            printMap();
            if (checkWin(player)) {
                System.out.println("Победил человек");
                break;
            }
            if (isMapFull()) {
                System.out.println("Ничья");
                break;
            }
            compTurn();
            printMap();
            if (checkWin(computer)) {
                System.out.println("Победил Искуственный Интеллект");
                break;
            }
            if (isMapFull()) {
                System.out.println("Ничья");
                break;
            }
        }
        System.out.println("Игра закончена");
    }



    public static char[][] map;
    public static int size = 3;
    public static int dots_for_win = 4;

    public static char space = '-';
    public static char player = 'O';
    public static char computer = 'X';
    public static Scanner sc = new Scanner(System.in);
    public static Random rand = new Random();



    static void initMap() {
            map = new char[size][size];
            for (int i = 0; i < size; i++) {
                for (int j = 0; j < size; j++) {
                    map[i][j] = space;
                }
            }
        }

        public static void printMap() {
            for (int i = 0; i <= size; i++) {
                System.out.print(i + " ");
            }
            System.out.println();
            for (int i = 0; i < size; i++) {
                System.out.print((i + 1) + " ");
                for (int j = 0; j < size; j++) {
                    System.out.print(map[i][j] + " ");
                }
                System.out.println();
            }
            System.out.println();
        }
        public static void humanTurn() {
            int x, y;
        do {
            System.out.println("Введите координаты в формате X Y");
            x = sc.nextInt() - 1;
            y = sc.nextInt() - 1;
        } while (!ValidCell(x, y));
        map[y][x] = computer;
    }


    public static void compTurn() {
        int x, y;
        do {
            x = rand.nextInt(size);
            y = rand.nextInt(size);
        } while (!ValidCell(x, y));
        System.out.println("Компьютер походил в точку " + (x + 1) + " " + (y + 1));
        map[y][x] = player;
    }





    public static boolean ValidCell(int x, int y) {
        if (x < 0 || x >= size || y < 0 || y >= size) return false;
        if (map[y][x] == space) return true;
        return false;
}







    private static boolean checkWin(String[][] desc) {
        return checkWinnerHorizontal(desc) ||
                checkWinnerVertical(desc) ||
                checkWinnerDiagonals(desc);
    }

    private static boolean checkWinnerHorizontal(String[][] desc) {
        return desc[0][0].equals(desc[1][0]) && desc[0][0].equals(desc[2][0]) ||
                desc[0][1].equals(desc[1][1]) && desc[0][1].equals(desc[2][1]) ||
                desc[0][2].equals(desc[1][2]) && desc[0][2].equals(desc[2][2]);
    }

    private static boolean checkWinnerVertical(String[][] desc) {
        return desc[0][0].equals(desc[0][1]) && desc[0][0].equals(desc[0][2]) ||
                desc[1][0].equals(desc[1][1]) && desc[1][0].equals(desc[1][2]) ||
                desc[2][0].equals(desc[2][1]) && desc[2][0].equals(desc[2][2]);
    }

    private static boolean checkWinnerDiagonals(String[][] desc) {
        return desc[0][0].equals(desc[1][1]) && desc[0][0].equals(desc[2][2]) ||
                desc[2][0].equals(desc[1][1]) && desc[2][0].equals(desc[0][2]);
    }


    public static boolean isMapFull() {
        for (int i = 0; i < size; i++) {
            for (int j = 0; j < size; j++) {
                if (map[i][j] == space) return false;
            }
        }
        return true;
    }

}
  • Вопрос задан
  • 120 просмотров
Пригласить эксперта
Ответы на вопрос 2
@xez
Senior Junior Roo
1. Метод checkWin принимает String[][], а вы туда пытаетесь char засунуть.
2. Методы checkWinnerHorizontal, checkWinnerVertical, checkWinnerDiagonals, похоже проверяют равенство ячеек массива, но не его содержание. Т.е. нужно еще добавить проверку на равенство крестику или нолику.
Ответ написан
Bavashi
@Bavashi
Попробуйте так:
Код для теста

import java.util.Scanner;
import java.util.Random;


public class Main {

    public static void main(String[] args) {
        System.out.println("Приветствую Вас!");
        System.out.println("Сыграем в крестики-нолики?");
        System.out.println("===============");
        initMap();
        printMap();
        while (true) {
            humanTurn();
            printMap();
            if (checkWin(map, player)) {
                System.out.println("Победил человек");
                break;
            }
            if (isMapFull()) {
                System.out.println("Ничья");
                break;
            }
            compTurn();
            printMap();
            if (checkWin(map, computer)) {
                System.out.println("Победил Искуственный Интеллект");
                break;
            }
            if (isMapFull()) {
                System.out.println("Ничья");
                break;
            }
        }
        System.out.println("Игра закончена");
    }



    public static String[][] map; //Если хотим использовать equals
    public static int size = 3;
    public static int dots_for_win = 4;

    public static char space = '-';
    public static String player = "X"; // Изменено местами
    public static String computer = "O"; // Изменено местами
    public static Scanner sc = new Scanner(System.in);
    public static Random rand = new Random();



    static void initMap() {
            map = new String[size][size];
            for (int i = 0; i < size; i++) {
                for (int j = 0; j < size; j++) {
                    map[i][j] = "" + space;
                }
            }
        }

        public static void printMap() {
            for (int i = 0; i <= size; i++) {
                System.out.print(i + " ");
            }
            System.out.println();
            for (int i = 0; i < size; i++) {
                System.out.print((i + 1) + " ");
                for (int j = 0; j < size; j++) {
                    System.out.print(map[i][j] + " ");
                }
                System.out.println();
            }
            System.out.println();
        }
        public static void humanTurn() {
            int x, y;
        do {
            System.out.println("Введите координаты в формате X Y");
            x = sc.nextInt() - 1;
            y = sc.nextInt() - 1;
        } while (!ValidCell(x, y));
        map[y][x] = "" + player; // изменено
    }


    public static void compTurn() {
        int x, y;
        do {
            x = rand.nextInt(size);
            y = rand.nextInt(size);
        } while (!ValidCell(x, y));
        System.out.println("Компьютер походил в точку " + (x + 1) + " " + (y + 1));
        map[y][x] = "" + computer; // изменено
    }





    public static boolean ValidCell(int x, int y) {
        if (x < 0 || x > size || y < 0 || y > size) return false;
        if (map[y][x].equals("" + space)) return true;
        return false;
}







    private static boolean checkWin(String[][] desc, String teamPlayer) {
        return checkWinnerHorizontal(desc, teamPlayer) ||
               checkWinnerVertical(desc, teamPlayer ) ||
               checkWinnerDiagonals(desc, teamPlayer);
    }

    private static boolean checkWinnerHorizontal(String[][] desc, String teamPlayerHorizontal) {
        
        return desc[0][0].equals(desc[1][0]) && desc[0][0].equals(desc[2][0]) && desc[0][0].equals(teamPlayerHorizontal) ||
               desc[0][1].equals(desc[1][1]) && desc[0][1].equals(desc[2][1]) && desc[0][1].equals(teamPlayerHorizontal) ||
               desc[0][2].equals(desc[1][2]) && desc[0][2].equals(desc[2][2]) && desc[0][2].equals(teamPlayerHorizontal);
    }

    private static boolean checkWinnerVertical(String[][] desc, String teamPlayerVertical) {
        
        return desc[0][0].equals(desc[0][1]) && desc[0][0].equals(desc[0][2]) && desc[0][0].equals(teamPlayerVertical) ||
               desc[1][0].equals(desc[1][1]) && desc[1][0].equals(desc[1][2]) && desc[1][0].equals(teamPlayerVertical) ||
               desc[2][0].equals(desc[2][1]) && desc[2][0].equals(desc[2][2]) && desc[2][0].equals(teamPlayerVertical);
    }

    private static boolean checkWinnerDiagonals(String[][] desc, String teamPlayerDiagonals) {
        
        return desc[0][0].equals(desc[1][1]) && desc[0][0].equals(desc[2][2]) && desc[0][0].equals(teamPlayerDiagonals) ||
               desc[2][0].equals(desc[1][1]) && desc[2][0].equals(desc[0][2]) && desc[2][0].equals(teamPlayerDiagonals);
    }


    public static boolean isMapFull() {
        for (int i = 0; i < size; i++) {
            for (int j = 0; j < size; j++) {
                if (map[i][j].equals("" + space)) return false;
            }
        }
        return true;
    }

}

Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы