Код программы крестики нолики на java

Прежде чем писать код, надо взять карандаш, бумагу и попробовать прорисовать работу программы.

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

Игровое поле:

class GameTable < public GameTable(int row, int col) < . >// Выполнение хода игроком // Параметр Player player — игрок с методом player.getChip() // return есть ли выигрышная комбинация (true), или нет (false) public boolean move(Player player) < // Здесь игрок player выбирает не занятую/свободную ячейку и помещает // на нее свою фишку player.getChip() return this.checkWinCombination(selectedRow, selectedColumn); >// Проверяет заполненность стола. Если заполнен и ходов больше сделать нельзя, // то true, иначе false public boolean isFull() < >// Метод проверки выигрышной комбинации, начиная с заданной ячейки row, col private boolean checkWinCombination(int row, int col) < // Берем ячейку и пробегаем смежные ячейки по горизонтали, // вертикали и диагоналям в поисках выигрышной последовательности // Если нашли, то return true // иначе false >>

Игрок:

Введение в программирование. Пример: крестики-нолики


class Player < // name — имя игрока // chip — фишка игрока public Player(String name, String chip) < >public String getName() < >public String getChip() < >>

Инициализация

//Список игроков: List players = new ArrayList<>(); // Игровое поле GameTable gameTable = new GameTable(3, 3); // Создаем игроков // Первый параметр — имя игрока, второй — тип фишки (chip) Player player1 = new Player(«Крестик», «X»); Player player2 = new Player(«Нолик», «0»); players.add(player1); players.add(player2);

Игровой процесс

Ходят игроки последовательно друг за другом до тех пор пока один из них не выставит свои фишки в ряд (горизонтально, вертикально, или по-диагоналям).

Ага, так, последовательно, друг за другом, пока кто-то не будет признан выигравшим после проверки очередного хода на выполненную/выигрышную комбинацию:

// Ссылка на победителя Player winner = null; // Индекс текущего игрока int currentPlayerIndex = 0; // Цикл будет крутиться до тех пор, пока внутри него игроки будут делать ходы и // либо один из них не выиграет, либо пока не заполнится игровое поле while(true) < Player player = players.get(currentPlayerIndex); if ( gameTable.move( player ) ) < // у нас есть победитель winner = player; break; >else if (gameTable.isFull()) < break; >// Если нет победителя и на доске еще есть место для ходов, то // меняем индекс текущего игрока, чтобы передать ход другому. // Здесь мы увеличиваем индекс на единицу и делим по модулю на // количество игроков, тем самым избегая «выскакивания» индекса за пределы массива currentPlayerIndex = ++currentPlayerIndex % players.size(); > if ( winner != null ) < System.out.print(» Победитель: » + player.getName()); >else

Источник: ru.stackoverflow.com

Live coding консольной игры в крестики-нолики на Java в процедурном стиле

Код программы крестики нолики на java

Java — это не только язык, это целая экосистема, включающая в себя средства разработки, платформу для запуска готовых приложений, огромный свод документации и активное сообщество. Одним из преимуществ Java на начальном этапе была кроссплатформенность (принцип — «написано один раз — запускается везде»).

Дело в том, что программа на Java исполняется не на прямую процессором компьютера, а виртуальной машиной Java (JVM). Это позволяет абстрагироваться от многих нюансов конкретных платформ. Программу, написанную на Java, можно без изменений кода запускать на Windows, Linux, MacOS и других операционных системах (если, конечно, программа не использует специфичные для ОС функции). Кто застал начало 2000х, наверное помнит огромное количество мобильных телефонов (тогда еще они не были смартфонами), на каждом телефоне была по сути своя маленькая ОС, но при этом почти на каждом можно было запустить Java игру или приложение.

На сегодняшний день Java по-прежнему входит в топ языков для изучения, а Java как платформа — в топ используемых технологий в мире IT и смежных областях.

Создание проекта, первые шаги

Сегодня мы начнем изучать Java, причем сразу с примера игры Крестики-Нолики.

Итак, поехали. Надеюсь как установить java SDK ты уже разобрался. Мы будем писать код в IDE IntelliJ IDEA, но если у вас какая-то другая, например Eclipse, то разницы большой не будет.

Итак, создаем новый проект: нажимаем «create new project», выбираем java и щелкаем «next» до окна, где требуется ввести имя проекта, вводим TicTacToe (крестики-нолики). В некоторых случаях на этапе создания потребуется выбрать шаблон проекта, тогда смело выбирай что-либо похожее на JavaConsoleApplication.

Читайте также:
Как принудительно закрыть программу на удаленном рабочем столе

