Четвер, 28.03.2024
Творча лабораторія

Навчальні посібники та робочі зошити з інформатики - якісно і дешево


Меню сайту
Реклама
Категорії каталогу
MS Visual C++ 2005 Express Edition [3]
Середовища програмування [8]
Особливості встановлення та використання різних середовищ програмування
MS Visual Basic 6 [1]
Microsoft Visual Basic
C# [8]
Програмування мовою C#
C++ [3]
Паскаль [5]
ЛОГО [1]
Олімпіадне програмування [0]
Python [1]
Головна » Статті » Програмування » Паскаль

Хрестики-нулики-2. Формуємо штучний інтелект :)

Нові статті

[19.02.2020] [C#]
Задача про розрізання квадрата (ООП, C#)
[09.02.2020] [Python]
Задача про розрізання квадрата (ООП, Python)
[06.02.2020] [Паскаль]
Задача про розрізання квадрата (ООП, Free Pascal)

Пилипчук О.П., вчитель інформатики Гаврилівської ЗОШ Теофіпольського району Хмельницької області

Хрестики-нулики-2. Штучний інтелект :)

Процедурне програмування мовою Паскаль

У попередньому матеріалі ми отримали працездатну програму, яка перетворювала комп'ютер на партнера у популярній грі "Хрестики-нулики". Але рівень його гри, м'яко кажучи, був невисокий: він обирав клітинку випадковим чином, зовсім не аналізуючи, що робиться на полі. Настав час вдосконалити процедуру, яка генерує хід комп'ютера.

1. Отже, нова версія процедури hid_compa. Відтепер в ній буде зосереджений штучний інтелект! Від її якості залежить успіх комп'ютера в різного рівня змаганнях, адже вона забезпечує хід комп'ютера: 

procedure hid_compa;
var r,s,rr,ss,nr,ns,k:integer;
begin
textcolor (yellow);
k:=0; {лічильник}


2. У процесі перевірки стану ігрового поля змінні ns і nr зафіксують клітинку, в яку зробить хід комп'ютер. Перший рівень майстерності передбачає: "Не пропусти виграшного ходу!". Тобто, якщо в якомусь рядку, стовпці чи діагоналі вже є два нулики, то потрібно дописувати ще один і тішитись перемогою:

   for r:=1 to 3 do
for s:=1 to 3 do
if pole[r,s]=' ' {для кожної порожньої клітинки виконуємо...}
then begin
if (k<>2) then begin k:=0;  {...перевірку у стовпці,...}
for rr:=1 to 3 do if pole [rr,s]='O'
then begin inc(k);
if k=2 then begin
ns:=s;nr:=r
end
end

end;

if (k<>2) then begin k:=0;   {...перевірку у рядку...}
for ss:=1 to 3 do if pole [r,ss]='O'
then begin inc(k);
if k=2 then begin
ns:=s;nr:=r
end
end
end;
{..., а для тих, що лежать на діагоналях, ще й...}    
if (k<>2) and (r=s) then begin k:=0; {...перевірку у діагоналі 1, та...}
for ss:=1 to 3 do if pole [ss,ss]='O'
then begin inc(k);
if k=2 then begin
ns:=s;nr:=r
end
end

end;

if (k<>2) and (r=4-s) then begin k:=0;  {...перевірку у діагоналі 2}
for ss:=1 to 3 do if pole [ss,4-ss]='O'
then begin inc(k);
if k=2 then begin
ns:=s;nr:=r
end
end
end
end;


3. Другий рівень майстерності вимагає: "Не дай виграти супернику!". Тобто, якщо в якомусь рядку, стовпці чи діагоналі вже є два хрестики, то потрібно ставити біля них нулик і сподіватись, що це був єдиний виграшний хід суперника. Змінні k, ns та nr продовжують використовуватися так само: 

if k<>2 then
for r:=1 to 3 do
for s:=1 to 3 do
if pole[r,s]=' '
then begin {перевірка у стовпці}
if (k<>2) then begin k:=0;
for rr:=1 to 3 do if pole [rr,s]='X'
then begin inc(k);
if k=2 then begin
ns:=s;nr:=r
end
end

end;
{перевірка у рядку}
if (k<>2) then begin k:=0;
for ss:=1 to 3 do if pole [r,ss]='X'
then begin inc(k);
if k=2 then begin
ns:=s;nr:=r
end
end
end;
{перевірка у діагоналі 1}
if (k<>2) and (r=s) then begin k:=0;
for ss:=1 to 3 do if pole [ss,ss]='X'
then begin inc(k);
if k=2 then begin
ns:=s;nr:=r
end
end

end;
{перевірка у діагоналі 2}
if (k<>2) and (r=4-s) then begin k:=0;
for ss:=1 to 3 do if pole [ss,4-ss]='X'
then begin inc(k);
if k=2 then begin
ns:=s;nr:=r
end
end
end
end;


4. Якщо ж виграшного ходу немає і немає загрози виграшу людини, то комп'ютер, як і раніше, обирає порожню клітинку випадковим чином:

if k<>2 then
repeat
nr:= 1+random(3); ns:=1+random(3)
until (pole[nr,ns]=' ');


5. ...і впевнено ставить туди нулик:

pole[nr,ns]:='O';
pokaz_polja
end; {кінець дуже довгої процедури hid_compa}


6. Завдяки процедурному стилю програми, жодних змін в інші процедури вносити не потрібно.

Перспективи проекту

1. 4 рядочки записані у п.4 - місце для подальшого вдосконалення програми. Якщо немає виграшного ходу і клітинки, яка загрожує програшем, то вибирати хід випадково - не найкращий варіант. Можна ці рядки замінити пошуком клітинки, яка гарантовано веде до виграшу наступним ходом (на малюнку - третя клітинка у першому рядку):
 


2. Комп'ютер нав'язує свої умови: завжди грає нуликами, ходить першим... Програму можна вдосконалити, щоб уникнути цієї незручності.
3. Наступний крок - реалізувати реєстрацію користувача, ведення таблиці рекордів, пропозицію продовжити гру по завершенні партії і т.д.
 


Интернет реклама
Категорія: Паскаль | Додав: teachlab (03.03.2009)
Переглядів: 2545 | Рейтинг: 0.0/0
Всього коментарів: 0
Додавати коментарі можуть тільки зареєстровані користувачі.
[ Реєстрація | Вхід ]
Форма входу
Пошук
Друзі сайту

Підтримка

Система Orphus

Маєте свій сайт?
Заробіть на ньому грошей!


Не маєте власного сайту?
Заробіть на обміні файлами!
Статистика
Copyright Пилипчук О.П. © 2024
div id=