Untitled

mail@pastecode.io avatar
unknown
java
3 years ago
4.7 kB
2
Indexable
Never
import java.util.Random;
import java.util.Scanner;

public class Main {

    static char [] [] map;
    static final int SIZE = 3;

    static final char DOT_EMPTY = '.';
    static final char DOT_X = 'X';
    static final char DOT_0 = '0';
    static final Random sc = new Random();


    public static void main(String[] args) {
        initMap();
        printMap();

        while (true) {
            /*
            Каждый ход (не важно кто ходил) может быть победным,
            поэтому после каждого хода проверям победил ли ходящий или нет.

            Если человек ходит первым, то при ничье его ход будет и последним,
            поэтому проверям после его хода (точнее после проверки на победу) состялась ли ничья.
             */
            humanTurn();
            printMap();

            if (isHumanWon()) {
                System.out.println("Вы победили!");
                break;
            }

            if (isDraw()) {
                System.out.println("Ничья!");
                break;
            }

            aiTurn();
            printMap();

            if (isAiWon()) {
                System.out.println("Вы проиграли :(");
                break;
            }
        }
    }

    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] = DOT_EMPTY;
            }
        }


    }

    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();
        }
    }

    static void humanTurn()
    {
        Scanner sc = new Scanner(System.in);
        int x;
        int y;

        do
        {
            System.out.println("Введите координаты в формате X Y");
            x = sc.nextInt() - 1;
            y = sc.nextInt() - 1;
        }
        while (!isCellValid(x, y));

        map[y][x] = DOT_X;
    }

    static void aiTurn()
    {
        int x;
        int y;

        do {
            x = sc.nextInt(SIZE);
            y = sc.nextInt(SIZE);
        }
        while (!isCellValid(x, y));

        System.out.println("Компьютер сходил в точку" + (x + 1) + (y + 1));
        map[y][x] = DOT_0;

    }

    static boolean isCellValid(int x, int y)
    {
        if (x < 0 || x >= SIZE || y < 0 || y >= SIZE)
        {
            return false;
        }

        return map[y][x] == DOT_EMPTY;
    }

    static boolean isHumanWon() {
        return checkWinner(DOT_X);
    }

    static boolean isAiWon() {
        return checkWinner(DOT_0);
    }

    static boolean isDraw() {
        boolean result = true;

        for (int i = 0; i < SIZE; i++) {
            for (int j = 0; j < SIZE; j++) {
                if (map[i][j] == DOT_EMPTY) {
                    result = false;
                    break;
                }
            }
        }

        return result;
    }

    static boolean checkWinner(char symbol) {
        // Выйгрышные состояния по вернтикали
        if (map[0][0] == symbol && map[0][1] == symbol && map[0][2] == symbol) {
            return true;
        }

        if (map[1][0] == symbol && map[1][1] == symbol && map[1][2] == symbol) {
            return true;
        }

        if (map[2][0] == symbol && map[2][1] == symbol && map[2][2] == symbol) {
            return true;
        }

        // Выйгрышные состояния по горизонтали
        if (map[0][0] == symbol && map[1][0] == symbol && map[2][0] == symbol) {
            return true;
        }

        if (map[0][1] == symbol && map[1][1] == symbol && map[2][1] == symbol) {
            return true;
        }

        if (map[0][2] == symbol && map[1][2] == symbol && map[2][2] == symbol) {
            return true;
        }

        // Выйгрышные состояния по диагоналям
        if (map[0][0] == symbol && map[1][1] == symbol && map[2][2] == symbol) {
            return true;
        }

        if (map[0][2] == symbol && map[1][1] == symbol && map[2][0] == symbol) {
            return true;
        }

        return false;
    }
}