Крестики-нолики в процедурном стиле 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. В следующей статье мы разберем самое интересное: реализацию хода компьютера и определение победителя.
На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях.




