Крестики-нолики в процедурном стиле Java (Часть 1)

Крестики-нолики в процедурном стиле Java

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

На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях.


Комментарии:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *