Игра "Танчики" для 1 или 2 игроков
В игре “Танчики” игроку предстоит сражаться с вражескими танками, управляя своим собственным. Как таковой победы добиться нельзя. Цель игры - убить как можно больше врагов или выжить как можно дольше. Игру разнообразят препятствия на поле битвы и бонусы, выпадающие из павших врагов.
Игра представляет собой приложение Windows Forms. При запуске приложения открывается главное меню. Пользователь может начать новую игру, посмотреть таблицу лидеров и справку. Сама игра представляет из себя поле, на котором перемещаются танчики, игрок может двигаться с помощью кнопок WASD и стрелять кнопкой Space. Вражеские танки тоже перемещаются и стреляют. Танки могут сталкиваться и двигать друг друга, а также наносить друг другу урон с помощью снарядов. В игре есть препятствия, через которые танчики не могут проехать, и бонусы, подбирая которые, игрок улучшает свой танк.
“Танчики”
Основанием для разработки является «Учебный план по программе бакалавриата. Направление 09.03.04 Программная инженерия. Профиль: Разработка программно-информационных систем».
- Главная панель — это основная часть данной системы.
1.1. При запуске программы на главной панели пусто.
1.2. При запуске игры появляется поле.
1.3. Поле содержит танки, препятствия, снаряды, бонусы.
1.4. Игрок должен иметь возможность перемещаться.
1.5. Танчики не должны выходить за пределы поля, а также не проходить сквозь друг друга и препятствия.
1.6. Танчики должны иметь возможность стрелять (для игрока на Space).
1.7. При попадании снаряда в танчик у него должна уменьшаться прочность.
1.8. Снаряды должны пролетать над водными препятствиями, но не проходить через стены, а также не выходить за пределы игрового поля.
1.9. В определенных местах через определенное время на поле должны появляться новые вражеские танки
1.10. При исчерпании здоровья танчика игрока игра заканчивается - Панель меню — это дополнительная часть программы.
2.1. На панели меню располагаются кнопки: Игра (с подпунктами: Новая игра 1p, Новая игра 2p), Пауза, Таблица лидеров, Справка (с подпунктами: Об игре, Управление)
2.2. С помощью кнопок “Новая игра 1p” и “Новая игра 2p” (подпункты кнопки “Игра”) можно начать одиночную или многопользовательскую новую игру.
2.3. Кнопка Пауза приостанавливает игру.
2.4. Кнопка Таблица лидеров выводит таблицу лидеров в отдельном окне.
2.5. С помощью кнопок “Об игре” и “Управление” (подпункты кнопки “Справка”) можно узнать информацию об игре или управление. - Справочная система по интерфейсу программы и по использованию ее функций.
Рисунок 1 — Диаграмма вариантов использования
Функция выявления пересечения двух прямоугольников.
Для работы программы используется файл для сохранения таблицы лидеров.
Система имеет русский интерфейс и русскую документацию. В данной версии многоязыковая поддержка не поддерживается.
Программа работает на операционной системе Windows 10. Требуется библиотека плагинов Microsoft .NET Framework 4.7.
Для работы программы необходимо 50 Мб свободной оперативной памяти, рекомендуется 100Мб. Требуется 3 Мб свободного дискового пространства для файлов программы. Для управления программой необходима клавиатура и мышь.
- Игровое поле.
1.1. Танчики
1.2. Снаряды
1.3. Препятствия
1.4. Бонусы - Панель меню
2.1. Игра
2.2. Таблица лидеров
2.3. Пауза
2.4. Справка - Справочная документация
Игра представляет из себя поле с перемещающимися по нему танчиками. Соответственно есть класс Field и Tank. Танки делятся на союзные и вражеские. Поэтому стоит создать класс PlayerTank и EnemyTank; существует два вида вражьих танков: легкие и потяжелее. Снаряды будут объектами класса Bullet. Все препятствия наследуются от класса Block, а бонусы - от Bonus.
Класс Field выступает контейнером для всех элементов игры: танчиков, блоков, бонусов, снарядов. Каждый класс имеет или наследует метод Draw(), отображающий элемент на экране
Рисунок 2 — Диаграмма классов, наследование
В процессе игры пользователь может нажимать клавиши wasd для передвижения по полю, а также клавишу Space для выстрела. Если был выбран режим на двух игроков, тогда второй игрок также может передвигаться с помощью стрелок и клавиши Enter.
При выстреле создается объект Bullet. При попадании в танк снаряда противоположной стороны прочность танчика уменьшается на соответствующее значение. При столкновении с препятствием танчик останавливается. Если здоровье танка игрока ≤ 0, то игра заканчивается.
При рисовании объектов рисование сначала производится в специальный буфер (это используется для создания режима двойной буферизации, т.е. для избавления мерцания при редактировании схемы). Когда элемент начинает свою прорисовку, он вызывает метод рисования, у всех графических объектов которыми владеет. После завершения прорисовки в фоновом буфере, он отображается на странице.
Рисунок 3 — Диаграмма последовательности
Главная точка входа для приложения. static void Main() - главная функция программы
Класс, объект которого создается в функции main(). Содержит главный цикл программы.
private Field _field - игровое поле
private bool _twoPlayersMode - флаг режима двух игроков
public int _tics - тики главного цикла
private bool _pause - флаг паузы
private bool _isGameNow - флаг того, что игра идет
private int _entryAmount - число записей в таблице лидеров
string _pathLeaderTable - относительный путь к файлу таблицы лидеров
public bool is1Up,
public bool is1Left,
public bool is1Down,
public bool is1Right,
public bool is1Fire,
public bool is2Up,
public bool is2Left,
public bool is2Down,
public bool is2Right,
public bool is2Fire - флаги управления
public Form1() - конструктор
private void timer1_Tick(object sender, EventArgs e) - главный цикл программы
private void Form1_Paint(object sender, PaintEventArgs e) - функция рисования поля
private void Form1_KeyDown(object sender, KeyEventArgs e) - обработка события нажатия клавиши
private void Form1_KeyUp(object sender, KeyEventArgs e) - когда клавишу отпскают
Кнопки панели задач:
private void AddToLeaderTable() - добавить в таблицу лидеров
private void NewGameButtomClick(object sender, EventArgs e) - новая игра, 1 игрок
private void NewGame2p_Click(object sender, EventArgs e) - новая игра, 2 игрока
private void PauseButton_Click(object sender, EventArgs e) - пауза
private void LeaderTableButtonClick(object sender, EventArgs e) - посмотреть таблицу лидеров
private void Information_Click(object sender, EventArgs e) - об игре
private void управлениеToolStripMenuItem_Click(object sender, EventArgs e) - управление
Структура записи в таблицу лидеров
public string _name - имя
public int _score - счет
public int _tics - тики
public GameResultsEntry(string name, int score, int tics) - конструктор
private Form1 _form1 - форма, которой принадлежит поле
public static int _indentDown - нижний отступ (для дополнительной информации во время игры)
private List playerBullets - список пуль игрока
private List enemyBullets - список пуль врагов
public List tanks - список танчиков на поле
private int[,] map - карта поля для размещения блоков
private Block[,] blocks - список блоков
private List boxes - список бонусов
private bool _twoPlayersMode - активирован ли режим для двух игроков
private int _playerCount - количество игроков
private Rectangle _spawnPlace1 - левый верхний угол
private Rectangle _spawnPlace2 - правый верхний угол
private Rectangle _spawnPlace3 - левый нижний угол
private Rectangle _spawnPlace4 - правый нижний угол
public int _score - счет
public event Action GameOver - событие окончания игры
public static int _blockSize - размер блока
private const int _widthBlock - количество блоков по ширине
private const int _heightBlocks - количество блоков по высоте
private int _tanksInterval = 0 - интервал между спавнами союзников по оси x
private int _boxAmount = 6 - количество видов бонусов
private int _bonusSpawnFrequency = 4 - частота появления бонусов
private int _timeSpawnEnemyEasy = 120 - спавн легкого врага, когда счетчик _countSpawn достигает этого числа
private int _countSpawnEasy - счетчик спавна легкого врага
private int _timeSpawnEnemyHard = 400 - спавн тяжелого врага, когда счетчик _countSpawn достигает этого числа
private int _countSpawnHard - счетчик спавна тяжелого врага
public Field(Form1 form1, bool isTwoPlayers) - конструктор
public void Tick() - цикл поля
public void Draw(Graphics graphics) - метод рисования элементов поля
Класс, от которого наследуются все классы игровых объектов
public Point _location - расположение
public Size _size - размеры
public Rectangle Rectangle - свойство возвращает объект Rectangle для данного объекта
public Bitmap _bitmap - картинка
Класс для определения пересечения двух прямоугольников
public static bool IsCrossed(this Rectangle r1, Rectangle r2) - пересекаются ли два прямоугольника
Танк
protected Field _field - поле, которому принадлежит танк
protected int _orientation - сторона, в которую повернут танк: 0 - вправо, 1 - вверх, 2 - влево, 3 - вниз
public int _health - прочность танка
protected int _maxHealth - максимально допустимая прочность танка
protected int _damage - урон от снарядов танка
public int _counterTick - счетчик
public int _attackSpeed - частота атаки
public virtual event Action FireNotify - событие выстрела
public delegate void Handler() - делегат движения
public event Handler DriveNotify - событие движения
public Rectangle _spawnPlace - место появления танка на поле (для врагов)
public Keys VirtualKey - виртуальная клавиша
public Tank(Form1 form1, Field field, int blockSize) - конструктор
public void Damage(Bullet bullet) - обработка получения урона от вражеских снарядов
public virtual void Drive(Keys key) - передвижение
public bool LimitPos() - ограничение на выход за пределы поля
public void Fire() - выстрел
public virtual void BonusEffect(Box box) - эффект от подобранного бонуса
Танк игрока
public PlayerTank(Form1 form1, Field field, int blockSize, Rectangle rectangle) - конструктор
public override void BonusEffect(Box box) - эффект от подобранного бонуса
Танк врага
private int _randomTime = 0 - время, которое танк едет в одном направлении
private int _countDrive - счетчик для отслеживания времени передвижения в одном направлении
protected int _minTimeToGo - минимальное время, в течение которого танк едет в одном направлении
protected int _maxTimeToGo - максимальное время, в течение которого танк едет в одном направлении
private Random random - объект Random для случайного задания времени, в течение которого танк едет в одном направлении
public EnemyTank(Form1 form1, Field field, int blockSize, Rectangle spawnPlace) - конструктор
public override void Drive(Keys key) - метод передвижения
Снаряд
public int _damage - урон
private int _speed = скорость
private int _orientation - положение в пространстве
public Bullet(Rectangle rectangle, int damage, int orientation) - конструктор
public void Fly() - передвижение
public void Draw(Graphics graphics) - отображение
Бонус
public int BonusType { get; } – тип бонуса
public Box(Point point) - конструктор
Препятствия на поле
public int BlockType { get; } – тип блока
public Block(Point point, int blockSize) - конструктор
public void Draw(Graphics graphics) - отображение
Сначала необходимо установить Microsoft .NET Framework 4.7 https://www.microsoft.com/ru-RU/download/details.aspx?id=55167
Затем нужно запустить файл Танчики.exe
Новую игру можно начать с помощью кнопок меню: Игра -> Новая игра 1p (для однопользовательского режима) / Новая игра 2p (для игры вдвоем)
Управление можно узнать в справке
Игру можно поставить на паузу
При проигрыше не отчаивайтесь. Вы можете попасть в таблицу лидеров!
При нажатии на кнопку «Таблица лидеров» отображается таблица лидеров