Дизайн и реализация игры Tank War на основе JavaSwing

Java разработка игр
Дизайн и реализация игры Tank War на основе JavaSwing

Это 18-й день моего участия в августовском испытании обновлений. Ознакомьтесь с подробностями мероприятия: Испытание августовского обновления

      Помните легендарную классическую танковую битву 90-х? Эти ностальгические воспоминания, сопровождаемые классическим танковым сражением, которое мы прошли вместе, сцена дрожи в начале и многократного уничтожения вражескими танками живы в моей памяти. Что ж, теперь не беспокойтесь о вражеских танках, вы можете буйствовать и зачищать вражеские танки. Как программист, я могу просто использовать знания, связанные с Java, которые я изучил, чтобы создать игру про танковые сражения.Давайте посмотрим, как она устроена.

анализ спроса:

Прежде всего, игра должна иметь графический пользовательский интерфейс, отражающий все детали игры.

В интерфейсе должны быть танки, стены, леса и реки.

В интерфейсе должен быть «дом», и если «дом» будет атакован, игра будет проиграна.

Есть два типа танков, вражеские и наши.

Стены также делятся на два типа: обычные стены, через которые можно пройти, и железные стены, через которые нельзя пройти.

Есть только один тип дерева и реки, и лесной танк может пройти.

Танки могут стрелять пулями, причем свойства пуль противника и союзников одинаковы.

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

Враги не могут убить друг друга.

Пуля попадает в танк, чтобы взорваться, но не в стену.

Мы можем есть пакеты с кровью, чтобы увеличить жизнь.

Игру можно поставить на паузу, перезапустить, помощь в игре и другие функции. Как показано ниже

Особенности дизайна:

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

2. Интерфейс содержит танки, деревья, реки, блокирующие стены и «дома», которые пользователи игры хотят защитить.

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

4. Деревья: Деревья должны быть включены в интерфейс в качестве маскирующих и декоративных объектов, чтобы увеличить элементы игры и сделать игру более гуманизированной. Количество деревьев не ограничено, а количество определяется понятным и красивым интерфейсом игры.

5. Реки: Реки должны быть включены в интерфейс.Функция рек та же, что и у лесов.Точно так же количество рек не ограничено.Количество рек определяется общей эстетикой игрового интерфейса.

6. Стены: Есть два типа стен, обычные стены и железные стены.Обычные стены будут повреждены при атаке пулями, в то время как железные стены могут препятствовать прохождению пуль. Танки с обеих сторон не могут пройти ни через одну из стен, но обе могут разрушить обычные стены. Количество обычных стен должно быть разумно расставлено с другими элементами, а железных стен не должно быть слишком много, иначе сложность игры будет слишком низкой, и игра не сможет продолжаться, потому что танки не смогут пройти через железные стены.

7. "Дом": у пользователя есть дом для защиты в дополнение к собственному танку. Дом окружен обычными стенами. Игра заканчивается сразу после того, как дом атакован пулями, и пользователь проигрывает игру.

8. Пули: пули могут быть выпущены противником и пользователем, и выпущенные пули могут двигаться по прямой линии, пока не исчезнут при столкновении с препятствием, и пули могут проходить сквозь деревья и реки. При попадании пули во вражеский танк он взрывается и вызывает смерть, после смерти танк исчезает. Продолжительность жизни пользователя будет уменьшена после нападения пуль, и он умрет после четырехкратного нападения.В это время, если есть еще вражеские танки, пользователь проиграет игру.

9. Взрыв: когда пуля попадает в танк, возникает эффект взрыва.

10. Направление: танки и пули имеют направления, вы можете выбрать четыре направления: вверх, вниз, влево и вправо, а направление пули подчинено направлению танка.

Конкретный дизайн:

графический интерфейс

Графический пользовательский интерфейс требует знаний, связанных с Java, и должен использовать набор инструментов абстрактного окна, а именно AWT и Swing для разработки и реализации, поскольку в игре должны быть функциональные кнопки для управления перезапуском, выходом, паузой, помощью и т. д. игры, в процессе реализации, для разработки пункта меню.

Резервуары, реки, деревья, дома, стены и т. д. рисуются с помощью вызова функции рисования в соответствующих классах. Наконец, создается новая графическая панель, на которую можно добавить все элементы. Построение интерфейса завершается в программе методом построения класса TankClient, то есть без построения пользовательского класса будет сгенерирован такой интерфейс, содержащий различные игровые элементы. Так как картинка статична, а требования к картинке нашей игры динамические, то танки и пули в игре постоянно двигаются, а пробиваемые обычные стены тоже "движутся", так что для картинки ее надо постоянно Обновлять и перекрашивать может производить динамический эффект.

В программе эта часть функции так же реализована функцией update и функцией framPaint в классе TankClient.Перерисовываются "движущиеся" элементы, а не движущиеся элементы типа пунктов меню перерисовывать не нужно, поэтому меню перерисовано.Эта позиция оформлена в конструкторе класса TankClient. Конечно, графический интерфейс также включает в себя дизайн размера, положения и цвета различных элементов интерфейса.

элементы в интерфейсе

Элементы в интерфейсе добавляются методом add объекта экземпляра интерфейса при построении интерфейса, а «движущиеся» элементы должны постоянно обновляться и перерисовываться.

бак

Танки в основном реализуются классом Tank. Атрибуты танка: скорость (есть точки скорости по оси X и оси Y), размер танка, новое положение танка (координата X и координата Y), жив ли еще танк, направление действия и др. Все эти свойства имеют инициализированное значение, поэтому игра может запускаться.

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

Направление движения танка, стрельба пулями и перезапуск игры управляются клавиатурой, поэтому эти функции должны быть реализованы в классе Tank.

Метод keyPressed() класса Tank используется для отслеживания нажатий клавиш клавиатуры.После получения соответствующей информации о клавиатуре, если он получает F, это означает, что пуля выпущена, поэтому в это время метод fire() в следует вызвать класс Tank, fire() Метод не принимает переданных параметров, потому что направление пули всегда зависит от направления и положения танка.

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

Сторона пользователя Танк также может есть сердца, чтобы увеличить свое здоровье, получить красное сердце и увеличить свое здоровье на 100. Так что в программе у танка должен быть способ определить, как увеличивается здоровье танка при касании сердца. В программе используется метод eat() для "поедания" сердец и увеличения значения жизни.Конечно, значение жизни танка не должно превышать предельное значение его собственной жизни в 200, поэтому при оценке, когда жизни меньше или равно 100, добавьте 100 HP напрямую, но когда HP больше 100, вы можете сделать HP полным только до предела 200. Конечно, когда дело доходит до HP, оно должно отображаться в графический интерфейс, поэтому он должен быть в классе Tank.Чтобы разработать метод для рисования процесса увеличения и уменьшения жизни, DrawBloodbBar() используется для его описания в классе Tank.

лес

Древесина в основном используется для изготовления декоративных предметов и обладает непрозрачностью. Описанный классом Tree, Tree имеет два свойства: положение, длину и ширину. Класс дерева имеет свой собственный конструктор и, конечно же, важный метод draw().

река

Роль рек аналогична роли лесов.

стена

Стена разделена на обычную стену и железную стену. Обычные стены могут быть повреждены пулями, а железные стены - нет.

нормальная стена

Обычная стена имеет следующие свойства: фиксированная длина и ширина стены, координаты местоположения стены, а стена представлена ​​изображениями, добавленными в графический интерфейс. Для описания обычных стен в программе используется класс CommonWall, в этом классе есть конструктор для передачи параметров, метод draw() для рисования стены в заданном месте и метод getRect() для построения экземпляра прямоугольника. .

металлическая стена

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

Семья

Дом абстрагируется классом Home. Конкретными атрибутами являются: размер дома, местоположение дома и состояние выживания дома. Как и леса и реки, дом также имеет функцию draw() и собственную метод строительства.Функция такая же как и предыдущая.То же самое,но есть несколько новых методов для дома,потому что игру можно перезапустить в игре,поэтому должен быть метод настройки,чтобы сделать дом "живым" " еще раз. Конечно, иногда необходимо судить о текущем состоянии выживания дома, поэтому это должны быть два метода Live() и setLive(). Кроме того, есть еще работа по очистке и подсказке окончания игрового интерфейса.Метод gameover() решает эту проблему.

пуля

Свойства пули: скорость по оси X и по оси Y продвижения пули - начальная скорость равна 10, длина и ширина пули - начальная длина и ширина равны 10, положение пули , направление пули, живая ли пуля и т.д. Поскольку маркеры в разных направлениях на самом деле являются изображениями, необходимо учитывать выбор разных изображений и указывать их с соответствующими направлениями, поэтому необходимо создать пару ключ-значение Map и использовать направление свойства String для укажите разные картинки. как:imgs.put("L", bulletImages[0]); В соглашении о классе есть конструктор, который по умолчанию используется для передачи положения и направления. Конечно, здесь используется изоморфизм, а для получения состояния и интерфейса пули используется другой конструктор. Метод darw() и метод move() используются для управления рисованием и перемещением пули.Следующим шагом является рассмотрение реакции пули на попадание в каждый элемент.Когда вражеская пуля попадает в врага, она не убивает Так что здесь нужно просто вернуть true напрямую, не нужно убирать танк, пораженный пулей, не говоря уже о том, чтобы вызвать взрыв, чтобы отобразить эффект взрыва.

