Anglická verze
logolink

< Zpět na seznam lekcí

Hra piškvorky I

AlgortimyObsah lekce:

  • Princip hry
  • Algoritmus - Hlavní kroky programu
  • Inicializace pole
  • Zobrazení stavu hry
  • Zadání délky posloupnosti pro výhru
  • Zadání jmen hráčů

Princip hry

Piškvorky jsou strategická hra, ve které spolu soupeří dva hráči. Nejčastěji se hraje na čtverečkovaném papíře, na kterém se hráči střídají v kreslení křížku/kolečka. Vyhrává hráč, který jako první vytvoří nepřerušenou řadu pěti svých značek. [http://cs.wikipedia.org/wiki/Piškvorky]

Algoritmus - hlavní kroky programu

  • Inicializace hrací plochy (nalezněte na Internetu význam slova inicializace).
  • Zadání délky výherní posloupnosti.
  • Zadání jmen hráčů.
  • Opakující se tahy hráčů dokud není konec hry. Ty by se daly popsat takto:
  • Hráč 1 zvolí řádek a sloupec pro svůj znak a ten se umístí.
  • Hráč 2 zvolí řádek a sloupec pro svůj znak a ten se umístí.
  • Hráč 1 zvolí řádek a sloupec pro svůj znak a ten se umístí.
  • ...
  • Tahy hráčů se opakují, dokud není konec hry (ten nastane v případě, že hráč vytvoří posloupnost kamenů dané délky nebo...?).

Proměnné a datové typy

Náš program potřebuje pro svůj běh uchovávat informace. K tomuto účelu slouží proměnné. Zvažme nejprve vše, co potřebujeme mít v programu uloženo.

Hrací plochu (náš imaginární čtverečkovaný papír) - tato plocha bude reprezentována dvojrozměrným polem mxn polí (pokud bychom hráli hru pouze ve standardním textovém režimu v konzoli Windows, tak musíme uvažovat +- standardně zobrazený počet řádků a sloupců - zjistěte, kolik řádků a sloupců má standardně konzolové okno po spuštění programu). K zadání pevného a v programu neměnného rozměru pole poslouží konstanty radku a sloupcu. Poslední otázka, kterou zbývá zodpovědět je: "Jakého datového typu naše pole bude?". Abychom dokázali odpovědět, tak musíme uvážit, co přesně potřebujeme do pole uložit. V jakém stavu se může jedno políčko hrací plochy nacházet?

  • 1. Na hracím poli nic není (je prázdné).
  • 2. Na hracím poli je umístěn symbol prvního hráče (zpravidla kolečko).
  • 3. Na hracím poli je umístěn symbol druhého hráče (zpravidla křížek).

Potřebujeme tedy takový datový typ, do které jsme schopni uložit tři různé znaky (křížek - například velké písmeno X, kolečko - například velké písmeno O a nakonec znak pro označení prázdného políčka - zvolte a vyzkoušejte nějaký alfanumerický znak označující prázdné políčko hrací plochy). Pro tyto účely se nejlépe hodí datový typ char (umožňuje uložit právě jeden alfanumerický znak).

V následujícím rámečku vidíme deklaraci dvou konstant, datového typu pole a proměnné p datového typu piskvorky.

Deklarace proměnných a datových typů
const radku = 20; sloupcu = 70;

type piskvorky = array[1..radku, 1..sloupcu] of char;

var p:piskvorky;

Inicializace hrací plochy

Pro naši hru uvažujme plochu o rozměrech radkuxsloupcu (celkem mxn políček). Inicializaci hrací plochy provedeme nastavením všech hodnot ve všech jejich políčcích na znak tečka ´.´, který znamená prázdné políčko. Proměnná radek obsahuje číslo aktualního řádku a proměnná sloupec číslo aktualního sloupce.

Inicializace hrací plochy
for radek:=1 to radku do
  for sloupec:=1 to sloupcu do
    p[radek,sloupec]:='.';

Zobrazení stavu hry

Ke zobrazení stavu hry stačí vypsat pole na obrazovku.

Zobrazení stavu hry
for radek:=1 to pocetradku do
begin
for sloupec:=1 to pocetsloupcu do
begin
write(p[radek,sloupec]);
end;
writeln;
end;

Zadání délky posloupnosti pro výhru

Ve hře piškvorky vítězí ten, kdo jako první vytvoří na hrací ploše v libovolném ze čtyř směrů posloupnost svých symbolů. Otázkou zůstává jak dlouhá taková posloupnost musí být (zpravidla se hraje na posloupnost o délce 5, ale my hráčům umožníme zvolit 5, 4 nebo 3). Tento parametr si uživatel zvolí ještě před začátkem hry. K tomuto účelu vytvoříme proměnnou, která bude uchovávat jedno ze tří povolených čísel. Jaký datový typ pro proměnnou zvolíme a jak zajistíme, aby se v ní nacházela jedna z povolených hodnot? Jak se bude proměnná jmenovat (říká se, že vhodné pojmenování proměnné je mnohdy těžší úkol než napsat část programu, která ji využívá:).

Až odpovíme na všechny otázky z předhozího odstavce, tak se podívejme na jedno z možných řešení níže.

Zadání proměnné pro délku výherní posloupnosti
var vyhra:byte;
...
vyhra:=0;
while ((vyhra < 3) or (vyhra > 5)) do
begin
writeln ('Zadejte pocet kamenu pro vyhru (3, 4 nebo 5) :');
readln (vyhra);
if ((vyhra < 3) or (vyhra > 5)) then
writeln ('Nezadal jste spravny pocet kamenu.');
end;

Program

Podívejme se nyní, jak by vypadal náš program jako celek. Program je obohacen o možnost, že si uživatel může sám zadat počet políček hrací plochy (pocetradku, pocetsloupcu).

Celý program
program hrapiskvorky;

{$APPTYPE CONSOLE}

uses
SysUtils;

const radku = 20; sloupcu = 70;

type piskvorky = array[1..radku, 1..sloupcu] of char;

var p:piskvorky;
radek, sloupec, pocetradku, pocetsloupcu, vyhra:byte;
hrac1, hrac2:string;

begin
pocetradku:=0;
pocetsloupcu:=0;

while ((pocetradku) < 1) or ((pocetradku) > (radku)) do
begin
writeln ('Zadejte pocet radku hraci plochy 1 - ',radku,':');
readln (pocetradku);
if ((pocetradku) < 1) or ((pocetradku) > (radku)) then
writeln ('Zadali jste spatny pocet radku.');
end;

while ((pocetsloupcu) < 1) or ((pocetsloupcu) > (sloupcu)) do
begin
writeln ('Zadejte pocet sloupcu hraci plochy 1 - ',sloupcu,':');
readln (pocetsloupcu);
if ((pocetsloupcu) < 1) or ((pocetsloupcu) > (sloupcu)) then
writeln ('Zadali jste spatny pocet sloupcu.');
end;

vyhra:=0;

while ((vyhra < 3) or (vyhra > 5)) do
begin
writeln ('Zadejte pocet kamenu pro vyhru (3, 4 nebo 5) :');
readln (vyhra);
if ((vyhra < 3) or (vyhra > 5)) then
writeln ('Nezadal jste spravny pocet kamenu.');
end;

for radek:=1 to pocetradku do
begin
for sloupec:=1 to pocetsloupcu do
begin
p[radek,sloupec]:='.';
end;
end;

writeln('Zadejte prosim jmeno hrace c.1:');
readln(hrac1);
writeln;
writeln('Zadejte prosim jmeno hrace c.2:');
readln(hrac2);

for radek:=1 to pocetradku do
begin
for sloupec:=1 to pocetsloupcu do
begin
write(p[radek,sloupec]);
end;
writeln;
end;

Domácí úkol

Ošetřete zadání jmen hráčů tak, aby uživatel musel zadat jména hráčů tak, aby byla jména různá a měla délku alespoň dva znaky (nápověda: pokuste se využít funkce length).

Další čtení

Odkazy
webdesign, xhtml, css, php - Mgr. Michal Mikláš