Крестики-нолики в процедурном стиле Java (Часть 1)
Всем доброго времени. На связи Алексей Гулынин. На досуге решил немного изучить Java. В результате решил написать игру "Крестики-нолики" в процедурном стиле, чтобы изучить базовые возможности языки, такие как типы переменных, циклы, операторы, методы, условный оператор, работа с буфером и т.д. В качестве IDE решил использовать "IntelliJ IDEA". Далее последует много кода, каждый метод будет кратко прокомментирован.
Скачать уже готовый проект полностью можно по ссылке.
Объявим переменные, которые будем использовать в наших методах. "field" — это наше игровое поле, которое является двумерным массивом типа String (будет инициализироваться "*"). "DIMENSION" — это размерность поля. "aiLevel" — это некое подобие искусственного интеллекта (0 в данном случае означает, что никакого интеллекта нет, компьютер будет случайно делать ход). Далее мы реализуем логику интеллекта.
public static final String USER_SIGN = "X"; public static final String USER_SIGN_SECOND = "O"; public static final String AI_SIGN = "O"; public static final String NOT_SIGN = "*"; public static int aiLevel = 0; public static final int DIMENSION = 3; public static String[][] field = new String[DIMENSION][DIMENSION];
В методе main(), который является точкой входа в программу, вызывается "mainMenu()", в котором будет определен режим игры
public static void main(String[] args) { mainMenu(); }
Далее мы реализуем метод "mainMenu()", в котором научимся вводить и считывать значения с консоли и рассмотрим конструкцию "switch — case"
public static void mainMenu() { System.out.println("Выберите режим игры: "); System.out.println("1. Игра против компьютера."); System.out.println("2. 2 игрока."); System.out.println("3. Выход."); int i = 0; Scanner sc = new Scanner(System.in); // Считываем значение с консоли и сохраняем его // в переменную i i = sc.nextInt(); switch (i) { case 1: { aiLevel(); break; } case 2: { modeTwoPlayers(); break; } case 3: { System.exit(0); break; } default: { System.out.println("Было введено неверное значение!"); } } }
Далее напишем метод modeTwoPlayers(), в котором инкапсулирована логика для игры двух игроков. Здесь мы рассмотрим такие конструкции, как цикл "while", условный оператор. Что здесь написано: "while (true)" — это бесконечный цикл. Выход из бесконечного цикла будет осуществляться по определенным условиям: победа одного из участников, либо когда все ячейки заполнены (ничья). "userShot()" — это ход игрока. "checkWin()" — проверка победы.
public static void modeTwoPlayers() { int count = 0; initField(); while (true) { printField(); userShot(USER_SIGN, 1); count++; if (checkWin(USER_SIGN)) { System.out.println("USER 1 WIN!!!"); printField(); break; } userShot(USER_SIGN_SECOND, 2); count++; if (checkWin(USER_SIGN_SECOND)) { System.out.println("USER 2 WIN!!!"); printField(); break; } if (count == Math.pow(DIMENSION, 2)) { printField(); break; } } }
В методе modeAgainstAI() мы реализуем режим игры против компьютера. Данный метод является практически копией предыдущего метода. Отличие заключается в том, что здесь реализован метод aiShot(), который отвечает за логику хода компьютера:
public static void modeAgainstAI() { int count = 0; initField(); while (true) { printField(); userShot(USER_SIGN, 0); count++; if (checkWin(USER_SIGN)) { System.out.println("USER WIN!!!"); printField(); break; } aiShot(); count++; if (checkWin(AI_SIGN)) { System.out.println("AI WIN!!!"); printField(); break; } if (count == Math.pow(DIMENSION, 2)) { printField(); break; } } }
Далее напишем методы инициализации поля и вывод поля в консоль. Здесь мы рассмотрим цикл "for":
public static void initField() { for (int i = 0; i < DIMENSION; i++) { for (int j = 0; j < DIMENSION; j++) { field[i][j] = NOT_SIGN; } } } public static void printField() { for (int i = 0; i <= DIMENSION; i++) { System.out.print(i + " "); } System.out.println(); for (int i = 0; i < DIMENSION; i++) { System.out.print((i + 1) + " "); for (int j = 0; j < DIMENSION; j++) { System.out.print(field[i][j] + " "); } System.out.println(); } }
В данной первой статье, посвященной реализации крестиков-ноликов в процедурном стиле мы изучили некоторые возможности языка Java. В следующей статье мы разберем самое интересное: реализацию хода компьютера и определение победителя.
На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях.