Найти в Дзене

Первые результаты (Игра на Java «Совы против Хомяков»)

К началу: Пролог. К предыдущей статье: Планы. Месяц назад я решил, что хочу заглянуть в мир программирования. Языком, с которого мне бы хотелось начать это путешествие был выбран язык Java. Пришло время подвести первые итоги. Что за один месяц мог познать человек, который никогда в жизни не программировал ни на чем? Чему он мог научиться и что сделать? Ответами на эти вопросы я и поделюсь с тобой, мой Дневничок, в этом посте. Сразу раскрою карты. Результатом моих начинаний в программировании и полигоном для отработки получаемых знаний стала маленькая программка. Из предыдущих постов ты уже знаешь, что я люблю игры, соответственно и программка эта представляет из себя некий игровой процесс. Задачи прыгнуть выше головы и сделать что-то сложное не было от слова совсем, поэтому за основу я решил взять отлично знакомые всем из детства крестики-нолики. Но делать банальные крести-нолики – это же совсем не интересно. Да и какие там могут быть задачи для программирования? Раз-два и обчёлся. П

К началу: Пролог. К предыдущей статье: Планы.

Месяц назад я решил, что хочу заглянуть в мир программирования. Языком, с которого мне бы хотелось начать это путешествие был выбран язык Java. Пришло время подвести первые итоги. Что за один месяц мог познать человек, который никогда в жизни не программировал ни на чем? Чему он мог научиться и что сделать? Ответами на эти вопросы я и поделюсь с тобой, мой Дневничок, в этом посте.

Сразу раскрою карты. Результатом моих начинаний в программировании и полигоном для отработки получаемых знаний стала маленькая программка. Из предыдущих постов ты уже знаешь, что я люблю игры, соответственно и программка эта представляет из себя некий игровой процесс. Задачи прыгнуть выше головы и сделать что-то сложное не было от слова совсем, поэтому за основу я решил взять отлично знакомые всем из детства крестики-нолики. Но делать банальные крести-нолики – это же совсем не интересно. Да и какие там могут быть задачи для программирования? Раз-два и обчёлся. Поэтому я решил сделать тюнинг этой игры и назвать её «Совы против Хомяков». Этот самый тюнинг позволил мне ставить перед собой определённые задачи и двигаться к их реализации.

"Совы против Хомяков" Изучение Java на примере создания простенькой игры.
"Совы против Хомяков" Изучение Java на примере создания простенькой игры.

Начал я своё знакомство с языком Java, естественно, не сразу с желания создать игру или какую бы то ни было программу. Сначала нужно было понять, что это вообще за язык, как он устроен и как работает, что такое JVM и JRE, в какой среде мне писать код, что такое объектно-ориентированные языки в целом, какой у Java синтаксис, что такое классы, методы и переменные, их виды и их предназначения. Как работают циклы, условия, массивы и прочие моменты, которые у меня вызвали ассоциации, больше связанные с математикой нежели с программированием. И ещё куча-куча всего, что даже перечислять долго. В общем, для начала потребовалось влить в себя довольно большой поток чисто теоретических знаний. И да, благодаря этим знаниям, я прекрасно понимал, что Java не тот язык, на котором нужно писать игру, но это совсем не означает, что это невозможно. А так как моей целью была не сама игра как таковая, а скорее создание полигона для практики тех крупиц знаний, которые я получал, то почему бы и не практиковать это на игре? Если сказать грубо, то какая разница, где будут исполняться написанные тобой алгоритмы? Главное, чтобы они работали, и работали именно так как было задумано.

Следующим вопросом для меня стала визуализация написанного мной кода. Т.е. в каком виде я хочу лицезреть результат работы программы. Консольный вариант игры («общение» с программой через командную строку) это ну уж слишком скучно, поэтому я выбрал GUI, графический интерфейс пользователя. Это то, что любой пользователь видит, открывая программу – окно, в котором можно совершать те или иные действия тыкая мышкой или барабаня по клавиатуре. Опять же, на сколько я успел понять, в настоящее время по целому ряду причин не практикуется написание интерфейсов программы на Java, но это снова не означает, что это невозможно. Инструменты есть, это Swing и JavaFX. В работе Java-программиста эти инструменты, наверное, вряд ли пригодятся, но для моих целей это самое то что нужно. Swing это более древний инструмент, кто-то даже, наверное, назовет его мёртвым. Ему на смену в своё время пришла JavaFX. Тем не менее для себя я выбрал именно Swing. По двум причинам. Во-первых, он является прародителем JavaFX, и не понимая, как он работает и что вообще делает, разобраться в JavaFX мне было бы сложнее. Во-вторых, Swing – это довольно мощная библиотека, которая с лихвой покрыла все мои потребности в задуманном проекте. И сейчас, когда я в той или иной мере разобрался со Swing, я могу с уверенностью утверждать, что при желании или при необходимости я смогу освоить JavaFX с гораздо меньшими для себя трудностями.

Ну а игровое окошко, написанное на Swing, вышло у меня вот таким.

Главное меню игры "Совы против Хомяков".
Главное меню игры "Совы против Хомяков".

И теперь, наверное, нужно объяснить, что же у меня получилась за игра, что я в ней задумывал и как эти задумки выглядят после их реализации.

Начнем со скучного. Управление окном.

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

Верхний левый угол. Играть в тишине скучновато, нужно было реализовать фоновую музыку и самые элементарные инструменты управления ей – выключать при необходимости и контролировать громкость. Здесь опять же, с выключением проблем не было, а с громкостью пришлось поизвращаться. Этим я занимался почти в самом конце, когда уже познакомился с понятием потоков, поэтому в целом данная задача тоже была не особо сложной. Так появилось 2 варианта музыкального сопровождения игры.