Конкретный код:

public boolean hitTanks(List<Tank> tanks) {//当子弹打到坦克时
		for (int i = 0; i < tanks.size(); i++) {
			if (hitTank(tanks.get(i))) {     //对每一个坦克,调用hitTank
				return true;
			}
		}
		return false;
	}

При попадании пули в другие танки используйте метод hitTank(Tank t), при попадании пули в стену используйте метод hitWall(CommonWall w), попадание в металлическую стену hitWall(MetalWall w), попадание в дом hitHome(), из Конечно, в этих методах В методе должны быть выполнены соответствующие операции для указания последствий получения пули.Нормальной стене необходимо удалить соответствующую позицию, поэтому для ее удаления в методе необходимо вызвать метод remove().Если он попадает в дом, он должен быть дома. Life установлен на false, что завершает игру. Реализация выглядит следующим образом:

public boolean hitHome() {   //当子弹打到家时
		if (this.live && this.getRect().intersects(tc.home.getRect())) {
			this.live = false;
			this.tc.home.setLive(false); //当家接受一枪时就死亡
			return true;
		}
		return false;
	}

 Кроме того, когда пуля стреляет в противника (сторона пользователя во врага), когда враг стреляет в сторону пользователя, сторона пользователя должна уменьшить значение жизни и выполнить t.setLife(t.getLife() - 50 без получение выстрела. ); // Если жизнь одной пули уменьшится на 50, если вы получите 4 выстрела, вы умрете. Общее значение жизни равно 200. Конечно, в методе есть много других суждений , например, если значение жизни меньше 0. Если это так, выполните t.setLive(false), тем самым закончив игру.

взорваться

Эффект взрыва танка независимо описывается классом.Атрибутами взрыва являются: позиция и статус выживания.Кроме того, при рисовании эффекта взрыва вам необходимо получить управление пользовательским интерфейсом, поэтому вам необходимо определить частный статический инструментарийtk = Toolkit.getDefaultToolkit(); другие методы могут быть только аналогичными.

Функция меню

Функции меню включают перезапуск, паузу, выход и т. д. из игры. Пользовательский интерфейс этих функций размещен в методе построения TankClient, который использует класс панели и соответствующую функцию мониторинга, которую очень просто реализовать.

Скриншоты игры:

модуль меню

Пункт меню может выбрать запуск новой игры, выход, паузу, продолжение, функции справки, запуск новой игры, выход из двух функций, подсказку, действительно ли пользователь хочет продолжить операцию!

Визуализации меню:

Начать новую игру:

Начните новую игру, нажав «Подтвердить», и вернитесь на исходную страницу, нажав «Отмена».

Пауза в игре:

Модуль помощи:

Выйти из модуля:

Информационный модуль игры 

Информация, связанная с заголовком игры

Эффект взрыва после попадания пули в танк противника:

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

Металлическая стена пробита пулями,

 Металлическая стена не будет разрушена после атаки пули, но когда в программе будет изменена постановка о попадании пули в металлическую стену, металлическая стена будет разрушена!

Исходный фрагмент кода:

public boolean hitWall(MetalWall w) {       //子弹打到金属墙上
		if (this.live && this.getRect().intersects(w.getRect())) {
			this.live = false;
			return true;
		}
		return false;
	}

Измененный фрагмент кода:

public boolean hitWall(MetalWall w) {       //子弹打到金属墙上

		if (this.live && this.getRect().intersects(w.getRect())) {

		this.live = false;

		this.tc.metalWall.remove(w); //子弹可以穿越金属墙了

		return true;

		}

		return false;

		}

Тест модифицированного эффекта: модифицированную металлическую стену также можно разрушить.

Рендеринг мешка с кровью: Мешок с кровью будет двигаться случайным образом.

позиция 1

       позиция 2

 Танки едят пакеты с кровью, чтобы увеличить здоровье

Пополнение здоровья после употребления пакетов с кровью:

После того, как мастер атакован, полоса здоровья заканчивается, и игра заканчивается. 

 

Суммировать:

Здесь почти представлены весь процесс и функциональный дизайн игры.Этот проект танковой войны подходит для студентов, чтобы использовать их в качестве справочного материала для выпуска Java или изучения дизайна курса.

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

Зарегистрируйте обновление проекта JavaSwing 4 / 100 статей

Вы можете лайкнуть, добавить в избранное, подписаться, прокомментировать меня