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ě pole (hrac1, hrac2) typu char pro uložení řetězce (velikost pole značí, kolik znaků můžeme v řetězci použít. Je však nutné zohlednit fakt, že poslední znak je vyhrazen pro ukončení řetěžce. Do řetězce o délce 50 znaků tedy můžeme uložit maximálně 49 vlastních znaků) - jména hráče. Uživatel do nich jen zadá požadovaná jména.
char hrac1[50], hrac2[50];
...
printf("Zadejte prosim jmeno hrace c.1:");
scanf("%s", &hrac1);
printf("\n");
printf("Zadejte prosim jmeno hrace c.2:");
scanf("%s", &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 int (předpokládáme, že nám tento datový typ bude dostačovat).
printf("Zadejte cislo radku: ");
scanf("%d, &r);
printf("Zadejte cislo sloupce: ");
scanf("%d, &s);
Je nutno myslet na to, že hráč může do r a do s zadat libovolné číslo typu int. 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.
printf("Souradnice radku musi byt od 1 do %d.",pocetradku);
printf("radek: ");
scanf("%d, &r);
printf("Souradnice sloupce musi byt od 1 do %d.\n",pocetsloupcu);
printf("sloupec: ");
scanf("%d, &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í).
printf("Souradnice radku musi byt od 1 do %d a zadana pozice musi byt volna.",pocetradku);
printf("radek: ");
scanf("%d, &r);
printf("Souradnice sloupce musi byt od 1 do %d a zadana pozice musi byt volna.\n",pocetsloupcu);
printf("sloupec: ");
scanf("%d, &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 int, kterou nastavíme na 0 (není konec hry) a změníme ji na 1 v případě, že program vyhodnotí, že konec hry nastal.
konec=0;
while (konec==0)
{
}
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 char typkamene, 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=0;
typkamene='X';
while (konec==0)
{
}
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=0;
typkamene='X';
while (konec==0)
{
printf("Zadej radek pro kamen: (1 - %d)",pocetradku);
scanf("%d",&r);
while ((r > pocetradku) || (r < 1))
{
if ((r > pocetradku) || (r < 1))
{
printf("Zadal jste radek mimo hraci plochu.\n");
printf("Zadej radek pro kamen: (1 - %d)",pocetradku);
scanf("%d", &r);
}
}
printf("Zadej sloupec pro kamen: (1 - %d)",pocetrsloupcu);
scanf("%d",&s);
while ((s > pocetrsloupcu) || (s < 1))
{
if ((s > pocetrsloupcu) || (s < 1))
{
printf("Zadal jste sloupec mimo hraci plochu.\n");
printf("Zadej sloupec pro kamen: (1 - %d)",pocetrsloupcu);
scanf("%d", &s);
}
}
p[r][s]=typkamene;
for (radek = 0; radek < radku; radek++)
{
for (sloupec = 0; sloupec < sloupcu)
{
printf("%c",p[radek][sloupec]);
}
printf("\n");
}
}
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') 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ě).