Программа-игра "Ним"
Дипломная работа - Компьютеры, программирование
Другие дипломы по предмету Компьютеры, программирование
? в памяти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 рубрикатор по предметам рубрикатор по типам работ пользовательское соглашение