Лабораторные работы (2011) (ТИ-1)

Посмотреть архив целиком

Московский Энергетический Институт (Технический Университет)
Кафедра Прикладной Математики











Лабораторная работа по Теории игр №1

Проектирование с помощью

инструментального комплекса СИМПР


















Студент:

Стрельцов А.А.

Группа:

А-13-07

Преподаватель:

Еремеев А.П.
Гречкина П.В.






Москва 2011.

Оглавление

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

Описание предметной области 3

Описание таблиц 4

Таблица 1 – управляющая 4

Таблица 2 – поведение дракона 5

Таблицы 3-4 – поведение воинов 1 и 2 6

Таблица 5 – поведение лекаря 7

Таблица 6 – управляющая (доп.) 7

Интерфейс программы 8

Начальное состояние 8

Процесс боя 8

Победа героев 9

Победа дракона 10

Заключение 10

Метрики проекта 10

Литература 10

Приложение (выдержки из программного кода на C#) 11





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

Разработать компьютерную модель боевой системы с участием нескольких персонажей. Персонажи могут иметь различные способности. В процессе выполнения моделирования они действуют по тактике, заданной в табличной форме в программном обеспечении СИМПР. В результате моделирования определяется победитель: дракон или герои.

Описание предметной области

Модель представляет собой имитацию боя между драконом и тремя героями. Бой пошаговый. Герои и дракон наделены определенными способностями, которые они могут использовать один или более раз за ход. Каждый из них так же обладает параметром в виде запаса здоровья (HP).

Ход боя выглядит следующим образом: дракон наносит урон выбранному в цель герою (то есть, снижает количество HP). Герои, в свою очередь, наносят урон дракону. Кроме того, на стороне героев есть лекарь, способный восполнять здоровье союзников.

Способности дракона:

  • Нанести удар
    Наносит 20 единиц урона выбранной цели. Наносит 80 урона, если у цели разбита броня.



  • Разбить броню
    Разбивает броню указанной цели, делая следующий удар по этой цели в течение трех ходов наносящим дополнительный урон.



  • Выбрать жертву

Способности героя-воина:

  • Нанести удар

Наносит дракону 25 единиц урона.



  • Отвлечь дракона

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

Способности героя-лекаря:

  • Вылечить первого воина

Лечит воина на 50 единиц здоровья.



  • Вылечить второго воина

Лечит воина на 50 единиц здоровья.



  • Вылечить себя

Лечит себя на 50 единиц здоровья



  • Атаковать дракона

Наносит дракону 10 единиц урона.


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

Начальный/Максимальный запас здоровья дракона: 300
Начальный/Максимальный запас здоровья воина 1: 100
Начальный/Максимальный запас здоровья воина 2: 100

Описание таблиц

Содержимое таблиц выведено средствами ПО СИМПР, и находится в приложении. Ниже представлено общее описание таблиц:

Таблица 1 – управляющая

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

Описание таблицы:

Таблица полна и не противоречива.

Оптимизированная трансляция: C1 P7 C5 P1 C2 C6 P2 C3 C7 P3 C4 C8 P4 P5 P6 E



Таблица 2 – поведение дракона

Данная таблица описывает использование драконом способностей и отвечает за переключением им текущей цели. После завершения действий управление передается в управляющую таблицу (1).

Описание таблицы:

Таблица полна и не противоречива.

Оптимизированная трансляция: C1 C2 P1 C4 C5 P2 P3 P4 C3 P5 P6 P7 E

Таблицы 3-4 – поведение воинов 1 и 2

Данная таблица описывает поведение воинов, которые бьют дракона. После завершения действий управление передается в управляющую таблицу (1).

Описание таблицы:

Таблица полна и не противоречива.

Оптимизированная трансляция: С1 С2 P1 P4 P2 P3

Таблица 5 – поведение лекаря

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

Описание таблицы:

Таблица полна и не противоречива.

Оптимизированная трансляция: C1 C2 P1 P2 P5 C3 P3 P4

Таблица 6 – управляющая (доп.)

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

Таблица полна и не противоречива.

Оптимизированная трансляция: C1 P1 P2

Интерфейс программы

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

Предусмотрен чек-бокс «игнорировать отвлечение», при выборе которого дракон перестанет менять цели, что, вероятнее всего, приведет к поражению героев в силу механики боя.

Кнопка «Пауза» устанавливает конечное состояние и останавливает выполнение таблиц в СИМПР.

Начальное состояние

На данном снимке экрана представлен вид интерфейса программы сразу после запуска (до начала имитации)

Процесс боя

Показан процесс боя.

Победа героев

Показан исход, в котором герои побеждают.

Победа дракона

Показан исход, в котором дракон побеждает.

Заключение

Была реализована модель боевой системы с использованием программного обеспечения СИМПР.



Метрики проекта

Метрика

Значение

Строк кода

1041

Изображений

6

Условий

21

Действий

16 (12 уникальных)

Правил

31

Таблиц

6



Проект реализован на языке C# (.NET 3.0) в среде Microsoft Visual Studio 2010.

Литература

1. Еремеев А.П., Чибизова Н.В. Инструментальный комплекс проектирования систем поддержки принятия решений реального времени СИМПР-Windows. Методические указания по курсам «Теория принятия решений», «Экспертные системы»/Под ред. В.Н. Вагина – М.: Изд-во МЭИ, 1999. – 40 с.

Приложение (выдержки из программного кода на C#)

protected override void WndProc( ref Message m ) {

if ( m.Msg == Program.msgId ) {

// simpr message


int WParam = (int)m.WParam;

int WParamHi = WParam >> 16;

int WParamLo = WParam & 0xFFFF;


// textLog.Text += ">> simpr message (" + m.LParam + ", " + WParamHi + "-" + WParamLo + ")\r\n";

if (WParamHi == 0) {

m.Result = (IntPtr) Model.Instance.onCondition(WParamLo, (int)m.LParam);

}

else {

Model.Instance.onAction( WParamLo, (int)m.LParam );

m.Result = new IntPtr(1);

}

// textLog.Text += ">> simpr message (" + m.LParam + ", " + WParamHi + "-" + WParamLo + ") ans=" +m.Result+"\r\n";


System.Threading.Thread.Sleep(100);

labelDragonHP.Text = Model.Instance.Boss.Health + " / " + Model.Instance.Boss.HealthMax;

labelTank1HP.Text = Model.Instance.Tank1.Health + " / " + Model.Instance.Tank1.HealthMax;

labelTank2HP.Text = Model.Instance.Tank2.Health + " / " + Model.Instance.Tank2.HealthMax;

labelHealerHP.Text = Model.Instance.Healer.Health + " / " + Model.Instance.Healer.HealthMax;

tickLabel.Text = Model.Instance.Tick.ToString();


Application.DoEvents();

}

else {

base.WndProc( ref m );

}

}

Model() {

_entities = new SimprModel[]{this, _boss, _tank1, _tank2, _healer, null};

_actions = new ActionTableDelegate[] { actionEndState };

_conditions = new ConditionTableDelegate[] {null, isDragonAlive, isTank1Alive, isTank2Alive,

isHealerAlive, isDragonTurnMade, isTank1TurnMade, isTank2TurnMade, isHealerTurnMade};


_stop = false;

}


void advanceTick() {

_tick++;

foreach (SimprModel ent in _entities) {

if ( ent is Entity ) {

Entity et = ent as Entity;

if ( et != null ) {

et.nextTurn();

}

}

}

}



//************************************************************************************//

bool actionEndState() {

Program.Log( "Достигнуто конечное состояние (бой завершен)" );

return true;

}


bool isDragonAlive() { return !_boss.IsDead; }

bool isTank1Alive() { return !_tank1.IsDead; }

bool isTank2Alive() { return !_tank2.IsDead; }

bool isHealerAlive() { return !_healer.IsDead; }


bool isDragonTurnMade() { return _boss.TurnMade; }

bool isTank1TurnMade() { return _tank1.TurnMade; }

bool isTank2TurnMade() { return _tank2.TurnMade; }

bool isHealerTurnMade() { return _healer.TurnMade; }



//************************************************************************************//

public int onAction(int tableNumber, int actionNumber) {


Случайные файлы

Файл
178211.rtf
tema1.doc
104981.rtf
ДЗ 2.docx
120568.doc




Чтобы не видеть здесь видео-рекламу достаточно стать зарегистрированным пользователем.
Чтобы не видеть никакую рекламу на сайте, нужно стать VIP-пользователем.
Это можно сделать совершенно бесплатно. Читайте подробности тут.