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

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

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


Сформировать модель принятия решений в виде совокупности таблиц решений и написать модуль-интерпретатор для данной модели.


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


Объекты моделирования – поле размером 10 х 10, на котором имеются препятствия в виде черных и черных клеток. Игра для двух игроков. Игрок 1-красный квадрат- выиграет если догонит игрока 2-светло зеленый-квадрат , игрок 2 выиграет если все зеленые квадраты будут открыты.Причем оба игрока при перемещении на зеленую клетку превращают ее в белую , по черным клеткам ходить нельзя.

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

Игрок 1 обходит препятствия аналогично .

Игра заканчивается, когда все зеленые клетки открыты, либо игрок 2 пойман.




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


Модель включает в себя 5 таблиц, которые содержат правила поведения игроков и правила для начала игры, преодоления препятствий и переключения таблиц.



Таблица 1. Готовность для начала игры.

Условия

Готов?

Действия

Ждать





Данная таблица предназначена для определения момента начала игры. Когда будет нажата кнопка «Старт», то на вопрос «Готов?» будет получен положительный ответ и игра начнется.


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


Таблица 2. Игрок 2.

Условия

Остались еще непосещенные квадраты?

Есть непосещенный квадрат спереди?

Есть непосещенный квадрат справа?

Есть непосещенный квадрат слева?

2 игрок пойман?

Действия

Повернуть направо

Повернуть налево

Отметиться в квадрате

Повернуть направо / не поворачивать

Повернуть налево / не поворачивать

Повернуть направо / налево

Повернуть направо / налево / не поворачивать




Данная таблица координирует движения игрока 2 в условии, если рядом находится зеленая клетка. Игрок 2 может ходить на одну клетку вперед, или назад, или вправо, или влево.

Таблица полна, так как в ней присутствует правило иначе.

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


Таблица 3. Игрок 1.

Условия

Есть игрок 2 справа?

Есть игрок 2 слева?

Есть игрок 2 спереди?

Есть игрок 2 сзади?

Игроки находятся на одной клетке?

Действия

Повернуть направо

Повернуть налево

Повернуть назад

Поймать игрока

Таблица полна, так как в ней присутствует правило иначе.

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




Данная таблица координирует движения игрока 1 в условии, если рядом находится игрок 2. Игрок 1 может ходить на одну клетку вперед, или назад, или вправо, или влево.

Таблица полна, так как в ней присутствует правило иначе.

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


Таблица 4. Стена для игрока 2.

Условия

Есть стена прямо?

Есть стена справа?

Есть стена слева?

Действия

Повернуть направо

Повернуть направо / налево

Повернуть налево

Шаг вперед

Повернуть назад

Повернуть направо / налево / не поворачивать

Повернуть налево / не поворачивать

Повернуть направо / не поворачивать


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


Данная таблица координирует движения игрока 2 в условии, если рядом находится стена.

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



Таблица 5. Стена для игрока 1.

Условия

Есть стена прямо?

Есть стена справа?

Есть стена слева?

Действия

Повернуть направо

Повернуть направо / налево

Повернуть налево

Шаг вперед

Повернуть назад

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







Данная таблица аналогична таблице 4, только для другого игрока.

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



Оптимизированная трансляция

Таблица 1

Таблица 2

Таблица 3

Таблица 4

Таблица 5

Программа реализована в среде Microsoft Visual Studio 2008.

Приложение.

Модуль-интерпретатор:


Модуль-интерпретатор:


using System;

using System.Windows.Forms;

using System.Threading;

using System.Runtime.InteropServices;


namespace Game

