Программа-игра "Ним"

Дипломная работа - Компьютеры, программирование

Другие дипломы по предмету Компьютеры, программирование



? в памятиfixap (int num, TShape *Shape);

// программно удаляет шарики с формыsolution (TShape *Shape1, TShape *Shape2,*Shape3, TShape *Shape4,*Shape5, TShape *Shape6);

// определяет победителя

bool win (TPanel *Gamer1, TPanel *Gamer2);

// создает новую игру

void endGame (TShape *Shape1,*Shape2, TShape *Shape3, TShape *Shape4,*Shape5, TShape *Shape6, TButton *Button1, TRadioButton * RB1,* RB2, TRadioButton * RB3, TRadioButton * RB4);

// управляет доступом к кнопке передачи хода и переключателям

void obj (TShape *Shape1, TShape *Shape2,*Shape3, TShape *Shape4,*Shape5, TShape *Shape6,*Button1, TRadioButton *RadioButton1,*RadioButton2, TRadioButton *RadioButton3,

TRadioButton *RadioButton4);

// -

// процедура, проiитывающая ход компьютераcompClick (void);

};

Рассмотрим ход компьютера. Ход игрока выполняется прямо пропорционально проходу очередной итерации.

// -CGame:compClick ()

{(list1 [0] == true && list1 [1] == true && list1 [2] == true &&[0] == true && list2 [1] == true &&[0] == true) {(gamer) gamer = false;gamer = true;

}(gamer) gamer = false;gamer = true;

// -

// -

// если одна строка равна другой

if ((mod1 == mod2) && (mod1!= mod3) && (mod2!= mod3)

&& mod1!= 0 && mod3!= 0) {(! list3 [0]) {[0] = true;-= 1;

}if (! list1 [2]) {[2] = true;-= 1;

}if (! list1 [1]) {[1] = true;-= 1;

}if (! list1 [0]) {[0] = true;-= 1;

}

}if ((mod1 == mod3) && (mod1!= mod2) && (mod3!= mod2)

&& mod2!= 0) {(! list2 [0]) {[0] = true;-= 1;

}(! list2 [1]) {[1] = true;-= 1;

}

}if ((mod2 == mod3) && (mod1!= mod2) && (mod1!= mod3)

&& mod1!= 0) {(! list1 [0]) {[0] = true;-= 1;

}(! list1 [1]) {[1] = true;-= 1;

}(! list1 [2]) {[2] = true;-= 1;

}

}

// -

// случаи завершения игрыif ((mod1 == 0 && mod2 == 0)) {[0] = true;-= 1;

}if (mod1 == 0 && mod3 == 0) {[0] = true; list2 [1] = true;-= 2;

}if (mod2 == 0 && mod3 == 0) {[0] = true; list1 [1] = true; list1 [2] = true;-= 3;

}

// -

// случай равенства трехif ((mod1 == mod2) && (mod2 == mod3) && (mod1 == mod3)) {(! list2 [0]) {[0] = true;-= 1;

}

else {

list2 [1] = true;

mod2 -= 1;

}

}

// -

// реккурентные сравнения: 1 и 2

else if ((mod1 > mod2) && mod3 == 0) {(! list1 [0]) {[0] = true;-= 1;

}if (! list1 [1]) {[1] = true;-= 1;

}if (! list1 [2]) {[2] = true;-= 1;

}

}if ((mod1 < mod2) && mod3 == 0) {(! list2 [0]) {[0] = true;-= 1;

}if (! list2 [1]) {[1] = true;2 -= 1;

}

}

// -

// реккурентные сравнения: 2 и 3

else if (mod1 == 0 && mod2 > mod3) {

list2 [0] = true;

mod2 -= 1;

}

// -

// реккурентные сравнения: 1 и 3

else if (mod2 == 0 && mod1 > mod3) {(! list1 [0]) {[0] = true;-= 1;

}(! list1 [1]) {[1] = true;-= 1;

}

}

// -

// патовые ситуации: 1 и 2if (mod1 == mod2 && mod3 == 0) {(! list1 [0]) {[0] = true;-= 1;

}if (! list1 [1]) {[1] = true;-= 1;

}if (! list1 [2]) {[2] = true;-= 1;

}

}if (mod1 == mod3 && mod2 == 0) {[0] = true;-= 1;

}if (mod2 == mod3 && mod1 == 0) {3 [0] = true;

mod3 -= 1;

}

}

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

Перекрашивание объектов производится по заданному шаблону в специальной функции-методе ЦАКП.color(), вызываемой прямо из-под объекта.

// -CGame:color (TShape *Shape)

{(Shape->Brush->Style!= bsClear)

{>Brush->Style = bsClear;++;

}

{>Brush->Style = bsSolid;>Brush->Color = clAqua;-;

}

}

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

// -

void CGame:fixap (int num, TShape *Shape)

{(num) {1:(Shape->Brush->Style == bsClear) {[0] = true;-;

}{[0] = false;++;

};2:(Shape->Brush->Style == bsClear) {[1] = true;-;

}{[1] = false;++;

};3:(Shape->Brush->Style == bsClear) {[2] = true;-;

}{[2] = false;++;

};4:(Shape->Brush->Style == bsClear) {[0] = true;-;

}{[0] = false;++;

};5:(Shape->Brush->Style == bsClear) {[1] = true;-;

}{[1] = false;++;

};6:(Shape->Brush->Style == bsClear) {[0] = true;-;

}{[0] = false;3++;

}

break;

}

}

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

На этом рабочая итерация программы завершается. Дальше алгоритм поведет себя в соответствии с расставленными переключателями. А доступ к переключателям имеет только конечный пользователь.

Ниже представлен алгоритм обработки нажатий пользователя.

Тестирование

логический игра математический программа

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

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

.Уязвимость двух линий.

.Уязвимость передачи хода.

.Уязвимость в условиях определения победителя.

.Некоторые внутренние конфликты (исключения).

.Дописанный метод ЦАКП, проверяющий правильность взятия игровых объектов. Это основное и наиболее важное правило игры: брать камни можно только из одной кучки.

// -CGame:useHelp (TShape *Shape1, TShape *Shape2,*Shape3, TShape *Shape4,*Shape5, TShape *Shape6)

{(((Shape1->Brush->Style == bsClear || Shape2->Brush->Style == bsClear

|| Shape3->Brush->Style == bsClear) &&

(Shape4->Brush->Style == bsClear || Shape5->Brush->Style == bsClear

|| Shape6->Brush->Style == bsClear))

||

((Shape4->Brush->Style == bsClear || Shape5->Brush->Style == bsClear)

&&(Shape1->Brush->Style == bsClear || Shape2->Brush->Style == bsClear

|| Shape3->Brush->Style == bsClear || Shape6->Brush->Style == bsClear))

||

(Shape6->Brush->Style == bsClear &&

(Shape1->Brush->Style == bsClear || Shape2->Brush->Style == bsClear

|| Shape3->Brush->Style == bsClear || Shape4->Brush->Style == bsClear

|| Shape5->Brush->Style == bsClear))) {0;

}

else return 1;

}

Проверка основывается на подiете перекрашенных и неперекрашенных камешков. Поэтому, как только конечный пользовател

Copyright © 2008-2014 geum.ru   рубрикатор по предметам  рубрикатор по типам работ  пользовательское соглашение