0

Вот есть сам код: (это игра крестики нолики):


public class Main {
public static char[][] map;
public static final int SIZE = 5;
public static final int DOTS_TO_WIN = 4;
public static final char DOT_EMPTY = '•';
public static final char DOT_X = 'X';
public static final char DOT_O = 'O';
public static Scanner vvod = new Scanner(System.in);

public static void newMap() {
    map = new char[SIZE][SIZE];
    for (int i = 0; i < SIZE; i++) {
        for (int j = 0; j < SIZE; j++) {
            map[i][j] = DOT_EMPTY;
        }
    }
}

public static void printMap() {
    for (int i = 0; i < SIZE; i++) {
        for (int j = 0; j < SIZE; j++) {
            System.out.print(map[i][j] + " ");
        }
        System.out.println();
    }
    System.out.println();
}

public static void human() {
    int x, y;
    do {
        System.out.println("Введите координаты точки (х у)");
        x = vvod.nextShort() - 1;
        y = vvod.nextShort() - 1;
    } while (!freefield(x, y));
    map[x][y] = DOT_X;
}

public static void comp() {
    int x, y;
    do {
        x = (int) (Math.random() * 6) - 1;
        y = (int) (Math.random() * 6) - 1;
    } while (!freefield(x, y));
    System.out.println("ход компьютера: x-" + (x + 1) + " у-" + (y + 1));
    map[x][y] = DOT_O;
}

public static boolean freefield(int x, int y) {
    if (x < 0 || x >= SIZE || y < 0 || y >= SIZE) {
        return false;
    }
    return map[y][x] == DOT_EMPTY;
}

public static boolean fullmap() {
    for (int i = 0; i < SIZE; i++) {
        for (int j = 0; j < SIZE; j++) {
            if (map[i][j] == DOT_EMPTY) return false;
        }
    }
    return true;
}

public static boolean proverka (char symb) {
    int x_win = 0, y_win = 0, col=0, row = 0, stop_1, stop_2;
    do {
        for (col = 0; col < 4; col++) {
            if (map[col][row] == symb) x_win++;
            else x_win = 0;
        }
        row++;
        if (x_win == 4) break; else x_win = 0;
    } while (row!=5) ;
    col = 0;
    do {
        for (row = 0; row < 4; row++) {
            if (map[row][col] == symb) y_win++;
            else y_win = 0;
        }
        col++;
        if (y_win == 4) break; else y_win = 0;
    } while (col!=5) ;
    if (x_win == 4 || y_win == 4) return true; else return false;
}

public static void main(String[] args) {
    newMap();
    printMap();
    while (true) {
        human();
        printMap();
        if (proverka(DOT_X));{
            System.out.println("Победа человека");
            break;
        }
        if (fullmap()){
            System.out.println("Ничья");
            break;
        }
        comp();
        printMap();
        if (proverka(DOT_O));{
            System.out.println("Победа компьютера");
           // break;
        }
        if (fullmap()){
            System.out.println("Ничья");
            break;
        }
    }
    System.out.println("Game over");
}


В методе Main в цикле While есть вызывается класс proverka. В этом классе есть break, который выводит нас из цикла, если возвращается true. Если false, цикл продолжается дальше. Однако:

if (proverka(DOT_X));{
            System.out.println("Победа человека");
            break;
        }
        if (fullmap()){
            System.out.println("Ничья");
            break;
        }

Второй if уже не работает после break и программа говорит, что этот if-

unreachable statement.

Уже битый час не могу разобраться почему так, может тут помогут ☺☻

insolor
  • 49,104

2 Answers2

3

Проблема очевидно тут:

if (proverka(DOT_X)); {         if (proverka(DOT_O)); {
                    ^---         и                  ^----
1

Во-первых, нужно убрать точку с запятой после условия в if - если условие будет выполняться, ничего не будет происходить. А тот блок, который в логике твоего кода должен выполняться при этом условии - будет выполняться всегда , думай об этом так - если бы в твоем коде вообще не было бы этой строки:

if (proverka(DOT_X));

Таким образом, у тебя программа всегда вылетает из цикла (потому что break в этом блоке находится) и даже не доходит до второго if

Ladence
  • 664
  • 4
  • 16