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

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

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









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

по курсу

«Теория игр и исследование операций»







Студент:

Курочкина И.Г.

Группа:

А-13-05

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

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











8.04.2009

СОДЕРЖАНИЕ

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

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

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

  4. Приложение. Выдержки из программного кода.










































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


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


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

Объекты:

- Игроки

- Бутылка

- Стаканы

- Лица игроков

- Шкалы «пьянства»


Цель: выиграть 3 игры. Возможны три ситуации: победа первого игрока, победа второго игрока, ничья.


Правила: Начинается все с раздачи карт. Тип раздачи определяется пользователем, но первая всегда ничейная. Далее начинается розыгрыш карт. Игроки кладут по одной карте. У кого достоинство карты больше, тот забирает взятку себе. Если карты имеют равное достоинство, то разыгрывается спор. Игроки кладут по 1 карте рубашкой вверх, а затем делают обычный ход и тот, кто забирает взятку, берет все карты со стола. Если при споре у одного из игроков закончились карты, то он забирает верхнюю карту из колоды соперника и кладет ее на стол. Так продолжается, пока у одного из игроков не закончатся карты (или у двух сразу). Тогда объявляется победитель партии, который должен выпить стакан «Огненной воды». Если он трезв, то соперник наливает ему целый стакан (200 мл), иначе полстакана. Если по итогам партии объявлена ничья, то пьют оба. Далее снова раздаются карты и все повторяется до тех пор, пока кто-то не напьется и не уснет. Этот игрок объявляется победителем, но он уже об этом не узнает Если победили оба, то тогда они дружно уснут.






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



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


Модель описана двумя таблицами: Игра (8х11) и Продолжение игры (8х16).

Таблица 1 – Игра

Отвечает за розыгыш карточной партии.

Таблица 2 – Продолжение игры

Отвечает за действия после розыгрыша.







4. Приложение. Выдержки из программного кода.

Программа написана в среде Borland C++ Builder 6.0.


Файл «lab_1.h»:

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

class butilki

{

public:

TImage *Img;

int uroven;

butilki (TImage *Img1)

{

Img=Img1;

uroven=800;

}

void change ()

{

Img->Picture->Bitmap->LoadFromResourceName((int)HInstance,"butylka"+ IntToStr(uroven));

}

};

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

class stakan

{

public:

TImage *Img;

int uroven;

stakan (TImage *Img1)

{

Img=Img1;

uroven=0;

}

void change (int n)

{

uroven=n;

Img->Picture->Bitmap->LoadFromResourceName((int)HInstance,"stakan"+ IntToStr(uroven));

}

};

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

class shkala

{

public:

TImage *Img;

int uroven;

shkala(TImage *Img1)

{

Img=Img1;

uroven=0;

}




void change (int n)

{

uroven=uroven+n;

Img->Picture->Bitmap->LoadFromResourceName((int)HInstance,"shkala"+ IntToStr(uroven));

}

};

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

class smile

{

public:

TImage *Img;

smile(TImage *Img1)

{

Img=Img1;

}

void change (int n)

{

Img->Picture->Bitmap->LoadFromResourceName((int)HInstance,"smile"+ IntToStr(n));

}

};

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

class igrok

{

public:

TImage *Imgkoloda;

TImage *Imgcard;

koloda kolod;

bool shodil;

bool shodilrubashkoy;

igrok(TImage *Img1, TImage *Img2)

{

Imgkoloda=Img1;

Imgcard=Img2;

shodil = false;

shodilrubashkoy = false;

}

int hod (bool ruba)

{

int a;

if (kolod.size() > 0)

{

a = kolod.front();

kolod.pop_front();

if ((ruba)&& ((a > 0)&&(a < 37)))

{

Imgcard->Picture->Bitmap->LoadFromResourceName((int)HInstance, "rubashka");

}

else

{

Imgcard->Picture->Bitmap->LoadFromResourceName((int)HInstance,"k" + IntToStr(a));

Imgcard->Visible = true;

}

return a;

}

else

return 0;

}

void vzatka (koloda &k)

{

randomize();

int r = random(2);

while (k.size()>0)

{

if (r > 0)

{

kolod.push_back(k.front());

k.pop_front();

}

else

{

kolod.push_back(k.back());

k.pop_back();

}

}

}

};

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

Файл «lab_1.сpp»:

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

#define USERMESSAGE "pianica"

#define Yes 1

#define No 0

#define CONDITIONS 0

#define ACTIONS 1

UINT ourMesage;

igrok *a;

igrok *b;

butilki *butilka;

stakan *stA;

stakan *stB;

shkala *shkalA, *shkalB;

smile *smA, *smB;

int kartaA, kartaB;

int LastWin; // 0 - ничья, 1 - А, 2 - В

int Sleep_time = 50;

koloda nastole;

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

void razdacha()

{

a->kolod.clear();

b->kolod.clear();

bool karty[36];

for (int i=0; i < 36; i++)

{

karty[i] = false;

}

randomize();

int rozdano = 0;

bool komu = true;

int karta = 0;

while (rozdano < 36)

{

karta = random(36);

if (karty[karta] == false)

{

karty[karta] = true;

rozdano++;

if (komu)

{

a->kolod.push_front(karta + 1);

komu = false;

}

else

{

b->kolod.push_front(karta + 1);

komu = true;

}

}

}

}

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

void razdacha_posl_nich(igrok *c, igrok *d)

{

c->kolod.clear();

d->kolod.clear();

d->kolod.push_front(1);

c->kolod.push_front(2);

for (int i = 3; i < 20; i++)

{

d->kolod.push_front(i);

}


for (int i = 20; i <= 36; i++)

{

c->kolod.push_front(i);

}


}

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

void razdacha_pobeda(igrok *c, igrok *d)

{

c->kolod.clear();

d->kolod.clear();

for (int i = 1; i < 19; i++)

{

d->kolod.push_front(i);

}

for (int i = 19; i <= 36; i++)

{

c->kolod.push_front(i);

}

}

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

void razdacha_vse_nichi (igrok *c, igrok *d)

{

c->kolod.clear();

d->kolod.clear();

for (int i = 1; i < 36; i+=2)

{

d->kolod.push_front(i);

}

for (int i = 2; i < 37; i+=2)

{

c->kolod.push_front(i);

}

}

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

void __fastcall TForm1::choice()

{

switch (RG1->ItemIndex)

{

case 0:

{

razdacha_posl_nich(b,a);

break;

}

case 1:

{

razdacha_posl_nich(a,b);

break;

}

case 2:

{

razdacha_pobeda(b,a);

break;

}

case 3:

{

razdacha_pobeda(a,b);

break;

}

case 4:

{

razdacha_vse_nichi(a,b);

break;

}

case 5:

{

razdacha();

break;

}


}

}

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

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

ourMesage=RegisterWindowMessage (USERMESSAGE);

a= new igrok (Image7, Image10);

b= new igrok (Image8, Image12);

butilka = new butilki (Image6);

stA = new stakan (Image4);

stB = new stakan (Image5);

shkalA = new shkala (Image9);

shkalB = new shkala (Image11);

smA = new smile (Image2);

smB = new smile (Image3);

choice();

}

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

void __fastcall TForm1::disp()

{

Edit1->Text = IntToStr((int)a->kolod.size());

Edit2->Text = IntToStr((int)b->kolod.size());

}

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

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

{

if(Message.Msg == ourMesage)

{

Sleep(Sleep_time);

disp();

switch (Message.WParamHi) //условия/действия

{

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

{

switch (Message.WParamLo) //таблица

{

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

{

switch (Message.LParam) //номер условия

{

case 1:

{

if(a->kolod.size() > 0)

{

Message.Result = Yes;

}

else

{

Message.Result = No;

}

break;

}

case 2:

{

if(b->kolod.size() > 0)

{

Message.Result = Yes;

}

else

{

Message.Result = No;

}

break;

}

case 3:

{

if(kartaA > kartaB)

{

Message.Result = Yes;

}

else

{

Message.Result = No;

}

break;

}

case 4:

{

if(kartaB > kartaA)

{

Message.Result = Yes;

}

else

{

Message.Result = No;

}

break;

}

case 5:

{

if(a->shodil)

{

Message.Result = Yes;

}

else

{

Message.Result = No;

}

break;

}

case 6:

{

if(b->shodil)

{

Message.Result = Yes;


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

Файл
151560.rtf
98187.doc
116622.rtf
143106.rtf
73384.rtf




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