После этого нажимаем «Finish». Idea немного подумает и сгенерирует нам проект с классом Main, в котором определена функция main().

Давайте разберемся, что здесь что. Слева открыто окно структуры проекта «Project», как мы видим в папке src в пакете com.company находится единственный java-файл нашей программы с именем Main. Справа показано его содержимое. Тут надо сделать небольшое отступление, дело в том, что в Java почти все представлено классами.

В том числе и файлы программы описывают классы, причем имя файла должно совпадать с классом, который описывается в этом файле (например, у нас файл Main.java описывает класс Main). Пусть слово «класс» не смущает на первом этапе. Пока лишь отмечу, что для глубокого изучения Java так или иначе придется познакомиться с объектно-ориентированным подходом.

В двух словах, класс можно воспринимать как шаблон, идею, а экземпляры класса — как реализацию этой идеи. Экземпляры класса называются его объектами. Например, вы можете представить идею стола (нечто, на что можно класть предметы), однако конкретных экземпляров такого стола огромное множество (на одной ножке, на четырех, круглые, квадратные, из разных материалов). Примерно так соотносятся классы и объекты в объектно-ориентированном программировании.

Внутри нашего класса Main описана функция main(), в Java с этой функции начинается исполнение программы, это точка входа в наше приложение. Сейчас там написан только автоматический комментарий (комментарии в Java начинаются с двух символов //). Попробуем кое-что добавить в наш код и проверить работоспособность приложения. Внутри функции main() допишем две строки:

Встроенная функция println() просто выводит на экран текстовую информацию. Запустим наше приложение (нажимаем shift-F10 или зеленый треугольник). Внизу, во вкладке run появится вывод нашей программы:

Функция main() отработала и закончилась, вместе с ней закончилась наша программа.

В игре пользователю конечно захочется взаимодействовать с программой более продвинутым способом, поэтому нам понадобится окно. Набираем внутри функции main() следующие строки:

Смысл большинства строк понятен из комментариев к ним, отдельно отмечу строку window.setLayout() — здесь устанавливается менеджер расположения, который будет применяется к компонентам, добавляемым в наше окно. Менеджер BorderLayout может располагать новые компоненты относительно сторон света (North(верх), West(слева), East(справа), South(низ)), Center (центр)). По умолчанию он располагает компоненты по центру. Подробнее с менеджерами расположения можно познакомиться в документации.

Теперь, если запустить нашу программу, мы увидим окно:

Пока в этом окне ничего нет. Создадим свой компонент, который и будет отрисовывать графику игры.
Свой компонент для рисования

Очевидно, что рисовать в консоли у нас не получится, нужен какой-то компонент для более продвинутого взаимодействия с пользователем. Для этой цели создадим еще один класс, назовем его TicTacToe. Щелкаем правой клавишей мыши на имени пакета приложения (в данном случае это com.company)

И в появившемся меню выбираем пункт «New» → «Java Class». В окне создания класса набираем его имя «TicTacToe» и нажимаем «Enter».

У нас в проекте появился еще один класс. В главное окно можно добавлять только объекты класса JComponent, кроме того, нам нужна область для рисования. Поэтому наследуем наш класс TicTacToe от JComponent. Ой сколько непонятных слов! Сейчас постараюсь пояснить. Наследование классов — это как создание уточненного шаблона на базе существующего.

Например, есть класс Стол, описывающий идею стола вообще. Но нам очень часто приходится создавать столы на четырех ногах с деревянной столешницей, поэтому для удобства мы можем уточнить идею класса Стол и создать шаблон ДеревянныйСтол — он будет иметь все те же основные свойства, что и родительская идея, но зато часть свойств у него уже определены и понятны — это число ног, равное четырем и материал столешницы — дерево.

С JComponent то же самое — данный класс реализует идею некоторого графического компонента пользовательского интерфейса. Такой компонент можно добавить в окно и он умеет как-то себя отрисовывать. Например, класс JButton — наследник класса JComponent, это компонент, который выглядит, как кнопка и умеет показывать анимацию клика мышкой. Здесь же, наследуя класс JComponent, мы создадим свой компонент, в котором сможем рисовать то, что нам нужно.

Читайте также:
Программа посмотреть как записан в телефоне у других называется на Андроид

Итак дописываем extends JComponent в строку описания класса:

Слово extends говорит о том, что наш класс TicTacToe расширяет (наследует) класс JComponent.

