34 просмотров

Астероиды!

Цель этого проекта — разработать версию классической видеоигры Asteroids. Если вы никогда не играли в Asteroids, рекомендуем вам найти сетевую версию, чтобы попробовать.

Предоставленный код

СтдДрав. GameDriver и играбельный

Вся графика для этого приложения будет обрабатываться библиотекой StdDraw, разработанной Робертом Седжвиком и Кевином Уэйном из Принстонского университета. Эта библиотека не является особенно мощной или полнофункциональной, но позволяет легко разрабатывать простые графические приложения на Java.

Следующий драйвер инициализирует окно рисования и обрабатывает основной игровой цикл:

Вы несете ответственность за разработку класса AsteroidsGame, реализующего следующий интерфейс:

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

GameUtils, Point, Pose, Vector2D

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

  • Point.java — класс Point представляет собой инкапсуляцию двумерного местоположения, использующего координаты прямоугольного экрана.
  • Pose.java — класс Pose является подклассом Point, который включает информацию о направлении/ориентации ( угловатый мера).
  • Vector2D.java — класс Vector2D представляет двумерный вектор. Векторы такого рода можно визуализировать в виде стрелок, у которых есть как направление (или заголовок), так и длина (или величина).В этом приложении можно использовать векторы для представления скоростей и ускорений игровых элементов.
Статья в тему:  Фил Плэйт: как мы можем защитить Землю от астероидов?

GameUtils.java содержит служебные методы для работы с указанными выше классами. В частности, он включает метод рисования треугольника для конкретной Позы (что будет полезно при рисовании Корабля).

Обратите внимание, что Point , Pose и Vector2D неизменный классы. Использование неизменяемых классов может помочь избежать тонких ошибок, возникающих в результате случайного присвоения псевдонимов изменяемым объектам.

Пример игры

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

Вы можете попробовать BounceGame, изменив строку 40 GameDriver.java следующим образом:

// game = new AsteroidsGame(); игра = новый BounceGame();

Для ясности: ни один из этих классов не будет использоваться в вашей реализации Asteroids. Они приведены только в качестве примера.

Элементы игры

Вы должны предоставить реализации для следующих игровых элементов.

Астероид

Астероиды должны соответствовать следующим требованиям:

  1. Астероиды (и все другие незаполненные игровые элементы) должны быть нарисованы с использованием стандартного радиуса пера StdDraw, равного 0,002.
  2. Начальное местоположение каждого астероида должно генерироваться случайным образом. Позиции должны быть выбраны равномерно со всего игрового экрана.
  3. Направление движения каждого астероида должно быть равномерным из интервала [0, 2π).
  4. Астероиды должны поддерживать постоянную скорость в один пиксель за временной шаг.
  5. Расположение астероидов должно «заворачиваться» по краям игрового экрана. Например, когда астероид покидает левую часть экрана, он должен снова появиться в соответствующем месте в правой части экрана.
  6. Астероиды должны отображаться как открытые кружки.
  7. Астероиды бывают трех разных размеров, каждый из которых имеет разное количество очков:
    • МАЛЕНЬКИЙ: радиус 10 пикселей, стоит 200 очков при уничтожении.
    • СРЕДНЯЯ: радиус 20 пикселей, стоит 100 очков при уничтожении.
    • БОЛЬШОЙ: радиус 30 пикселей, стоит 50 очков при уничтожении.
Статья в тему:  Какая самая большая атомная подводная лодка

Блюдце

  1. Блюдца должны отображаться в виде открытых прямоугольников шириной 20 пикселей и высотой 10 пикселей.
  2. Начальное расположение каждой тарелки должно генерироваться случайным образом. Позиции должны быть выбраны равномерно со всего игрового экрана.
  3. Начальное направление движения каждой тарелки нужно провести равномерно из интервала [0, 2π).
  4. Блюдца должны поддерживать постоянную скорость 2 пикселя за временной шаг.
  5. На каждом временном шаге тарелка должна выбирать новое направление движения с вероятностью 0,05. Направление движения нужно проводить равномерно из интервала [0, 2π).
  6. Расположение блюдца должно нет "накрутка" по краям игрового экрана. Блюдца должны навсегда исчезнуть при выходе из экрана.
  7. Блюдца при уничтожении приносят 400 очков.

Судно

  1. Исходное положение корабля должно быть в центре игрового экрана и направлено вверх.
  2. Корабль должен быть представлен в виде открытого равнобедренного треугольника с основанием 10 пикселей и высотой 20 пикселей. Вы можете использовать метод GameUtils.drawPoseAsTriangle, чтобы нарисовать корабль на экране.
  3. Движения корабля должны контролироваться с помощью клавиатуры. Вы должны использовать метод StdDraw.isKeyPressed для обнаружения событий клавиатуры.
  4. ПРЕВРАЩЕНИЕ: На каждом временном шаге, если пользователь нажимает клавишу со стрелкой влево ( java.awt.event.KeyEvent.VK_LEFT ), корабль должен быть повернут на 0,1 радиана влево. Если пользователь нажимает клавишу со стрелкой вправо java.awt.event.KeyEvent.VK_RIGHT, корабль должен быть повернут на 0,1 радиан вправо. Обратите внимание, что вам не нужно беспокоиться о сохранении значений направления в диапазоне от 0 до 2π. Все предоставленные методы, связанные с заголовком, будут работать правильно для значений вне этого диапазона.
  5. ТОЛКАТЬ: На каждом временном шаге, если пользователь нажимает клавишу со стрелкой вниз java.awt.event.KeyEvent.VK_DOWN , необходимо применять усилие 0,1 пикселя/шаг времени в квадрате. Тяга должна толкать корабль в направлении, представленном его текущим курсом. Метод applyThrust, определенный в классе GameUtils, может использоваться для обновления вектора скорости корабля. (Это была ошибка в инструкции. Удалено 4/2.)
  6. ТРЕНИЕ: Корабль должен тормозить при отсутствии тяги. На каждом временном шаге скорость корабля должна уменьшаться до 99% от его скорости на предыдущем временном шаге.
  7. Расположение корабля должно «заворачивать» на края игрового экрана.
Статья в тему:  Как природный газ влияет на глобальное потепление

Пуля

  1. Пули должны отображаться в виде закрашенных кругов с радиусом 1,5 пикселя.
  2. Пули должны создаваться в текущей позиции корабля каждый раз, когда пользователь нажимает пробел. Вы должны использовать методы StdDraw.hasNextKeyTyped и StdDraw.nextKeyTyped для обнаружения нажатий пробела.
  3. Пули должны двигаться с постоянной скоростью 20 пикселей за временной шаг.
  4. Направление движения пули должно соответствовать курсу корабля в момент выстрела.
  5. Пули должны существовать не более 20 временных шагов.
  6. Расположение пуль должно «заворачиваться» по краям игрового экрана.

Звезды

  1. Звезды должны отображаться в виде замкнутых кругов с радиусом 1 пиксель.
  2. Начальное местоположение каждой звезды должно генерироваться случайным образом. Позиции должны быть выбраны равномерно со всего игрового экрана.
  3. Звезды должны оставаться неподвижными.

Табло

Счет игрока должен располагаться по центру в 60 пикселях от левого края игрового экрана и в 20 пикселях сверху. Перед числовым счетом должна стоять строка «Оценка:». Оценка должна быть инициализирована до 0.

Осталось жизней

Количество оставшихся жизней должно быть отцентровано на 60 пикселей от левого края игрового экрана и на 60 пикселей сверху. Перед количеством жизней должна стоять строка «Жизни:». Количество оставшихся жизней должно быть инициализировано равным 3.

Логика игры

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

Когда игра начинается, корабль должен присутствовать на игровом экране вместе со 100 звездами, двумя цифровыми дисплеями и 10 астероидами. это нет необходимо гарантировать, что корабль в безопасности от астероидов, когда игра начнется. Если корабль окажется внутри астероида, это просто невезение для игрока. Размер каждого астероида должен определяться случайным образом при его создании. Каждый астероид должен иметь 50% шанс быть большим и 25% шанс быть маленьким или средним. На начальном игровом экране не должно быть блюдец. Новое блюдце должно добавляться на игровой экран на каждом временном шаге с вероятностью 0,002. Обратите внимание, что это означает, что иногда на игровом экране может присутствовать более одной тарелки. Опять же, тарелки могут появиться в месте, которое вызовет немедленное столкновение с кораблем.

Статья в тему:  Как измерить изображение ядерной транслокацииj

Столкновения и подсчет очков

  • Звезды и числовые значения отображения — эти элементы не подвержены коллизиям.
  • Корабль и пули. Элементы этой категории могут сталкиваться с астероидами и тарелками.
  • Астероиды и тарелки — элементы этой категории способны сталкиваться с кораблем и пулями.

Часть A: Тест на готовность (10%)

Тест на готовность к этому заданию будет включать вопросы по UML. ВЫ ДОЛЖНЫ ПРАВИЛЬНО ОТВЕТИТЬ НА ВСЕ ВОПРОСЫ, ЧТОБЫ ПОЛУЧИТЬ ЗАЧЕТ ЗА ЭТУ ЧАСТЬ. Вы можете проходить викторину столько раз, сколько необходимо.

Часть B: UML (40%)

К крайнему сроку для этой части вы должны представить диаграмму UML, иллюстрирующую ваш дизайн. Чтобы получить полную оценку, ваш проект должен соответствующим образом использовать объектно-ориентированные функции, которые мы рассмотрели в классе: специализация, абстрактные классы, интерфейсы и т. д. Ваш UML должен быть максимально полным. Он должен отображать атрибуты каждого класса, а также сигнатуры всех общедоступных и защищенных методов. Он также должен показывать отношения между вашими классами. Часть вашей оценки за эту часть задания будет основываться на использовании правильного «синтаксиса» UML.Ваша диаграмма UML может быть подготовлена ​​в электронном виде или очень аккуратно нарисовано от руки и отсканировано. На этой странице перечислены некоторые инструменты для подготовки диаграмм UML. Вы можете свободно обсуждать дизайнерские идеи с другими учащимися в классе. Окончательная диаграмма UML должна быть подготовлена ​​и отправлена ​​индивидуально, но вам рекомендуется обсудить проект с другими. Если вы работаете с другим студентом над разработкой своего дизайна, вы должны отметить эту помощь в своей заявке. Ваш проектный документ UML должен включать несколько абзацев, описывающих и защищающих ваши дизайнерские решения. Для полного признания этот документ должен включать точные определения наследования и полиморфизма., а также ссылки на источники для ваших определений. Формальные определения должны быть дополнены краткими пояснениями терминов своими словами. В проектном документе должно быть явно указано, где используются наследование и полиморфизм, чтобы предотвратить дублирование кода. Также может быть уместно использовать понятия связи и связности для обоснования аспектов вашего проекта. Ваша диаграмма UML должна быть отправлена ​​​​через Canvas в виде файла .pdf. Поздние заявки не принимаются для Части B.

Статья в тему:  При столкновении двух астероидов они становятся

Рубрика Дизайн

Дизайн поддерживает необходимый функционал15%
Правильный "синтаксис" UML15%
UML визуально хорошо организован и аккуратно нарисован или подготовлен в электронном виде.10%
Соответствующие имена (Имена имеют смысл. Имена методов — это глаголы, а переменные экземпляра и классы — существительные. Существительные во множественном числе используются только для коллекций.)10%
Надлежащее использование наследования (Суперклассы используются для предотвращения дублирования кода. Подклассы существенно расширяют функциональность суперклассов. Переменные экземпляра не затеняются в подклассах.)10%
Классы и методы абстрактны там, где это уместно.10%
Надлежащее использование полиморфизма (использование интерфейсов, суперклассов или того и другого).10%
Документация обеспечивает последовательную защиту ключевых проектных решений.10%
Документация использует правильную орфографию, грамматику и т. д.10%

Часть C: Код (50%)

if (generator.nextDouble() < 0,75) < // Этот блок будет выполнен с вероятностью 0,75. >

Разные советы

  • Убедитесь, что вы понимаете предоставленный код. Потратьте некоторое время на просмотр документации библиотеки StdDraw, а также других предоставленных классов.
  • Постепенно тестируйте свой код. Убедитесь, что каждый новый игровой элемент работает правильно, прежде чем приступать к кодированию следующего.
  • Ищите возможности использовать полиморфизм и динамическое связывание, чтобы избежать дублирования кода. Как всегда, если вы обнаружите, что копируете и вставляете код, велика вероятность, что вы делаете что-то не так.
  • Не ждите, пока истечет крайний срок UML, чтобы начать работу над своим кодом. Вы можете экспериментировать с разработкой и тестированием классов, даже если вы еще не полностью укрепили свой дизайн. Вероятно, будет проще реорганизовать функциональный код, чтобы он соответствовал улучшенному дизайну, чем начинать кодирование с нуля.
  • Когда игровые элементы уничтожаются, вы, вероятно, захотите удалить их из коллекций, в которых они хранятся. К сожалению, изменение коллекций Java во время итерации может привести к проблемам. Например, следующий код приведет к ConcurrentModificationException:
Слова списка массивов = новый СписокСписков<>(); слова.добавить("дерево"); слова.добавить("автомобиль"); слова.добавить("дом"); // Попытка удалить "дерево" из списка. за (строковое слово: слова)  если (слово.равно("дерево"))  слова.удалить(слово); // Выдает исключение! > >

Итераторы могут использоваться для безопасного удаления объектов. Следующий код работает правильно.

Слова списка массивов = новый СписокСписков<>(); слова.добавить("дерево"); слова.добавить("автомобиль"); слова.добавить("дом"); Итератор it = words.iterator(); // Удалить "дерево" из списка. пока (это.hasNext())  Текущая строка = it.next(); если (текущее.равно("дерево"))  это.удалить(); // Безопасно удаляет самый последний элемент. > > 

Идти дальше

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

Статья в тему:  Какие астероиды ближе всего к Земле

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

Благодарности

Этот проект был частично вдохновлен проектом Asteroids, представленным Дэном Лейзбергом и Артом Саймоном на сессии SIGCSE Nifty Assignments Session 2008 года.

голоса
Рейтинг статьи
Ссылка на основную публикацию
Статьи c упоминанием слов:

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x