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.
#include "stdafx.h"
#define radku 20
#define sloupcu 70
int _tmain(int argc, _TCHAR* argv[])
{
char p[radku][sloupcu];
...
return 0;
}
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 = 0; radek < radku; radek++)
{
for (sloupec = 0; sloupec < sloupcu)
{
p[radek][sloupec]='.';
}
}
Ke zobrazení stavu hry stačí vypsat pole na obrazovku.
for (radek = 0; radek < radku; radek++)
{
for (sloupec = 0; sloupec < sloupcu)
{
printf("%c",p[radek][sloupec]);
}
printf("\n");
}
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.
int vyhra;
...
vyhra=0;
while ((vyhra < 3) || (vyhra > 5))
{
fprintf("Zadejte pocet kamenu pro vyhru (3, 4 nebo 5) :");
fscanf("%d",&vyhra);
if ((vyhra < 3) || (vyhra > 5)) printf("Nezadal jste spravny pocet kamenu!");
}
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).
#include "stdafx.h"
#define radku 20
#define sloupcu 70
int _tmain(int argc, _TCHAR* argv[])
{
char p[radku][sloupcu];
int radek, sloupec, pocetradku, pocetsloupcu, vyhra;
char hrac1[50], hrac2[50];
pocetradku=0;
pocetsloupcu=0;
while ((pocetradku) < 1) || ((pocetradku) > (radku))
{
printf("Zadejte pocet radku hraci plochy 1 - %d:",radku);
scanf("%d",&pocetradku);
if ((pocetradku) < 1) || ((pocetradku) > (radku)) printf("Zadali jste spatny pocet radku!");
}
while ((pocetsloupcu) < 1) || ((pocetsloupcu) > (sloupcu))
{
printf("Zadejte pocet sloupcu hraci plochy 1 - ',sloupcu,':');
scanf("%d",&pocetsloupcu);
if ((pocetsloupcu) < 1) || ((pocetsloupcu) > (sloupcu)) printf("Zadali jste spatny pocet sloupcu.");
}
vyhra=0;
while ((vyhra < 3) || (vyhra > 5))
{
fprintf("Zadejte pocet kamenu pro vyhru (3, 4 nebo 5) :");
fscanf("%d",&vyhra);
if ((vyhra < 3) || (vyhra > 5)) printf("Nezadal jste spravny pocet kamenu!");
}
for (radek = 0; radek < radku; radek++)
{
for (sloupec = 0; sloupec < sloupcu)
{
p[radek][sloupec]='.';
}
}
printf("Zadejte prosim jmeno hrace c.1:");
scanf("%s",&hrac1);
printf("\n");
printf("Zadejte prosim jmeno hrace c.2:");
scanf("%s",&hrac2);
for (radek = 0; radek < radku; radek++)
{
for (sloupec = 0; sloupec < sloupcu)
{
printf("%c",p[radek][sloupec]);
}
printf("\n");
}
fflush(stdin);
getchar();
}
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 strlen z hlavičkového souboru string.h).