Пилипчук О.П., вчитель інформатики Гаврилівської ЗОШ Теофіпольського району Хмельницької області
Хрестики-нулики
Процедурне програмування мовою Паскаль
Програмування ігор справа цікава і захоплююча. Проте, починати бажано з чогось простого і зрозумілого. Спробуємо скласти ігрову програму, яка перетворить комп'ютер на партнера у популярній грі "Хрестики-нулики". Причому, це буде класичний варіант, в якому поле складається з 9 клітинок (квадрат 3*3). Гравці по черзі ставлять в клітинки значки: один - хрестики, другий - нулики. Виграє той, хто поставить три своїх значки в один ряд (по вертикалі, по горизонталі або по діагоналі).
Технічні умови
Середовище розробки - Free Pascal, з використанням лише засобів, доступних у Turbo Pascal 7.0. Це зробить програму універсальнішою.
Програма не використовуватиме графічних засобів. Ігрове поле буде зображене текстовими засобами.
Комп'ютер починатиме гру і гратиме "нуликами".
Базовий матеріал
Використання двовимірного масиву.
Вкладені цикли.
Процедури користувача.
Процедури для роботи з екраном (модуль Crt): ClrScr, Textcolor(), gotoxy().
Розробка програми
Якщо з подальшого тексту вилучити пояснення, залишиться працездатна програма (по ідеї :)
1. Спочатку, як і домовлялись, включаємо модуль для роботи з текстовим екраном (Crt):
program hrest_nol; uses crt;
2. Основна структура даних - масив, який моделює ігрове поле. Кожен його елемент може містити символ '0', 'Х' або пропуск, залежно від того, що має бути в клітинці ігрового поля:
var pole : array [1..3,1..3] of char;
3. Відразу ж і процедура, яку потрібно буде викликати на початку гри, щоб очистити поле. У всі комірки заносимо пропуски:
procedure inicial; var r,s:integer; begin for r:=1 to 3 do for s:=1 to 3 do pole[r,s]:=' ' end;
4. Процедура, результатом якої будуть... "грати", намальовані на екрані, тобто шаблон ігрового поля. Звідси, власне, й назва. З використанням циклів вона була б коротшою, зате без них - дуже наочна ;):
5. З назви цієї процедури має бути зрозуміло, що призначена вона для малювання хрестика. Де саме він з'явиться, залежить від аргументів r (рядок) і s (стовпець):
7. Процедура для малювання на екрані поточного вигляду ігрового поля. Її доведеться викликати після кожного ходу людини або комп'ютера:
procedure pokaz_polja; var r,s:integer; begin grati; for r:=1 to 3 do {аналізуємо кожен рядок масиву,...} for s:=1 to 3 do {...а в рядку - кожен елемент і,...} if pole[r,s]<>' ' {...якщо клітинка не порожня,...} then if pole [r,s]='X' then hrest(r,s) {...то малюємо хрестик...} else nol(r,s); {...або нулик} gotoxy(1,25) {забираємо курсор, щоб не блимав перед очима :)} end;
8. Процедура, яка робить програму інтерактивною :), тобто забезпечує хід людини:
procedure hid_ljudini; var r,s:integer; begin textcolor (yellow);
repeat write ('Введи номер рядка і, через пропуск, - стовпця: '); readln (r,s); until pole[r,s]=' '; {цикл не припиниться, доки людина не походить коректно!}
pole[r,s]:='X'; {ставимо хрестик в масив...} pokaz_polja {і перемальовуємо поле} end;
9. А в цій процедурі зосереджений штучний інтелект! Від її якості залежить успіх комп'ютера в різного рівня змаганнях, бо вона забезпечує хід комп'ютера:
procedure hid_compa; var r,s,rr,ss,nr,ns,k:integer; begin textcolor (yellow); 10. Для перших випробувань досить зробити, щоб комп'ютер обрав порожню клітинку випадковим чином...
repeat nr:= 1+random(3); ns:=1+random(3) until (pole[nr,ns]=' ');
11. ...і впевнено поставив туди нулик:
pole[nr,ns]:='O'; pokaz_polja end;
12. Після кожного ходу потрібно перевіряти, чи не виграв хтось із партнерів. Це буде зроблено в процедурі perewirka. Результат перевірки передається через глобальну змінну prapor: пропуск - партія не завершена, '*' - нічия, 'Х' або '0' - виграш відповідної сторони: var prapor:char; procedure perewirka; var r,s:integer; begin {перевірка рядків} if (pole[1,1]=pole[1,2]) and (pole[1,1]=pole[1,3]) then prapor:=pole[1,3] else if (pole[2,1]=pole[2,2]) and (pole[2,1]=pole[2,3]) then prapor:=pole[2,3] else if (pole[3,1]=pole[3,2]) and (pole[3,1]=pole[3,3]) then prapor:=pole[3,3] {перевірка стовпців} else if (pole[1,1]=pole[2,1]) and (pole[1,1]=pole[3,1]) then prapor:=pole[1,1] else if (pole[1,2]=pole[2,2]) and (pole[1,2]=pole[3,2]) then prapor:=pole[1,2] else if (pole[1,3]=pole[2,3]) and (pole[1,3]=pole[3,3]) then prapor:=pole[1,3] {перевірка діагоналі 1} else if (pole[1,1]=pole[2,2]) and (pole[1,1]=pole[3,3]) then prapor:=pole[1,1] {перевірка діагоналі 2} else if (pole[1,3]=pole[2,2]) and (pole[1,3]=pole[3,1]) then prapor:=pole[2,2] {перевірка на нічию} else begin prapor:='*'; for r:=1 to 3 do for s:=1 to 3 do if pole[r,s]=' ' then prapor:=' ' end end;
13. А ось і сама програма:
begin randomize; prapor:=' '; writeln ('Ну що? Зіграємо? Я ходжу нуликами'); readln;
inicial;
14. Основний цикл. Комп'ютер і людина ходять по черзі, аж поки перевірка покаже, що гра завершена: repeat hid_compa; perewirka; if prapor=' ' then begin hid_ljudini; perewirka end until prapor<>' ';
15. Розбір результатів:
textcolor (yellow);
if prapor='X' then writeln ('Вітаю! Ти достойний суперник!') else if prapor='O' then writeln ('Тренуйся, і колись гратимеш так, як Я!') else writeln ('НІЧИЯ...');
readln end.
16.Тепер можна випробувати програму. Звичайно, якість гри комп'ютера не вражає: ну не можна в цій грі ходити випадковим чином! Про те, як наростити штучний інтелект читайте в наступному матеріалі.