Obsah lekce:
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]
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?
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.
const radku = 20; sloupcu = 70;
type piskvorky = array[1..radku, 1..sloupcu] of char;
var p:piskvorky;
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.
for radek:=1 to radku do
for sloupec:=1 to sloupcu do
p[radek,sloupec]:='.';
Ke zobrazení stavu hry stačí vypsat pole na obrazovku.
for radek:=1 to pocetradku do
begin
for sloupec:=1 to pocetsloupcu do
begin
write(p[radek,sloupec]);
end;
writeln;
end;
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.
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;
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).
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;
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).