- Saved searches
- Use saved searches to filter your results more quickly
- pksmall/TicTacToe
- Name already in use
- Sign In Required
- Launching GitHub Desktop
- Launching GitHub Desktop
- Launching Xcode
- Launching Visual Studio Code
- Latest commit
- Git stats
- Files
- README.md
- About
- Познаем основы Java и создаем крестики-нолики
- Nickolas111 / TicTac.java
Saved searches
Use saved searches to filter your results more quickly
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.
Крестики-Нолики на джава. Проект с курса 1 Java от GeekBrains
pksmall/TicTacToe
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Sign In Required
Please sign in to use Codespaces.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching Xcode
If nothing happens, download Xcode and try again.
Launching Visual Studio Code
Your codespace will open once ready.
There was a problem preparing your codespace, please try again.
Latest commit
Git stats
Files
Failed to load latest commit information.
README.md
Крестики-Нолики на джава. Проект с курса 1 Java от GeekBrains
Простая реализация с использованием MVC паттерна и Swing.
Tic-tac-toe on java. Project from the course 1 Java from GeekBrains
Simple implementation using the MVC pattern and Swing.
About
Крестики-Нолики на джава. Проект с курса 1 Java от GeekBrains
Познаем основы 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 в строку описания класса:
Nickolas111 / TicTac.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
import java . io . BufferedReader ; |
import java . io . IOException ; |
import java . io . InputStreamReader ; |
public class TicTac |
// Playing area |
public static char [][] field = |
< < '+' , '+' , '+' >, |
< '+' , '+' , '+' >, |
< '+' , '+' , '+' >>; |
// Computer move (random-bot) |
public static void CompMove () |
int x = ( int ) ( Math . random () * 3 ), y = ( int ) ( Math . random () * 3 ); |
while ( field [ x ][ y ] == ‘0’ || field [ x ][ y ] == ‘X’ ) |
x = ( int ) ( Math . random () * 3 ); |
y = ( int ) ( Math . random () * 3 ); |
> |
field [ x ][ y ] = ‘0’ ; |
> |
// Human move |
public static void HumanMove () throws IOException |
int x = — 1 , y = — 1 ; |
System . out . println ( «Enter y (1..3):» ); |
BufferedReader br = new BufferedReader ( new InputStreamReader ( |
System . in )); |
x = Integer . parseInt ( br . readLine ())- 1 ; |
System . out . println ( «Enter x (1..3):» ); |
y = Integer . parseInt ( br . readLine ())- 1 ; |
while ( field [ x ][ y ] == ‘0’ || field [ x ][ y ] == ‘X’ || x < 0 || x >2 |
|| y < 0 || y >2 ) |
System . out . println ( «Enter y:» ); |
x = Integer . parseInt ( br . readLine ())- 1 ; |
System . out . println ( «Enter x:» ); |
y = Integer . parseInt ( br . readLine ())- 1 ; |
> |
field [ x ][ y ] = ‘X’ ; |
> |
// Output playing area on the screen |
public static void PrintField () |
for ( int i = 0 ; i < 3 ; i ++) |
for ( int j = 0 ; j < 3 ; j ++) |
System . out . print ( field [ i ][ j ]); |
> |
System . out . println (); |
> |
> |
// Verifying the state of the game and whether there are winners |
// Returns the winner symbol or a space character if no one has won yet |
public static char CheckGame () |
char winner = ‘ ‘ ; |
// Verification on the horizontal |
for ( int i = 0 ; i < 3 ; i ++) |
if ( field [ i ][ 0 ] == field [ i ][ 1 ] && field [ i ][ 1 ] == field [ i ][ 2 ] |
&& field [ i ][ 0 ] != ‘+’ ) |
winner = field [ i ][ 0 ]; |
break ; |
> |
> |
// Verification on the vertical if the winner is not found yet |
if ( winner == ‘ ‘ ) |
for ( int i = 0 ; i < 3 ; i ++) |
if ( field [ 0 ][ i ] == field [ 1 ][ i ] && field [ 1 ][ i ] == field [ 2 ][ i ] |
&& field [ 0 ][ i ] != ‘+’ ) |
winner = field [ 0 ][ i ]; |
break ; |
> |
> |
> |
// Verification of the main diagonal if the winner is not found yet |
if ( winner == ‘ ‘ ) |
if ( field [ 0 ][ 0 ] == field [ 1 ][ 1 ] && field [ 1 ][ 1 ] == field [ 2 ][ 2 ] |
&& field [ 0 ][ 0 ] != ‘+’ ) |
winner = field [ 0 ][ 0 ]; |
> |
> |
// Verification the side diagonal if the winner is not found yet |
if ( winner == ‘ ‘ ) |
if ( field [ 0 ][ 2 ] == field [ 1 ][ 1 ] && field [ 1 ][ 1 ] == field [ 2 ][ 0 ] |
&& field [ 0 ][ 2 ] != ‘+’ ) |
winner = field [ 0 ][ 0 ]; |
> |
> |
// Return the winner or a space, if there is none |
return winner ; |
> |
// Check if there are still moves |
public static boolean CanMove () |
boolean p = false ; |
for ( int i = 0 ; i < 3 ; i ++) |
for ( int j = 0 ; j < 3 ; j ++) |
if ( field [ i ][ j ] == ‘+’ ) |
p = true ; |
break ; |
> |
> |
if ( p = true ) |
break ; |
> |
> |
return p ; |
> |
public static void main ( String [] args ) throws IOException |
System . out . println ( «Game Started. » ); |
PrintField (); |
while ( CheckGame () == ‘ ‘ && CanMove ()) |
HumanMove (); |
CompMove (); |
PrintField (); |
> |
if ( CheckGame () == ‘X’ ) |
System . out . println ( «YOU WIN!» ); |
> |
if ( CheckGame () == ‘0’ ) |
System . out . println ( «YOU LOSE!» ); |
> |
if ( CheckGame () == ‘ ‘ && ! CanMove ()) |
System . out . println ( «STANDOFF!» ); |
> |
> |
> |