В самом низу окна кнопка «Начать все сначала». Нужно же как-то перезапускать игру после завершения партии. Тут основная проблема в том, что по сути мы не можем перезапустить программу, не завершив её, т.е. не закрыв окно, поэтому данная кнопка не совсем Рестарт, а скорее ПсевдоРестарт. Метод, который приводит игровое окно к стартовому состоянию, не трогая при этом то, что нужно «запомнить».

Теперь к более интересному. Непосредственно сама игра.

Повторюсь, по сути это абсолютно стандартные крестики-нолики. Сова будет сражаться против Хомяка. Сражаться в Смертельной Битве (это маленький спойлер).

Существует 4 режима игры.

PvP. Как и в реальной жизни, вы с товарищем поочерёдно совершаете ходы. Всё просто. Программа лишь отображает ваши ходы и сообщает вам кто выиграл. Почему офлайн, думаю, понятно. Игра происходит за одним компьютером. Можно ли сделать онлайн версию? Думаю, нет ничего невозможного, но пока я перед собой такую задачу не ставил.

PvE. А здесь вы играете против самой программы. И в зависимости от выбранной сложности, программа будет проявлять тот или иной уровень «мастерства» в этой незамысловатой битве. Если на легком режиме «интеллекта» вашего компьютерного соперника хватит только на то, чтобы понимать какая клетка свободна и совершать туда свой ход, то на сложном режиме, при малейшей вашей ошибке программа вас 100% обыграет. Но даже если вы мастер игры в крестики-нолики, максимум на что вы можете рассчитывать в этом режиме - это ничья. Программа просто не даст вам выиграть. Возникает закономерный вопрос – зачем нужен режим игры, в котором нельзя победить? Ответ прост, как я и говорил, для меня это не совсем игра, это полигон. Была задача запрограммировать «мастера игры» не знающего поражений. И именно эту задачу я осуществлял в данном режиме. Режим же с нормальной сложностью подразумевает, что вы играете вроде как не с абсолютным дурачком, но и не с «гуру», поэтому совсем легко выиграть не получится, программа будет этому сопротивляться, но если вы действительно умеете играть, то выиграть в большинстве случаев не составит труда.

Статистика игровой сессии.

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

Кто ходит первым?

По правилам крестиков-ноликов, обычно, первый ход всегда за крестиками, но у нас же Совы и Хомяки. С какой стати отдавать преимущество одному из персонажей? Значить нужно устроить жребий. Вот и ещё одна задача, требующая реализации.

Жребий определяет чей ход будет первым.
Жребий определяет чей ход будет первым.

Получилась мини игра в нашей мини игре. Сова и Хомяк бросают кубики, и по результатам этого жребия определяется кто будет ходить первым. С точки зрения программирования все тоже довольно несложно. При старте жребия создаётся обыкновенный одномерный массив, содержащий целочисленные элементы в количестве 4 штук. Значения каждого элемента рандомно определяются в пределах от 1 до 6. Два принадлежат Сове, два – Хомяку. Сумма каждой пары и определяет победителя жребия. Остается только прорисовать те или иные кубики в соответствующих местах и в соответствии со значениями элементов массива.

Кто Хомяк, а кто Сова?

В PvP режиме этот вопрос не актуален. Как вы между собой распределили роли, так и играете. А вот в PvE режиме программа должна понимать за кого ей играть. В принципе задача банальная, нужно всего лишь указать за кого хотите играть ВЫ, нажав соответствующую кнопку. Но что бы всё было не так скучно с точки зрения программного кода, я решил немного усложнить задачу, и на моменте выбора вами персонажа, вывести некий текст, описывающий как Хомяка, так и Сову, причём вывести его не просто статичным текстом, а создав иллюзию набора этого текста.

"Да прибудут с тобой Крылья, Сова!" и "Да прибудут с тобой Щёки, Хомяк!"
"Да прибудут с тобой Крылья, Сова!" и "Да прибудут с тобой Щёки, Хомяк!"

Одновременный, параллельный набор текста. Зачем? Потому что полигон. Ещё раз посмотреть, как работают потоки. Да и выглядит забавно, результат мне понравился.

Смертельная Битва!

Почему битва, а не партия? Потому что это в крестиках-ноликах партия, а между Хомяком и Совой по замыслу должна происходить настоящая битва! Соответственно каждый ход – это удар. Не просто удар, а определённый приём, который проводит наш боец. Все эти удары/приёмы (в стиле пьяного ниндзя) записываются в своеобразный лог битвы (под аватарками), а возникновение ситуации 3 в ряд или по диагонали означает Комбо, что приводит к «смертельному» удару. Ну и раз уж это битва, то у персонажей должно быть HP, уровень здоровья, который уменьшается после каждого пропущенного удара. Собственно, на примере этих ProgressBar’ов, которые я приспособил под шкалу HP, я и узнавал об одном из важнейших понятий, а именно о многопоточности, что такое потоки и как ими управлять.

Смертельная Битва Совы и Хомяка.
Смертельная Битва Совы и Хомяка.

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

В целом же, резюмируя, могу сказать, что программировать мне очень понравилось. Язык Java мне тоже очень приглянулся, у него, конечно, есть свои недостатки, но освоить его азы и создать простенькую программку типа описанной выше, сможет, наверное, кто угодно. А изучив его на более серьёзном уровне, думаю, можно создавать проекты весьма внушительных масштабов. Поэтому я ничуть не жалею, что начал своё знакомство с программированием именно с Java. Подходит ли этот язык именно для меня, пока не знаю. Но то что продолжу его изучать – это точно. А дальше посмотрим.

Следующая статья: Знакомство с Android. Своё первое приложение.