Четвер, 21.11.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]
Головна » Статті » Програмування » Паскаль

Хрестики-нулики на Паскалі

Нові статті

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

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

Хрестики-нулики

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

Програмування ігор справа цікава і захоплююча. Проте, починати бажано з чогось простого і зрозумілого. Спробуємо скласти ігрову програму, яка перетворить комп'ютер на партнера у популярній грі "Хрестики-нулики". Причому, це буде класичний варіант, в якому поле складається з 9 клітинок (квадрат 3*3). Гравці по черзі ставлять в клітинки значки: один - хрестики, другий - нулики. Виграє той, хто поставить три своїх значки в один ряд (по вертикалі, по горизонталі або по діагоналі).

Технічні умови

  1. Середовище розробки - Free Pascal, з використанням лише засобів, доступних у Turbo Pascal 7.0. Це зробить програму універсальнішою.
  2. Програма не використовуватиме графічних засобів. Ігрове поле буде зображене текстовими засобами.
  3. Комп'ютер починатиме гру і гратиме "нуликами".

Базовий матеріал

  1. Використання двовимірного масиву.
  2. Вкладені цикли.
  3. Процедури користувача.
  4. Процедури для роботи з екраном (модуль 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. Процедура, результатом якої будуть... "грати", намальовані на екрані, тобто шаблон ігрового поля. Звідси, власне, й назва. З використанням циклів вона була б коротшою, зате без них - дуже наочна ;):

procedure grati;
begin
ClrScr; Textcolor(red);

gotoxy(25,4);   writeln ('         **         **         ');
gotoxy(25,5);   writeln ('         **        **         ');
gotoxy(25,6);   writeln ('         **         **         ');
gotoxy(25,7);   writeln ('         **         **         ');
gotoxy(25,8);   writeln ('*******************************');
gotoxy(25,9);   writeln ('*******************************');
gotoxy(25,10);  writeln ('         **         **         ');
gotoxy(25,11);  writeln ('         **        **         ');
gotoxy(25,12);  writeln ('         **         **         ');
gotoxy(25,13);  writeln ('         **         **         ');
gotoxy(25,14);  writeln ('*******************************');
gotoxy(25,15);  writeln ('*******************************');
gotoxy(25,16);  writeln ('         **         **         ');
gotoxy(25,17);  writeln ('         **        **         ');
gotoxy(25,18);  writeln ('         **         **         ');
gotoxy(25,19);  writeln ('         **         **         ')
end;

5. З назви цієї процедури має бути зрозуміло, що призначена вона для малювання хрестика. Де саме він з'явиться, залежить від аргументів r (рядок) і s (стовпець):

procedure hrest (r,s:integer);
begin
textcolor (green);
gotoxy(s*11+14,r*6-2); write (' ##   ## ');
gotoxy(s*11+14,r*6-1); write ('   ###   ');
gotoxy(s*11+14,r*6);   write ('   ###   ');
gotoxy(s*11+14,r*6+1); write (' ##   ## ');
end;

6. Дуже схожа на попередню але зовсім не така :) процедура для малювання нулика:

procedure nol (r,s:integer);
begin
textcolor (white);
gotoxy(s*11+14,r*6-2); write ('  #####  ');
gotoxy(s*11+14,r*6-1); write (' ##   ## ');
gotoxy(s*11+14,r*6);   write (' ##   ## ');
gotoxy(s*11+14,r*6+1); write ('  #####  ');
end;

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.Тепер можна випробувати програму. Звичайно, якість гри комп'ютера не вражає: ну не можна в цій грі ходити випадковим чином! Про те, як наростити штучний інтелект читайте в наступному матеріалі.

Интернет реклама
Категорія: Паскаль | Додав: teachlab (28.02.2009)
Переглядів: 3624 | Комментарі: 1 | Рейтинг: 0.0/0
Всього коментарів: 1
1 Druzhal  
0
Я дмаю така програмка буде цікава як учням так і вчителям!!! :-)

Додавати коментарі можуть тільки зареєстровані користувачі.
[ Реєстрація | Вхід ]
Форма входу
Пошук
Друзі сайту

Підтримка


Статистика
Copyright Пилипчук О.П. © 2024
div id=