{

public class MyHookClass : NativeWindow

{

[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]

static extern uint RegisterWindowMessage(string lpString);

uint simpr;

Form1 f;


public MyHookClass(Form1 af)

{

simpr = RegisterWindowMessage("MyMessage");

this.AssignHandle(af.Handle);

f = af;

}


protected override void WndProc(ref Message m)

{

int wparamhi,wparamlo,wparam;

int lParam = Convert.ToInt32("" + m.LParam);


if (m.Msg == simpr)

{

wparam = Convert.ToInt32("" + m.WParam);

wparamhi = wparam / 65536;

wparamlo = wparam - wparamhi * 65536;


#region Условия

if (wparamhi == 0)

{

if (wparamlo == 1) // Таблица 1

{

switch (lParam) // Условия

{

case (1): m.Result = f.IsReady(); break;

}

}

else if (wparamlo == 2) // Таблица 2

{

switch (lParam) // Условия

{

case (1): m.Result = f.IsParElse(); break;

case (2): m.Result = f.IsParInFront(); break;

case (3): m.Result = f.IsParRight(); break;

case (4): m.Result = f.IsParLeft(); break;

case (5): m.Result = f.IsG1Cached(); break;

}

}

else if (wparamlo == 3) // Таблица 3

{

switch (lParam)

{

case (1): m.Result = f.IsG1Right(); break;

case (2): m.Result = f.IsG1Left(); break;

case (3): m.Result = f.IsG1InFront(); break;

case (4): m.Result = f.IsG1Back(); break;

case (5): m.Result = f.IsTheyTogether(); break;

}

}


else if (wparamlo == 4) // Таблица 4

{

switch (lParam)

{

case (1): m.Result = f.IsWallInFrontG1(); break;

case (2): m.Result = f.IsWallRightG1(); break;

case (3): m.Result = f.IsWallLeftG1(); break;

}

}


else if (wparamlo == 5) // Таблица 5

{

switch (lParam)

{

case (1): m.Result = f.IsWallInFrontG2(); break;

case (2): m.Result = f.IsWallRightG2(); break;

case (3): m.Result = f.IsWallLeftG2(); break;

}

}


}

#endregion


#region Действия

else if (wparamhi == 1)

{

if (wparamlo == 1) // Таблица 1

{

switch (lParam)

{

case (1): f.Sleep(); break;

}

}


else if (wparamlo == 2) // Таблица 2

{

switch (lParam)

{

case (1): f.TurnRightG1(); break;

case (2): f.TurnLeftG1(); break;

case (3): f.StepG1(); break;

case (4): f.TurnRightNotTurnG1(); break;

case (5): f.TurnLeftNotTurnG1(); break;

case (6): f.TurnLeftRightG1(); break;

case (7): f.TurnLeftRightNotTurnG1(); break;

}

}

else if (wparamlo == 3) // Таблица 3

{

switch (lParam)

{

case (1): f.TurnRightG2(); break;

case (2): f.TurnLeftG2(); break;

case (3): f.TurnBackG2(); ; break;

case (4): f.StepG2(); break;

}

}


else if (wparamlo == 4) // Таблица 4

{

switch (lParam)

{

case (1): f.TurnRightG1(); break;

case (2): f.TurnLeftRightG1(); break;

case (3): f.TurnLeftG1(); break;

case (4): f.StepG1(); break;

case (5): f.TurnBackG1(); break;

case (6): f.TurnLeftRightNotTurnG1(); break;

case (7): f.TurnLeftNotTurnG1(); break;

case (8): f.TurnRightNotTurnG1(); break;

}

}


else if (wparamlo == 5) // Таблица 5

{

switch (lParam)

{

case (1): f.TurnRightG2(); break;

case (2): f.TurnLeftRightG2(); break;

case (3): f.TurnLeftG2(); break;

case (4): f.StepG2(); break;

case (5): f.TurnBackG2(); break;

case (6): f.TurnLeftRightNotTurnG2(); break;

case (7): f.TurnLeftNotTurnG2(); break;

case (8): f.TurnRightNotTurnG2(); break;

}

}

System.Threading.Thread.Sleep(f.ind);

// Ответом на запрос действия со стороны СИМПР должна быть единица

m.Result = new IntPtr(1);


}

#endregion


Application.DoEvents();

}

else

{

base.WndProc(ref m);

}

}

}

}







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