Федеральное агентство пообразованию
Государственное образовательноеучреждение
Высшего профессиональногообразования
Камская государственнаяинжинерно-экономическая академия
Кафедра «ПИУ»
Контрольная работа
по дисциплине «Система искусственного интеллекта»
на тему: игра «Крестики-нолики»
Выполнила:студентка гр. 4468-с
РысеваТатьяна Александровна
Проверил: КалимуллинА.Ш..
НабережныеЧелны – 2010
Содержание
1 Постановка задачи. 3
2 Интерфейс пользователя. 4
3 Алгоритм работы программы… 7
4 Результат решения. 12
Список использованных источников. 16
1 Постановказадачи
Задание:составить программу, осуществляющую игру «крестики-нолики» с пользователем. Приэтом она будет иметь возможность запоминания ходов и на основе них ходить такчтобы не оказаться в проигрыше.
Крестикинолики основаны на игре в процессе которого два игрока рисуют на поле нули икрестики, в нашем случае игра будет проходить на поле 3 на 3. Один игрок рисуеттолько крестики, в нашем случае пользователь. Второй игрок рисует нули –компьютер. Игра продолжается до тех пор пока один из игроков не нарисует своисимволы (то есть крестик или нолик), так что они находятся в одном ряду по триштуки. Также идет подсчет по диагонали. Игра также считается законченной еслине осталось мест на поле и в этом случае объявляется ничья.
Длярешения данной задачи необходимо составить программу, которая визуально будетотображать нам поле, будет написан алгоритм определения победителя, также выводинформации о статусе игры.
Кромеэтого, необходимо создать базу данных для сохранения знаний полученных,программой интеллекта. Также иметь возможность использования полученных знаний.
Длявыполнения этой работы была выбрана среда программирования Delphi 7, так как она является наиболееудобной и понятной. Базу знаний будем хранить в таблице в базе данных MS Access, что облегчает просмотр таблицы без использованиякаких либо других программ.
Алгоритмвыполнения данных действий рассмотрим далее.
2 Интерфейспользователя
Запускигры осуществляется двойным щелчком по krestiki_noliki.exe. После этого появляется окно программы с полем дляигры (рисунок 1).
/>
Рисунок1 – Главная окно программы
Программатакже содержит меню, состоящее из меню «Файла» и «Справки». В свое время меню«Файл» содержит в себе подменю «Новая игра», «Очистить базу» и «Выход». «Новаяигра» нужна для начала игры, «Очистить базу» — удаляет все записи сделанныепрограммой в базу знаний, «Выход» — для окончания работы с программой.«Справка» состоит из одного пункта подменю «О программе», которая выводитинформацию о том, кто сделал эту программу (рисунок 2).
/>
Рисунок2 – О программе
Началоигры выполняется с процесса нажатия на поле левым щелчком мыши. Выполняем ход,в ответ на наш ход программа в начале начинает ходить наугад. В итоге мывыигрываем:
/>
Рисунок3 – Окно нашего выигрыша
Попытаемсяпроделать данную схему выигрыша повторно, и получаем ответ от компьютера в видепрепятствия ноликом в нашем направлении. Что мы видим на рисунке 3.
/>
Рисунок4 – Выбор компьютером хода, препятствующий нашему выигрышу
В итоге проиграв этим способом получаем ничью:
/>
Рисунок5 – Окно ничьи
Повторимсхему еще раз и получаем проигрыш:
/>
Рисунок6 – Окно нашего проигрыша
3 Алгоритмработы программы
Главноеокно программы состоит из трех процедур и нескольких «ответных реакций» насобытия компонентов.
Рассмотримподробнее каждую процедуру:
1.Процедура очистки, называется «clean».Здесь происходит очистка полей.
Form1.Panel2.Caption:='';
2.Процедура «game», которая проверяет статус игры ивыводит соответствующее сообщение при выигрыше, проигрыше и ничье.
Здесьпроверяется выигрыш на равенство соответствующих ячеек поля согласно условиямигры «крестики-нолики», например равенство первого столбца:
if(Form1.Panel2.Caption=Form1.Panel3.Caption) and(Form1.Panel2.Caption=Form1.Panel4.Caption) and(Form1.Panel2.Caption'') then begin
Еслиданное условие выполняется выводится окно выигрыша с соответствующим значением:
Form3.Label1.Caption:=Form1.Panel2.Caption;// Если выигрышная комбинация то присваиваем Х или О в Лейбл формы поздравления
…
Form3.ShowModal; //Открываем окно поздравления ":-)"
Вместе где стоят точки стоит код который при условии выигрыша пользователем,заносит эти данные в таблицу, то есть данные поля.
Form1.adotable1.Insert;
if (Form1.Panel2.Caption='X') then begin
Form1.adotable1xod1.Value:=Form1.Panel10.Caption;
Form1.adotable1xod2.Value:=Form1.Panel2.Caption;
Form1.adotable1xod3.Value:=Form1.Panel3.Caption;
Form1.adotable1xod4.Value:=Form1.Panel4.Caption;
Form1.adotable1xod5.Value:=Form1.Panel5.Caption;
Form1.adotable1xod6.Value:=Form1.Panel6.Caption;
Form1.adotable1xod7.Value:=Form1.Panel7.Caption;
Form1.adotable1xod8.Value:=Form1.Panel8.Caption;
Form1.adotable1xod9.Value:=Form1.Panel9.Caption;
Form1.adotable1game.Value:=1;
end;
Тутже происходит вызов процедуры очистки поля игры.
clean;// Очистка игрового поля
Кромевыигрыша и проигрыша, есть возможность ничьи. Для этого проверяется игра назаполнение поля, после проверок на все возможные выигрыши. Выводится сообщение о ничье и также очищается поле игры.
if(Form1.Panel2.Caption'') and (Form1.Panel3.Caption'') and(Form1.Panel4.Caption'') and (Form1.Panel5.Caption'') and(Form1.Panel6.Caption'') and (Form1.Panel7.Caption'') and(Form1.Panel8.Caption'') and (Form1.Panel9.Caption'') and(Form1.Panel10.Caption'')
then
begin
ShowMessage('Ничья, попробуйтеещёраз!');
clean;
end;
3.Последняя процедура «panel»необходима для осуществления ходов компьютером случайным образом, до тех порпока не надет свободное поле. Чтоб эта процедура не зациклилась, проверяем навозможность ничьи, то есть на наполняемость полей.
1:randomize;
case random(8) of
1:if form1.panel10.Caption='' then begin
form1.panel10.Caption:='O';
end else begin goto 1; end;
… … … … …
0:if form1.panel9.Caption='' then begin
form1.panel9.Caption:='O';
end else begin goto 1; end;
end; end;
Кромепроцедур написанных вручную, существуют процедуры обработки событий. Например,на каждую Panel, то есть ячейку поля игры, написаноразличные обработки. Рассмотрим их подробнее.
Сначалапроверяется поле, в нашем случае panel,на наполняемость. В случае если он не пуст, выходим из обработчика событий.
if Panel2.Caption'' then exit;
Еслиже поле пусто выполняется заполнение поля символом «X» и открывается таблица для проверки из базы знанийсоответствующих ходов.
Panel2.Caption:='X';
adotable1.Edit;
adotable1.open;
whileadotable1.Eof=false do
begin
Похожи ли эти ходы на те,что в базе проигрышных ходов:
if((adotable1game.Value=1) and ((adotable1xod1.Value=Panel10.Caption) or(Panel10.Caption='')) and ((adotable1xod2.Value=Panel2.Caption) or(Panel2.Caption=''))
and((adotable1xod3.Value=Panel3.Caption) or (Panel3.Caption='')) and((adotable1xod4.Value=Panel4.Caption) or (Panel4.Caption=''))
and((adotable1xod5.Value=Panel5.Caption) or (Panel5.Caption='')) and((adotable1xod6.Value=Panel6.Caption) or (Panel6.Caption=''))
and((adotable1xod7.Value=Panel7.Caption) or (Panel7.Caption='')) and((adotable1xod8.Value=Panel8.Caption) or (Panel8.Caption=''))
and((adotable1xod9.Value=Panel9.Caption) or (Panel9.Caption='')))
then begin l:=0;
Привыполнении условия соответствия ходов игры и ходов в базе. Ищутся ходы с «X»-ами в таблице и пустыми в нашейигре и в эти поля рисуем нули.
if((adotable1xod1.Value='X') and (Panel10.Caption='')) then begin Panel10.Caption:='O';break; end;
… … … … … …
if((adotable1xod9.Value='X') and (Panel9.Caption='')) then begin Panel9.Caption:='O';break; end;
end
Если таких ходов втаблице нет:
else begin l:=1; end;
adotable1.next;
end;
тотогда ходы делаются случайным образом.
ifl=1 thenpanel;
Процедуразавершается проверкой на статус игры:
game;
Напроцедуру меню очистки игры написано:
adotable1.Edit;
adotable1.open;
while adotable1.Eof=false do
begin
adotable1.Delete;
end;
Тоесть удаляются все значения таблицы.
Привыборе пункта меню «Новая игра» вызывается процедура «clean».
А привыходе закрывается главное окно, а значит завершается и игра:
Close;// Выход из программы
Привызове пункта меню «О программе», запускается окно «О программе»:
Form2.ShowModal;// Вызываем окно «О программе»
Данноеокно содержит процедуры событий нажатия всех отображаемых компонентов в видезакрытия окна:
Form2.Close;
Воизбежании некорректного отображения расположения компонентов на главном окне,блокируем возможность увеличения окна игры:
procedure TForm1.FormCreate(Sender: TObject);
var
l:DWORD;// Процедура блокировки кнопки «Развернуть»
begin
l:=GetWindowLong(Self.Handle,GWL_STYLE);
l:=l and not(WS_MAXIMIZEBOX);
l:=SetWindowLong(Self.Handle,GWL_STYLE,l);
end;
Такжекак и в окне о программе, окно выигрыша имеет только события закрытия данногоокна.
4 Результатрешения
Приведемпример ходов, осуществляемых нами, и проверим реакцию на него программы.Предварительно очистим базу знаний.
1.Ходить начнем по диагонали с правого верхнего угла к левому нижнему.
Результатпервой попытки:
/>
Результатвторой попытки, после того как нам не дали ходить как раньше, мы ставимкрестики по первой строке:
/>
Результаттретей попытки, мы сходили по середине и опять выиграли:
/>
Результатчетвертой попытки, компьютер не дал нам сходить по предыдущим выигрышам, и мыпроиграли:
/>
2.Ходить начнем (не очищаем базу знаний) по диагонали с левого верхнего угла книжнему правому.
Результатпервой попытки, мы приограли:
/>
Результатвторой попытки, мы решили ходить по первой строчке:
/>
Результаттретей попытки ничья:
/>
Список использованных источников
1. С. Бобровский «Delphi 7. Учебный курс». – СПБ.: Питер2008.
2. http://ru.wikipedia.org/wiki/Искусственный_интеллект