Реализация автомата для управления поведением танка 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Реализация автомата для управления поведением танка



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

Математическое описание модели автомата можно представить в виде:

,

где A – сам конечный автомат, S – множество состояний автомата, X – условия переходов между состояниями автомата, Z – действия, выполняемые в текущем состоянии.

Множество состояний , где:

 – состояние «Хаотичное движение»;

 – состояние «Поиск игрока»;

 – состояние «Поиск базы»;

 – состояние «Агрессия»;

 – состояние «Смерть».

Множество условий переходов , где:

 – истекло время хаотичного движения;

 – истекло время поиска игрока;

 – расстояние до противника менее чем 10 игровых единиц;

 –уничтожен танк.

Множество алгоритмов в состояниях , где:

 – произвольное движение танка;

 –поиск игрока, по рисунку 5;

 –поиск базы, по рисунку 5;

 – стрельба в противника;

 – отсутствие действий.

Модель конечного автомата для управления передвижением и стрельбы танка представлена на рисунке 12.


 

 

Рисунок 12 – Граф переходов автомата

 

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


Программный раздел

Описание программы

Данная программа реализована на языке С/С++ и выполнена в среде разработки Visual Studio 2015. В ней используются библиотеки iostream, Windows.h, conio.h, locale.h, time.h, cmath, подключаемые в файле header.h.

Так же подключаются в header.h подключаются определения всех классов программы: base. h, battleground. h, beton. h, block. h, bonus. h, brick. h, bulblock. h, bullet. h, enemyTank. h, iceblock. h, mask. h, mind. h, pTank.h, Tank. h, waterblock. h. Определения функций данных классов, находиться в соответствующих файлах, но с расширением «. cpp» вместо «. h».

Данная программа является многофайловым проектом, функция main представлена в файле «MAIN. cpp». После компиляции, сначала происходит запуск игры из меню, после чего загружаются данные из текстовых файлов: карта «mapx. txt» (где x–номер карты), модель танка «tankx. txt» (где x–уровень танка) и файл «scoreboard. txt» с таблицей рекордов, после чего начинается игра. Во время обработки данных выводится графическое изображение игры. По завершению программы выводится сообщение о конце игры.

Описание структуры данных

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

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


 

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

class battleground

{

int **board;//игровая карты

int mapsizex;//ширина карты

int mapsizey;//высота карты

int enemyleft;//кол-во оставшихся врагов

int GameStatus;//состояние игры

int level;//номер карты

int sound;//вк/выкл звук

int players;//кол-во игроков

public:

brick **Rwall;//кирпичные стены

beton **Swall;//беттоные стены

mask **green;//Маскировачные кусты

iceblock **ice;//ледянные блоки

waterblock **water;//водяные блоки

bulblock **bullblock;//коллизион модель пуль

base eagle;//создание базы

Tank yellow;//вызов танка

Tank green2;//2-ой игрок

enemyTank enemy[3];//танк компьютера

bonus Bonus;//спавн бонуса

mind II;//ИИ

battleground(int l,int pl,int sd);

void starter();//отрисовка карты

void refresh();//обновление текстовой информации

void stopgame();//конец игры

int getgame();

int getsound(){return sound;}

int getplayers(){return players;}

int getenemy(){return enemyleft;}

void decenemy();

void setting1();//загрузка карт

int getposboard(int y4,int x4);

void scoring();//подсчет очков

};

Базовый класс для классов танка игрока и танка противника. Часть его функций - виртуальные из-за различных методов управлений танков:

class pTank

{

protected:

int lifes;//оставшиеся жизни

int bcount;//счетчик снарядов

char **body[6];//внешность танка

int dir;//направление движения

int x;//координата x

int y;//координата y

int startx;//начальная координата x

int starty;//начальная координата y

int MapX;//границы карты по x и y

int MapY;

int shoottime;//блокировка стрельбы

int Rtime;//время до возрождения

int freezetime;//время заморозки управления

int tanklevel;//уровень танка

public:

bullet shoot[102];//снаряды танка

virtual void die() {}//обработка смерти танка

virtual void setti() {}//загрузка танка

virtual int move(int button) { return 0; }//функция по передвижению и отрисовки танка

int getlifes() { return lifes; }

void clear();//взрыв танка

virtual void getstart(int z, int z2, int z12, int z22) {}//возрождение танка

int getpos(int x3, int y3);//запрос координат

int getRtime() { return Rtime; }

void decRtime() { Rtime--; }

virtual void load(int number) {}//загрузка новой внешности танка

void clear(int direc);//очищение пройденного пути

void pluslife() { lifes++; }

void freeze(int temp) { freezetime = temp; }

int getdir() { return dir; }

void getposition(int &r1, int &r2) { r1 = x + startx;r2 = y + starty; }

};

И базовый класс для определения игровых препятствий:

class block

{

protected:

int status;//здоровье блока

int X;//координатаx

int Y;//координатаy

int cfont;//цвет текста для отображения

int ctext;//цвет фона для отображения

char character;//символ для отображения

public:

block(void){status=0;}

virtual void create();//создание блока

void show(int x1, int y1);//вывод блока на экран

void show();//вывод блока на экран

int getstatus();//проверка состояние блока

};

Остальные классы представлены в приложении листинга программы.

Описание основных функций

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

Функции setting 1() и starter (), запускающиеся при начале игры для загрузки карты и ее вывода на экран, и функция scoring () подсчета заработанных очков после окончания каждого уровня. Функции находятся в классе battleground:

void battleground:: setting1();//загрузка карт

void battleground:: starter();//отрисовка карты

void battleground:: scoring();//подсчет очков

Функция move (), отображающая и передвигающая танки, являющаяся виртуальной, а в производных классах находятся ее определение, и перегруженная функция по очистке пройденного пути передвижения танка:

int Tank:: move(int button); //передвижение и отрисовка танка

void Tank:: clear();//полная очистка танка

void Tank:: clear(int direc); //очистка пройденного танком блока

Виртуальная функция create ()создающая блоки и функция по выводу блока на экран:

virtual void create();//создание блока

void show();//вывод блока на экран

Функции moving ()и setting ()по передвижению и созданию пули соответственно, находящиеся в классе bullet:

int moving();//передвижение и отрисовка пули

void setting(int a,int x1, int y1,int mx, int my, int FF,int blv,char wh);

Остальные функции представлены в приложении листинга программы.

 


Экспериментальный раздел



Поделиться:


Последнее изменение этой страницы: 2021-05-27; просмотров: 104; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.226.28.197 (0.014 с.)