Пилипчук О.П., вчитель інформатики Гаврилівської ЗОШ Теофіпольського району Хмельницької області
Хрестики-нулики-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. Наступний крок - реалізувати реєстрацію користувача, ведення таблиці рекордів, пропозицію продовжити гру по завершенні партії і т.д.
Интернет реклама