У всех компонентов есть метод paintComponent(), который отвечает за их отрисовку. В параметры этого метода приходит объект Graphics, с помощью которого мы и будем рисовать то, что нам необходимо. Давайте переопределим метод paintComponent так, чтобы он рисовал окружность (это необязательно, но для проверки, что у нас все работает как надо, будет хорошим тоном это сделать).

Переопределим метод paintComponent() в классе TicTacToe следующим образом:

метод setColor() объекта graphics, как очевидно из названия, устанавливает цвет, которым мы будем рисовать, а метод drawOval(x ,y, w, h) — в общем случае рисует овал с координатами центра x, y, шириной — w и высотой h. В данном случае рисуется окружность, так как ширина и высота заданы одинаковые — 100. Замечу, что экранные координаты отсчитываются от левого верхнего угла. То есть 0 по вертикали находится вверху.

Чтобы проверить, как выглядит наш объект класса TicTacToe надо создать его экземпляр и добавить в главное окно в качестве дочернего компонента. Создание новых объектов в Java осуществляется с помощью ключевого слова new. Например, если у нас есть класс Стол и мы хотим создать объект этого класса (настоящий конкретный стол), то мы должны написать что-то такое: стол = new Стол().

Здесь «стол» имя, по которому мы будем обращаться к нашему объекту (взаимодействовать с ним), а Стол — имя класса, объект которого мы создаем. Замечу сразу, что вместо «стол» мы могли написать любое имя, например «fdgdgdgfd», но программисты обычно стараются давать «говорящие» имена объектам, чтобы код было легче читать. Чтобы создать экземпляр класса TicTacToe мы можем также написать game = new TicTacToe(), а потом добавить его в окно методом add().

Теперь код класса Main выглядит вот так:

Если теперь запустить нашу программу, то мы увидим окно с окружностью:

Ну что ж. Рисовать в базе мы научились. Время приступать к созданию игры.
Создание игрового поля

Вернемся к классу TicTacToe. Для начала необходимо нарисовать игровое поле, состоящее из девяти клеточек. Для этого давайте нарисуем две горизонтальные и две вертикальные линии на нашем поле. Чтобы это сделать, воспользуемся методом drawLine(x1,y1,x2,y2) объекта Graphics, который приходит к нам в метод paintComponent() в качестве параметра. Метод drawLine() рисует линию от точки с координатами x1,y1 до точки x2,y2.

Давайте подумаем как нарисовать игровое поле.

Если мы разобьем высоту поля на три (у нас же три клетки в ряду), то получим высоту одной клетки (назовем ее dh). Узнать высоту всего компонента можно методом getHeight(). Значит, мы должны нарисовать первую горизонтальную линию от точки 0,dh до точки w, dh, где w — ширина поля. Но это только одна горизонтальная линия, вторую рисуем также, но координаты будут уже: начало — 0, 2*dh, конец w, 2*dh. По аналогии, если высота поля равна h, а ширина одной клетки равна dw, то вертикальные линии рисуются в координатах dw,0 — dw,h и dw*2, 0 — dw*2, h.

Теперь давайте немного поговорим о переменных. Если помните — в алгебре за буквой могло скрываться какое-то значение, например выражение x = 2*a, подразумевало, что на место буквы а можно подставить любое значение и вычислить x. Примерно то же самое происходит с переменными в программировании.

Имя переменной (идентификатор) сопоставлен с некоторым значением и «хранит» его «в себе» (на самом деле, с объектами классов все несколько сложнее, там мы имеем дело со ссылками, но это пока за рамками данного материала). Помимо этого, в программах есть разные типы данных. Наверное, вы согласитесь, что строку и целое число надо хранить в памяти как-то по-разному? Даже целые и дробные числа требуют разного подхода, поэтому в программах данные соответствуют определенным типам. В нашем примере нам уже понадобились значения ширины и высоты ячейки игрового поля dw и dh. Чтобы вычислить и сохранить их значения в памяти, воспользуемся следующими выражениями:

Здесь int — означает тип данных «целое число». Выражение int a = 10 объявляет переменную с именем a и задает ей сразу значение 10. В нашем примере создаются четыре переменных, значения w и h получаются из методов самого компонента TicTacToe, а dw и dh вычисляются. Обратите внимание, что при делении w / 3 получается целый тип данных.

Читайте также:
Список программ для установки на новый компьютер

В Java, как и во многих других языках, деление целого на целое дает в результате целое. При этом дробная часть просто отбрасывается (округления нет). Заметьте, что здесь не используется слово «new», так как создаются не объекты, а переменные простых (скалярных) типов данных, в данном случае типа int.

Крестики-нолики Java Swing (часть 1)

Крестики-нолики Java Swing (часть 1)

