Obsah lekce:
Zadání jmen hráčů - pokuste se sami navrhnout potřebné datové struktury pro uložení potřebných informací o hráčích (budeme uvažovat standardní dva hráče). Tento krok je velmi jednoduchý. Stačí pouze vytvořit dvě proměnné (hrac1, hrac2) typu string pro uložení řetězce - jména hráče. Uživatel do nich jen zadá požadovaná jména.
var hrac1, hrac2:string;
...
writeln('Zadejte prosim jmeno hrace c.1:');
readln(hrac1);
writeln;
writeln('Zadejte prosim jmeno hrace c.2:');
readln(hrac2);
Tah hráče znamená, že zvolí pozici, kam chce umístit svůj kámen. Je tedy nutno zadat souřadnice r, s nějakého prvku pole. Souřadnice budou reprezentovány dvěma proměnnými r, s typu byte (předpokládáme, že nám tento datový typ bude dostačovat).
write('Zadejte cislo radku: ');
readln(r);
write('Zadejte cislo sloupce: ');
readln(s);
Je nutno myslet na to, že hráč může do r a do s zadat libovolné číslo typu byte. Co to znamená?
Především musíme ošetřit situaci, kdy by hráč zadal pozici (r,s) mimo rozměr pole (hrací plochy). Měli bychom před zadáním zobrazit upozornění, aby hráč zadal správné souřadnice.
writeln('Souradnice radku musi byt od 1 do ',pocetradku,'.');
write('radek: ');
readln(r);
writeln('Souradnice sloupce musi byt od 1 do ',pocetsloupcu,'.');
write('sloupec: ');
readln(s);
Uvědomme si, že k umístění kamene nestačí pouze to, že se kamenem "trefíme" na hrací plochu. Ještě je třeba zajistit to, že kámen vložíme do hrací plochy pouze, pokud je pole pro vložení volné (neobsazené jiným kamenem - pokusili bychom se vlastně "přepsat" existující kámen naším). Rozšíříme tedy upozornění pro uživatele a samostatně doplňte podmínku, která ověří, že je dané pole volné (a jen v tomto případě se kámen skutečně umístí).
writeln('Souradnice radku musi byt od 1 do ',pocetradku,' a zadana pozice musi byt volna.');
write('Zadejte radek: ');
readln(r);
writeln('Souradnice sloupce musi byt od 1 do ',pocetsloupcu,' a zadana pozice musi byt volna.');
write('Zadejte sloupec: ');
readln(s);
Vzpomeňme si na to, co se bude během hry v krocích dít:
Vidíme, že se jedná o cyklus - opakující se kroky - dokud nenastane konec hry (tedy nastane stav, kdy bude splněna nějaká podmínka, která říká, že je konec hry). Pro tuto situaci se nejlépe hodí univerzální cyklus while (dokud je splněna nějaká podmínka, tak opakuj ... dokud není konec hry, tak opakuj tahy hráčů).
Podmínka pro konec hry může být složitá a bylo by nepraktické ji celou psát do hlavičky while cyklu. Pomůžeme si tím, že deklarujeme proměnnou konec datového typu boolean, kterou nastavíme na false (není konec hry) a změníme ji na true v případě, že program vyhodnotí, že konec hry nastal.
konec:=false;
while (konec=false) do
begin
end;
Poslední, co musíme vyřešit před testem na konec hry, je střídání hráčů. Během hry tedy musíme vědět zda hraje hráč 1 nebo hráč 2 a jaký typ kamene se tedy v případě položení kamene umístit (křížek nebo kolečko).
Deklarujeme proměnnou typkamene:char, která bude obsahovat buď znak kolečko 'O' nebo křížek 'X'. Před začátkem cyklu while nastavíme tuto proměnnou například na hodnotu 'X'.
konec:=false;
typkamene:='X';
while (konec=false) do
begin
end;
Do cyklu dosadíme instrukce pro vložení kamene na zadanou pozici [r,s] kámen umístíme pomocí příkazu p[r,s]:=typkamene. Na závěr si pole vypíšeme na obrazovku.
konec:=false;
typkamene:='X';
while (konec=false) do
begin
writeln('Zadej radek pro kamen: (1 - ',pocetradku,')');
readln(r);
while (r > (pocetradku)) or (r < 1) do
begin
IF (r > (pocetradku)) or (r < 1) then
begin
writeln ('Zadal jste radek mimo hraci plochu.');
writeln('Zadej radek pro kamen: (1 - ',pocetradku,')');
readln(r);
end;
end;
writeln('Zadej sloupec pro kamen: (1 - ',pocetsloupcu,')');
readln(s);
while (s > (pocetsloupcu)) or (s < 1) do
begin
IF (s > (pocetsloupcu)) or (s < 1) then
begin
writeln ('Zadal jste sloupec mimo hraci plochu.');
writeln('Zadej sloupec pro kamen: (1 - ',pocetsloupcu,')');
readln(s);
end;
end;
p[r,s]:=typkamene;
for i:=1 to pocetradku do
begin
for j:=1 to pocetsloupcu do
begin
write(p[i,j]);
end;
writeln;
end;
end;
Na konec cyklu přidáme ještě příkaz na změnu typu kamene v důsledku vystřídání hráčů.
if (typkamene='X') then typkamene:='O' else typkamene:='X';
Pokuste se napsat část programu pro vyhodnocení konce hry na jednoduché hrací ploše rozměru 3x3. Konec hry nastane v momentě, kdy budou někde v poli 3 stejné prvky vedle sebe (ať už horizontálně, vertikálně nebo diagonálně).