Obsah lekce:
Hodnoty obrázků pexesa jsme si zatím zobrazovali pouze v textovém režimu v konzoli. Vhodnější však bude grafické zobrazení pexesa. To budeme realizovat v okně internetového prohlížeče. Potřebujeme tedy doplnit program o proceduru, která nám vytvoří HTML soubor, který bude obsahovat jednotlivé kartičky pexesa, jména hráčů a počty bodů.
Pro kartičky pexesa použijeme obrázky ve formátu JPG o velikosti 100x100px. Tyto obrázky budou pojmenované 1.jpg až 18.jpg. Navíc bude potřeba jeden obrázek pro rubovou stranu kartiček. Tento obrázek bude mít stejné rozměry a bude pojmenován 0.jpg. Tyto soubory již máme připravené z úkolu z jedné z minulých lekcí.
Výstup pexesa bude tvořit HTML soubor, který bude obsahovat tabulku o šesti řádcích a šesti sloupcích a bude zobrazovat jednotlivé kartičky pexesa. Do tohoto souboru si poté postupně doplníme i zobrazení hráčů, počtu bodů a další potřebné informace.
Potřebujeme získat HTML soubor v následující podobě:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>PEXESO</title> </head> <body> <table> <tr> <td><img src="obrazkypexeso/11.jpg" alt="11" /></td> <td><img src="obrazkypexeso/7.jpg" alt="7" /></td> <td><img src="obrazkypexeso/3.jpg" alt="3" /></td> <td><img src="obrazkypexeso/4.jpg" alt="4" /></td> <td><img src="obrazkypexeso/16.jpg" alt="16" /></td> <td><img src="obrazkypexeso/2.jpg" alt="2" /></td> </tr> <tr> <td><img src="obrazkypexeso/6.jpg" alt="6" /></td> <td><img src="obrazkypexeso/16.jpg" alt="16" /></td> ... </table> </body> </html>
Než si vytvoříme proceduru, jejímž výsledkem bude HTML soubor, se nejprve podíváme na zápis do textového souboru obecněji.
Zápis do textového souboru můžeme rozdělit do tří částí:
Před otevřením souboru budeme potřebovat proměnnou, pomocí které se na soubor budeme odkazovat při další práci s tímto souborem - bude jednat o ukazatel datového typu FILE.
FILE *f;
Dalším krokem je přiřazení názvu souboru k proměnné. Pro tento účel slouží funkce Assign, která má dva parametry. Prvním parametrem je proměnná pro práci se souborem, druhým parametrem je název souboru.
f = fopen("pexeso.html","w");
Druhý parametr této funkce definuje způsob práce se souborem. Buď můžeme ze souboru pouze číst, přidávat data na konec souboru nebo můžeme chtít soubor přepsat (vytvořit nový soubor).
Pro jednotlivé způsoby otevření souboru slouží následující funkce:
V našem případě využijeme poslední z nabízených možností, která slouží pro přepsání souboru nebo pro vytvoření nového souboru.
Zápis dat do souboru bude probíhat velmi podobně výpisu dat do konzole. Pro zápis dat totiž slouží funkce fprintf, která má podobnou syntaxi jako printf, s tím rozdílem, že jako první parametr těchto funkcí použijeme proměnnou pro práci se souborem.
fprintf(f, data); fprintf(f, "text"); fprintf(f, "%d", hodnota); fprintf(f, "%d %f", hodnota1, hodnota2);
Po dokončení práce se souborem je třeba soubor uzavřít. Pro tento účel slouží funkce Close.
fclose(f);
Vytvoření HTML souboru budeme opět realizivat pomocí samostatné procedury. Procedura se bude jmenovat html a budeme ji volat při každé změně hodnot v našem programu tak, aby se aktualizoval výstup v prohlížeči.
Dle výše uvedeného postupu pro zápis do textového souboru můžeme vytvořit základní kostru HTML souboru, do kterého postupně doplníme všechny potřebné údaje.
void html() { FILE *f; f = fopen("pexeso.html","w"); fprintf(f, "<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">"); fprintf(f, "<html xmlns="http://www.w3.org/1999/xhtml">"); fprintf(f, "<head>"); fprintf(f, "<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />"); fprintf(f, "<title>Pexeso</title>"); fprintf(f, "</head>"); fprintf(f, "<body>"); fprintf(f, "<h1>Pexeso</h1>"); fprintf(f, "<table>"); fprintf(f, "</table>"); fprintf(f, "</body>"); fprintf(f, "</html>"); fclose(f); }
Nejprve vytvoříme proměnnou pro uložení ukazatele na soubor (FILE *f;, následně soubor otevřeme pro čtení f = fopen("pexeso.html","w");) a zapíšeme do něj jednotlivé HTML tagy (printf(f, "<html>\n");, ...). Po dokončení práce se souborem tento soubor uzavřeme (fclose(f);).
V dalším kroku již můžeme doplnit konstrukci tabulky, která bude sloužit pro zobrazení pexesa. Zápis bude velmi podobný zápisu, který jsme již použili pro zobrazení pexesa v konzoli. Výpis do konzole však nahradíme zápisem HTML tagu IMG do souboru.
void html() { FILE *f; int radek, sloupec; f = fopen("pexeso.html","w"); fprintf(f, "<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">"); fprintf(f, "<html xmlns="http://www.w3.org/1999/xhtml">"); fprintf(f, "<head>"); fprintf(f, "<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />"); fprintf(f, "<title>Pexeso</title>"); fprintf(f, "</head>"); fprintf(f, "<body>"); fprintf(f, "<h1>Pexeso</h1>"); fprintf(f, "<table>"); for (radek = 1; radek < n; radek++) { fprintf(f,"<tr>\n"); for (sloupec = 1; sloupec < n; sloupec++) { if (p[radek][sloupec].odebrana == 1) { fprintf(f,"<td> </td>"); } else { if (p[radek][sloupec].viditelna == 1) { fprintf(f,"<td><img src=\"%d.jpg\" /></td>",p[radek, sloupec].obrazek); } else { fprintf(f,"<td><img src=\"0.jpg\" /></td>"); } } } fprintf(f,"</tr>\n"); } fprintf(f, "</table>"); fprintf(f, "</body>"); fprintf(f, "</html>"); fclose(f); }
Do procedury HTML jsme nyní přidali konstrukci pro vykreslení tabulky (zvýrazněna tučně). Stejně jako při zobrazení pexesa v terminálu zde větvíme program pomocí dvojice příkazů IF do tří situací:
Do HTML souboru dále můžeme doplnit i jména hráču a počty bodů.
void html() { FILE *f; int radek, sloupec; f = fopen("pexeso.html","w"); fprintf(f, "<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">"); fprintf(f, "<html xmlns="http://www.w3.org/1999/xhtml">"); fprintf(f, "<head>"); fprintf(f, "<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />"); fprintf(f, "<title>Pexeso</title>"); fprintf(f, "</head>"); fprintf(f, "<body>"); fprintf(f, "<h1>Pexeso</h1>"); fprintf(f, "<table>"); for (radek = 1; radek < n; radek++) { fprintf(f,"<tr>\n"); for (sloupec = 1; sloupec < n; sloupec++) { if (p[radek][sloupec].odebrana == 1) { fprintf(f,"<td> </td>"); } else { if (p[radek][sloupec].viditelna == 1) { fprintf(f,"<td><img src="%d.jpg" /></td>",p[radek, sloupec].obrazek); } else { fprintf(f,"<td><img src="0.jpg" /></td>"); } } } fprintf(f,"</tr>\n"); } for (int i = 0; i < pocethracu; i++) { fprintf(f,"<li>%s: %d</li>", ph[i].jmeno, ph[i].skore); } fprintf(f,"</ol>"); fprintf(f, "</table>"); fprintf(f, "</body>"); fprintf(f, "</html>"); fclose(f); }
V této části jsme si přidali číslovaný seznam hráčů (pomocí HTML tagu <ol>). Pro potřeby cyklu, který vypisuje jednotlivé hráče, bylo třeba v proceduře html vytvořit celočíselnou proměnnou i, pomocí které jsme prošli pole hráčů a u každého hráče bylo vypsáno jméno a skóre.
Posledním problémem, který je třeba vyřešit, je automatická aktualizace stránky, aby se projevily změny v průběhu hry. Pro tento účel slouží meta tag s následujícím zápisem:
<meta http-equiv="refresh" content="časvsekundách">
Do procedury pro vytvoření HTML souboru (konkrétně do hlavičky stránky - head) tedy přidáme následující řádek:
fprintf(f, "<meta http-equiv="refresh" content="1">");
Procedura html by následně měla být volána na všech místech programu, kde dochází ke změně hodnot, které jsou v HTML souboru zobrazeny. Volání procedury tedy doplníme na všechna místa v proceduře hra, kde voláme proceduru zobrazpexeso.
Program je téměř kompletní, zbývá pouze dokončit formátování výstupu do HTML. Za použití CSS vhodně naformátujte výstup do HTML.
Kompletní verze programu, který máme vytvořený je k dispozici v souboru pexeso_full.cpp