Лабораторные работы (2011) (Отчет)

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

Московский Энергетический Институт

(Технический Университет)










Отчет к лабораторной работе № 1

по дисциплине

«Теория принятия решений»
















Выполнил:

Студент группы А-16-08

Васецкий М.О.

Проверила:

Гречкина П.В.








Москва 2011

Оглавление

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

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

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

Таблица 1 3

Таблица 2 4

Таблица 3 6

Таблица 4 7

Вид программы 8

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

Листинг Packman.h 10

Листинг Monster.h 10

Функция окна WndProc 11

Функция Play 11

Процедура FormKeyPress 15

Заключение 15


























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

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


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

Цель игры: собрать весь горох на игровом поле, при этом не попасться монстрам

Действующие персонажи игры «Пакман»:

  • Пакман – управляется игроком с клавиатуры, собирает горох на игровом поле

Управление: клавиши управления курсором или клавиши:

w’ – вверх;

a’– влево;

s’ – вниз;

d’ – вправо.

При прохождении пакмана через горошину, она автоматически съедается.

  • Монстры – управляются табличной логикой среды СИМПР. Всегда следуют в направлении пакмана

Конец игры достигается в двух случаях:

  • Победа – пакман собрал весь горох

  • Поражение – пакмана догнал хотя бы один из монстров

В игре возможны 8 уровней сложностей. Чем больше уровень, тем быстрее двигаются монстры. Уровень выбирается пользователем перед началом или во время игры


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

Для реализации игры потребовалось 4 таблицы


Таблица 1

Реализует ожидание запуска игры (нажатия кнопки старт)








Таблица 2

Управление монстрами:







Таблица 3

Управляет сменой монстров















Таблица 4

Управляет задержкой для хода пакмана







Вид программы

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

Для представления Пакмана используется класс Packman:

Листинг Packman.h

//Объявление класса Packman

//Функции-элементы определяются в Packman.cpp

#ifndef Packman_H

#define Packman_H

#include "Monster.h"

//---------------------------------------------------------------------------

class Packman

{

private: // данные:

unsigned int x, y; // текущие координаты Пакмана

char course; // Текущее направление Пакмана

bool walked; // флаг, показывает сделал ли Пакман ход

bool timeOut; // флаг, показывает есть ли время для хода

public: // Функции:

Packman(unsigned int initX, unsigned int initY); // Конструктор

// Вопросы:

bool PackmanCaught(Monster *monster); // Пакман пойман?

bool PackmanWalked(); // Пакман походил?

bool HaveTime(); // Есть время?

bool AllAte(); // Все съел?

// Действия:

void Ate(); // съесть

void StepRight(); // шаг вправо

void StepLeft(); // шаг влево

void StepUp(); // шаг вверх

void StepDown(); // шаг вниз

void ResetWalked(); // сбросить флаг хода

void ResetTime(); // сбросить время

void StartTime(); // запустить время

// Доступ к координатам:

unsigned int GetX(); // возвращает текущий х

unsigned int GetY(); // возвращает текущий y

// Функции рисования:

void Paint(); // Рисует Пакмана на текущих координатах

void Clear(); // Стирает старого Пакмана

};


#endif


Класс Monster предназначен для представления монстров

Листинг Monster.h

//Объявление класса Monster

//Функции-элементы определяются в Monster.cpp

#ifndef Monster_H

#define Monster_H

//---------------------------------------------------------------------------

class Monster

{

private: // данные:

unsigned int x, y; // текущие координаты монстра

unsigned int lastX, lastY; // координаты монстра на предыдущем шаге

public: // функции:

Monster(unsigned int initX, unsigned int initY); // конструктор

// Вопросы:

bool OnSameHorizontal(); // на одной горизантали?

bool OnSameVertical(); // на одной вертикали?

bool OnRight(); // справа от монстра?

bool RightFree(); // справа свободно?

bool LeftFree(); // слева свободно?

bool Bottom(); // снизу от монстра?

bool BottomFree(); // снизу свободно?

bool TopFree(); // сверху свободно?

bool InUpperHalf(); // в верхней полуплоскости?

bool InLeftHalf(); // в левой полуплоскости?

bool HorizontalSmaller();// по горизонтали ближе?

// Действия:

void StepRight(); // шаг вправо

void StepLeft(); // шаг влево

void StepUp(); // шаг вверх

void StepDown(); // шаг вниз

// Доступ к координатам:

unsigned int GetX(); // возвращает текущий х

unsigned int GetY(); // возвращает текущий y

// Функции рисования:

void Paint(number); // нарисовать монстра

void Clear(); // стререть старого монстра

};


#endif


Функция окна WndProc

void __fastcall TForm1::WndProc(Messages::TMessage &Message)

{

if (Message.Msg == myMsg)

{

int result = Play(Message.WParamHi, Message.WParamLo, Message.LParam);

Message.Result = result;

}

else

TCustomForm::WndProc(Message);

}


Функция Play

Функция Play () обрабатывает все сообщения от СИМПРА

Play(Word WParamHi, Word WParamLo, int LParam)

int Play(Word WParamHi, Word WParamLo, int LParam)

{

switch (WParamLo) // номер таблицы

{

case 1: // Таблица №1

switch (WParamHi) // Условие/действие

{

case CONDITIONS: // Условия

switch (LParam) // Номер условия

{

case 1: // Условие №

return (int)!startPress;

}

break;

case ACTIONS: // Действия

switch (LParam) // Номер действия

{

case 1: // Действие №1

Sleep(100);

return (int)true;

}

break;

}

break;

case 2: // Таблица №2

switch (WParamHi) // Условие/действие

{

case CONDITIONS: // Условия

switch (LParam) // Номер условия

{

case 1:

return (int)monsters[monsterNumber]->OnSameHorizontal();

case 2:

return (int)monsters[monsterNumber]->OnSameVertical();

case 3:

return (int)monsters[monsterNumber]->OnRight();

case 4:

return (int)monsters[monsterNumber]->RightFree();

case 5:

return (int)monsters[monsterNumber]->LeftFree();

case 6:

return (int)monsters[monsterNumber]->Bottom();

case 7:

return (int)monsters[monsterNumber]->BottomFree();

case 8:

return (int)monsters[monsterNumber]->TopFree();

case 9:

return (int)monsters[monsterNumber]->InUpperHalf();

case 10:

return (int)monsters[monsterNumber]->InLeftHalf();

case 11:

return (int)monsters[monsterNumber]->HorizontalSmaller();

}

break;

case ACTIONS: // Действия

switch (LParam) // Номер действия

{

case 1:

monsters[monsterNumber]->StepRight();

return (int)true;

case 2:

monsters[monsterNumber]->StepLeft();

return (int)true;

case 3:

monsters[monsterNumber]->StepUp();

return (int)true;

case 4:

monsters[monsterNumber]->StepDown();

return (int)true;

case 5:

Sleep(100);

return (int)true;

case 6:

Form1->FormPaint(Form1);

Sleep(500);

ShowMessage("Вы проиграли!");

return (int)true;

}

break;

}

break;

case 3: // Таблица №3

switch (WParamHi) // Условие/действие

{

case CONDITIONS: // Условия

switch (LParam) // Номер условия

{

case 1:

return (int)(monsterNumber == QUAN_MONSTERS - 1);

}

break;

case ACTIONS: // Действия


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

Файл
165766.rtf
dimka.doc
159622.rtf
160787.rtf
22622-1.rtf




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