Anglická verze
logolink

< Zpět na seznam lekcí

Hra piškvorky II

AlgortimyObsah lekce:

  • Zadání jmen hráčů
  • Tah hráče
  • Průběh hry (tahy hráčů)

Zadání jmen hráčů

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.

Vložení jmen hráčů
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

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).

Tah hráče
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.

Tah hráče
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í).

Tah hráče
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);

Průběh hry (tahy hráčů)

Vzpomeňme si na to, co se bude během hry v krocích dít:

  • 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...?).

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.

Přidání while cyklu
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'.

Definování proměnné pro typ kamene
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.

Vložení kamene a vypsání pole na konci
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áčů.

Změna hráče
if (typkamene='X') then typkamene:='O' else typkamene:='X';

Domácí úkol

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ě).

Další čtení

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