Kombinování podmínek pomocí logických spojek

Vzpomínáte si ještě na ono nedokonalé Pexesíčko z jedné z prvních lekcí? V této lekci ho programově o něco vylepšíme - zkontrolujeme otočenou dvojici kartiček (viz ukázka ), nejprve ale trocha potřebné teorie.

V minulých lekcích jsme využívali příkaz if :
if podmínka then příkaz1 else příkaz2
Zopakujme si dvě poznámky:
- část else je možné vynechat
- za then i else může být jen jeden příkaz, pokud potřebujeme vykonat více příkazů, musíme je uzavřít mezi begin a end, neboli, vytvořit z nich složený příkaz

V praxi bývá často potřeba vytvářet složitější podmínku z více podmínek, k jejich spojování se používají logické spojky, z nichž základní jsou:
and - a zároveň - podmínka je splněna, pokud jsou současně splněny uvedené podmínky
or - nebo - podmínka je splněna, je-li splněna alespoň jedna z uvedených podmínek

Jako příklad můžeme uvést třeba kontrolu, zda je číselná proměnná z daného intervalu, nezapomínejte jednotlivé podmínky uzavírat do závorek:
if (x>50) and (x<80) then ShowMessage('hodnota je v normě');
Jestliže je x větší než 50 a zároveň menší než 80 (neboli z intervalu od 50 do 80), potom vypiš hlášení.

O něco lepší Pexesíčko

Logické spojky se nám budou hodit při kontrole dvojic v Pexesu. Proti minulému Pexesíčku bude těch změn ale více, proto bude spíš lepší začít nové, než kopírovat nebo upravovat to staré.

Připravíme si první kartičku, číslo, které se na ní po kliknutí ukáže, zapíšeme do Caption už v návrhu a navíc stejnou barvou jakou má barva kartičky. Číslo bude tedy zapsané, ale nebude vidět, zobrazí se teprve po kliknutí na kartičku, kdy změníme barvu kartičky.

Abychom mohli zkontrolovat dvojici otočených kartiček, budeme potřebovat dvě proměnné (zapište do sekce var):
minulakart: TLabel;{kartička, na kterou bylo kliknuto minule}
otocenych: integer;{počet otočených kartiček}

Všimněte si, že typ proměnné minulakart je TLabel, uloží se do ní název Labelu (zároveň vidíte, že proměnné nemusí být jen čísla nebo řetězce).

Další zásadní změnou bude, že vytvoříme jednu proceduru, která bude společná pro všechny kartičky. Umožní nám to parametr Sender procedury pro kliknutí, protože jeho hodnotou je objekt, který proceduru využil (vysílač).
Událost OnClick první kartičky by mohla být naprogramována takto:

procedure TForm2.Label1Click(Sender: TObject);
begin
otocenych:=otocenych+1; {zvětšení počtu otočených kartiček o 1}
(sender as TLabel).color:=clred;

if (otocenych=2) and ((sender as TLabel).caption=minulakart.caption)
then begin ShowMessage('Výborně');
(sender as TLabel).visible:=false; minulakart.Visible:=false;
end;

if (otocenych=2) and ((sender as TLabel).caption<>minulakart.caption)
then begin ShowMessage('Ach ta paměť');
(sender as TLabel).color:=clblue; minulakart.color:=clblue;
end;

if otocenych=2 then otocenych:=0;
minulakart:=(sender as TLabel);
end;
Teď už je to trošku složitější, ale zachováme chladnou hlavu a procházíme příkaz po příkazu:
- první příkaz zvětší počet otočených kartiček o 1, potřebujeme je počítat, abychom věděli, jestli už jsou otočené dvě kartičky
- druhý příkaz nastavuje barvu Labelu, který volal proceduru, na červenou. Protože parametr sender je typu TObject (jak je uvedeno v hlavičce procedury), což je obecný objekt, je potřeba ho přetypovat (převést) na typ Label příkazem sender as TLabel (protože je tento příkaz během procedury použitý několikrát, mohli jsme pro zjednodušení zavést ještě jednu proměnnou typu TLabel)
- třetí příkaz s podmínkou zkontroluje jestli jsou otočené dvě kartičky a zároveň jsou stejné popisky otočené kartičky a kartičky otočené předtím, potom se vypíše pochvala a oběma kartičkám se nastaví vlastnost visible (viditelnost) na false, čili nebudou vidět (zmizí)
- další příkaz s podmínkou je podobný - jestliže budou otočené dvě kartičky a zároveň nebudou mít stejné popisky (číslice), potom se vypíše chybové hlášení a jejich barvy se nastaví na původní modrou
- předposlední příkaz do proměnné otocenych uloží nulu, pokud už byly otočené dvě kartičky, abychom počítali zase znovu
- poslední příkaz právě otočenou kartičku uloží do proměnné minulakart , abychom ji mohli porovnat s tou, kterou otočíme po ní

Máme kompletně připravenou první kartičku a můžeme ji rozkopírovat. Při kopírování se kopírují všechny vlastnosti (u dalších kartiček je potřeba upravit Caption) ale také události, čili kliknutí všech dalších kartiček je přiřazena událost při kliknutí na první kartičku. To ale právě nevadí, procedura je upravena pro kteroukoliv kartičku. Stačí doplnit tlačítko pro ukončení, vzhledově upravit a další verze Pexesíčka je na světě!

Aplikaci ukládej do složky s názvem lekce8.

Úkoly:

Základní úloha:

Vytvoř Pexesíčko se šesti kartičkami podle textu lekce (viz ukázka ).


Úloha na plus:

Doplň Pexeso na dvanáct kartiček a vypisuj počet otočených dvojic, na závěr vyhodnoť podle tabulky:
6 otočených dvojic - jsi geniální nebo podvodník
do 10 otočených dvojic - měl jsi z pekla kliku
do 15 otočených dvojic - slušný výkon
více než 20 dvojic - příště se pořádně soustřeď
či tak nějak podobně


Úloha na jedničku:

Vytvoř pexeso, které by bylo možné využít pro výuku (např. na 1. stupni) - matematické (příklad a jeho výsledek), jazykové (slovo v jednom jazyce a jeho význam ve druhém jazyce apod.