Всем доброго времени суток. На связи Алексей Гулынин. В прошлых статьях, посвященных Java, мы написали игру в процедурном стиле. В данной статье я бы хотел начать писать игру «Крестики-нолики» в объектном стиле с графическим интерфейсом, используя библиотеку Swing . Данная задача поможет разобраться в объектно-ориентированном программировании на Java.

Скачать уже готовый проект полностью можно по ссылке.

Для начала создадим абстрактный класс AGamer , от которого будут наследоваться 2 других наших класса — Player и AI :

public abstract class AGamer < // метка protected String sign; // выстрел в координаты x и y abstract boolean shot(int x, int y); // проверка победы abstract boolean win(); >

Реализуем класс игрока — Player :

public class Player extends AGamer < // экземпляр нашего поля MainGameField gameField; // готовность к стрельбе, если = 0 // то ходит другой игрок int isShotReady = 1; // Конструктор public Player(String sign) < this.sign = sign; >// Выстрел игрока boolean shot(int x, int y) < gameField = MainGameField.getInstance(); if (!gameField.isCellBusy(x, y)) < gameField.cell[x][y] = sign; return true; >return false; > // Проверка победы boolean win() < gameField = MainGameField.getInstance(); return gameField.checkWin(this.sign); >>

Реализуем класс компьютера — AI . Здесь логика точно такая же, как и с примером в процедурном стиле. Скопирую описание данного метода из прошлой статьи:

В случае «aiLevel = 0» используется объект класса Random. В данном случае компьютер просто ходит случайным образом на любую незанятую ячейку.

В случае «aiLevel = 1» компьютер анализирует ситуацию, при которой игрок может выиграть на следующем ходу. Если такой выигрышный ход существует, то компьютер ходит на эту ячейку. Как это реализовано: в двойном цикле проверяются все ячейки, и компьютер в каждую незанятую ячейку ставит метку игрока («field[i][j] = USER_SIGN»). Далее с помощью метода «checkWin()» проверяется является ли данный ход выигрышным, если да, то эти координаты запоминаются, и компьютер ставит на них свою метку (AI_SIGN). После каждого анализа ячейка обнуляется ((«field[i][j] = NOT_SIGN»).

В случае «aiLevel = 2» логика работы такая же, как и на первом уровне. Только в данном случае компьютер анализирует свой ход и, если он является выигрышным, ходит.

import java.util.Random; public class AI extends AGamer < // Экземпляр игрового поля MainGameField gameField; String playerSign = «»; // Уровень интеллекта static int aiLevel = 0; // Конструктор public AI(String sign, int aiLevel, String playerSign) < this.sign = sign; this.playerSign = playerSign; this.aiLevel = aiLevel; >// Выстрел компьютера boolean shot(int x, int y) < gameField = MainGameField.getInstance(); x = -1; y = -1; boolean ai_win = false; boolean user_win = false; // Находим выигрышный ход if (aiLevel == 2) < for (int i = 0; i < gameField.linesCount; i++) < for (int j = 0; j < gameField.linesCount; j++) < if (!gameField.isCellBusy(i, j)) < gameField.cell[i][j] = sign; if (gameField.checkWin(sign)) < x = i; y = j; ai_win = true; >gameField.cell[i][j] = gameField.NOT_SIGN; > > > > // Блокировка хода пользователя, если он побеждает на следующем ходу if (aiLevel > 0) < if (!ai_win) < for (int i = 0; i < gameField.linesCount; i++) < for (int j = 0; j < gameField.linesCount; j++) < if (!gameField.isCellBusy(i, j)) < gameField.cell[i][j] = this.playerSign; if (gameField.checkWin(this.playerSign)) < x = i; y = j; user_win = true; >gameField.cell[i][j] = gameField.NOT_SIGN; > > > > > if (!ai_win !user_win) < do < Random rnd = new Random(); x = rnd.nextInt(gameField.linesCount); y = rnd.nextInt(gameField.linesCount); >while (gameField.isCellBusy(x, y)); > gameField.cell[x][y] = sign; return true; > boolean win() < gameField = MainGameField.getInstance(); return gameField.checkWin(this.sign); >>

Создадим класс MainForm , который будет отрисовывать основную форму:

Напоследок создадим основной класс MainClass , из которого мы будем запускать нашу игру:

public class MainClass < public static void main(String[] args) < MainForm gameForm = new MainForm(); >>

В следующей статье мы напишем 2 класса GameSettingsForm и MainGameField .

В данной статье мы начали писать игру «Крестики-нолики» с графическим интерфейсом.

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

Источник: alekseygulynin.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru