Skip to content

Maritornez/Tanks-2021

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Tanks-2021

Игра "Танчики" для 1 или 2 игроков

изображение

изображение

изображение

Постановка задачи

В игре “Танчики” игроку предстоит сражаться с вражескими танками, управляя своим собственным. Как таковой победы добиться нельзя. Цель игры - убить как можно больше врагов или выжить как можно дольше. Игру разнообразят препятствия на поле битвы и бонусы, выпадающие из павших врагов.

Общее описание задачи

Игра представляет собой приложение Windows Forms. При запуске приложения открывается главное меню. Пользователь может начать новую игру, посмотреть таблицу лидеров и справку. Сама игра представляет из себя поле, на котором перемещаются танчики, игрок может двигаться с помощью кнопок WASD и стрелять кнопкой Space. Вражеские танки тоже перемещаются и стреляют. Танки могут сталкиваться и двигать друг друга, а также наносить друг другу урон с помощью снарядов. В игре есть препятствия, через которые танчики не могут проехать, и бонусы, подбирая которые, игрок улучшает свой танк.

Техническое задание

Название программного продукта

“Танчики”

Основание для разработки

Основанием для разработки является «Учебный план по программе бакалавриата. Направление 09.03.04 Программная инженерия. Профиль: Разработка программно-информационных систем».

Требования к системе в целом

Требования к функциональным характеристикам

  1. Главная панель — это основная часть данной системы.
    1.1. При запуске программы на главной панели пусто.
    1.2. При запуске игры появляется поле.
    1.3. Поле содержит танки, препятствия, снаряды, бонусы.
    1.4. Игрок должен иметь возможность перемещаться.
    1.5. Танчики не должны выходить за пределы поля, а также не проходить сквозь друг друга и препятствия.
    1.6. Танчики должны иметь возможность стрелять (для игрока на Space).
    1.7. При попадании снаряда в танчик у него должна уменьшаться прочность.
    1.8. Снаряды должны пролетать над водными препятствиями, но не проходить через стены, а также не выходить за пределы игрового поля.
    1.9. В определенных местах через определенное время на поле должны появляться новые вражеские танки
    1.10. При исчерпании здоровья танчика игрока игра заканчивается
  2. Панель меню — это дополнительная часть программы.
    2.1. На панели меню располагаются кнопки: Игра (с подпунктами: Новая игра 1p, Новая игра 2p), Пауза, Таблица лидеров, Справка (с подпунктами: Об игре, Управление)
    2.2. С помощью кнопок “Новая игра 1p” и “Новая игра 2p” (подпункты кнопки “Игра”) можно начать одиночную или многопользовательскую новую игру.
    2.3. Кнопка Пауза приостанавливает игру.
    2.4. Кнопка Таблица лидеров выводит таблицу лидеров в отдельном окне.
    2.5. С помощью кнопок “Об игре” и “Управление” (подпункты кнопки “Справка”) можно узнать информацию об игре или управление.
  3. Справочная система по интерфейсу программы и по использованию ее функций.

изображение

Рисунок 1 — Диаграмма вариантов использования

Требования к математическому обеспечению

Функция выявления пересечения двух прямоугольников.

Требования к информационному обеспечению

Для работы программы используется файл для сохранения таблицы лидеров.

Требования к лингвистическому обеспечению

Система имеет русский интерфейс и русскую документацию. В данной версии многоязыковая поддержка не поддерживается.

Требования к программному обеспечению

Программа работает на операционной системе Windows 10. Требуется библиотека плагинов Microsoft .NET Framework 4.7.

Требования к техническому обеспечению

Для работы программы необходимо 50 Мб свободной оперативной памяти, рекомендуется 100Мб. Требуется 3 Мб свободного дискового пространства для файлов программы. Для управления программой необходима клавиатура и мышь.

Этапы разработки

  1. Игровое поле.
    1.1. Танчики
    1.2. Снаряды
    1.3. Препятствия
    1.4. Бонусы
  2. Панель меню
    2.1. Игра
    2.2. Таблица лидеров
    2.3. Пауза
    2.4. Справка
  3. Справочная документация

Объектно-ориентированный анализ предметной области

Объектная декомпозиция предметной области

Игра представляет из себя поле с перемещающимися по нему танчиками. Соответственно есть класс Field и Tank. Танки делятся на союзные и вражеские. Поэтому стоит создать класс PlayerTank и EnemyTank; существует два вида вражьих танков: легкие и потяжелее. Снаряды будут объектами класса Bullet. Все препятствия наследуются от класса Block, а бонусы - от Bonus.

Разработка статическом модели

Класс Field выступает контейнером для всех элементов игры: танчиков, блоков, бонусов, снарядов. Каждый класс имеет или наследует метод Draw(), отображающий элемент на экране

изображение

Рисунок 2 — Диаграмма классов, наследование

Разработка динамической модели

В процессе игры пользователь может нажимать клавиши wasd для передвижения по полю, а также клавишу Space для выстрела. Если был выбран режим на двух игроков, тогда второй игрок также может передвигаться с помощью стрелок и клавиши Enter.

При выстреле создается объект Bullet. При попадании в танк снаряда противоположной стороны прочность танчика уменьшается на соответствующее значение. При столкновении с препятствием танчик останавливается. Если здоровье танка игрока ≤ 0, то игра заканчивается.

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

изображение

Рисунок 3 — Диаграмма последовательности

Программная реализация

Описание классов

Program

Главная точка входа для приложения. static void Main() - главная функция программы

Form1

Класс, объект которого создается в функции 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) - управление

GameResultsEntry

Структура записи в таблицу лидеров
public string _name - имя
public int _score - счет
public int _tics - тики
public GameResultsEntry(string name, int score, int tics) - конструктор

Field : GameObject

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) - метод рисования элементов поля

GameObject

Класс, от которого наследуются все классы игровых объектов
public Point _location - расположение
public Size _size - размеры
public Rectangle Rectangle - свойство возвращает объект Rectangle для данного объекта
public Bitmap _bitmap - картинка

RectanglExtension

Класс для определения пересечения двух прямоугольников
public static bool IsCrossed(this Rectangle r1, Rectangle r2) - пересекаются ли два прямоугольника

Tank : GameObject

Танк

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) - эффект от подобранного бонуса

PlayerTank : Tank

Танк игрока

public PlayerTank(Form1 form1, Field field, int blockSize, Rectangle rectangle) - конструктор
public override void BonusEffect(Box box) - эффект от подобранного бонуса

EnemyTank : Tank

Танк врага

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) - метод передвижения

Bullet : GameObject

Снаряд

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) - отображение

Bonus : GameObject

Бонус

public int BonusType { get; } – тип бонуса
public Box(Point point) - конструктор

Block : GameObject

Препятствия на поле

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 (для игры вдвоем)

изображение

Управление можно узнать в справке

изображение

Игру можно поставить на паузу

При проигрыше не отчаивайтесь. Вы можете попасть в таблицу лидеров!

изображение

При нажатии на кнопку «Таблица лидеров» отображается таблица лидеров

изображение

About

2D tank battle's game. Windows Forms

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages