Ügyességi játékok programozása
Pythonnal és Pygame-mel

Chapter 3: Kvíz játékok és az If feltételvizsgálat

Hogyan mondjuk el a játékosnak, hogy rekordot döntött? Hogyan mondjuk el neki, hogy nincs több élete? Hogyan mondjuk el, hogy ha megszerezte a szükséges kulcsot az ajtóhoz?

Videó: Bevezetés az if feltételvizsgálatba

Amire szükségünk les az az if(ha) parancs. Az if parancsot ismerik még feltételhez kötött állításként is. (Használd a feltételhez kötött állítást, amikor valaki le akarsz nyűgözni csillogó elméddel.) Az if feltétel gép számára egy döntési lehetőséget kínál. Forró kívül? Az űrhajó elérte a képernyő szélét? Túl sok pénzt vettünk le a számlánkról? Egy program képes tesztelni ezeket a kérdéseket egy if paranccsal.

3.1 Alapvető összehasonlítások

Íme néhányif parancs. Az első rész bekészít két változót (a és b) ahhoz, hogy használhassa az if parancsot. Azután két darab if feltételt vizsgálunk, hogy összehasonlítsuk melyik a nagyobb. Nyomd le a“Step” gombot és nézd meg a gép hogyan hozza létre a kódot.

# Variables used in the example if statements
a = 4
b = 5

# Basic comparisons
if a < b:
    print ("a is less than b")

if a > b:
    print ("a is greater than b")
	
print("Done")
Variables:
a=4
b=5
Output:
a is less than b
Done

Mivel a kisebb mint b, az első állítás kiír valamit, ha a kód fut. Ha mindkét változónk egyenlő 4-gyel, akkor egyik if állítás sem ír ki semmit. A 4-s szám, nem nagyobb, mint 4, így az if feltétel nem teljesül.

Ahhoz, hogy egy programot követhessünk, folyamatábrát (flowchart) szoktunk használni. A legtöbb ember szokta használni a folyamatábrát, anélkül, hogy programozni tanulna. Lássuk, mennyire érted te meg, nézd az ábrát 3.1.

fig.flowchart1
Figure 3.2: Folyamatábra

Ez a könyv nem fog elmerülni a folyamatábrák mélységeibe, mivel ez unalmas. De, ha szupersztár programozó akarsz lenni, akkor itt olvashatsz többet róla:
http://en.wikipedia.org/wiki/Flowchart

Az adott példa ellenőrzi, hogy nagyobb, vagy kisebb az adott értéknél. A vele egyenlő számok nem mennek át a próbán. Azt, hogy leellenőrízzuk, hogy valami nagyobb, vagy egyenlő, a következő példa alapján mutatjuk be:

if a <= b:
    print ("a is less than or equal to b")

if a >= b:
    print ("a is greater than or equal to b")

Az <= és a >= szimbólumokat sorrendben kell használni, és nem kell space-t tenni közéjük. Például, ez nem működik =< és ez sem: < =.

Amikor ezeket az állításokat írjuk ke egy próba során, egyes diákok előnyben részesítik, a ≤szimbólumot, például:
if a ≤ b:

Ez a ≤ szimbólum nem működik egy programban. Valamint, a legtöbb ember, nem tudja azt sem, hogyan kell egyszerűen begépelni a billentyűzetről. (Mindenesetre, legyünk komolyak, és tartsd lenyomva az 'alt' miközben beütöd, hogy 243 a numpadról.) Szóval, mikor kódot írsz, emlékezz erre, használd a <= formát, és ne a ≤. Sok ember veszít pontot a tesztek során ezen, ne legyél köztük.

A következő kódsor azt fogja ellenőrízni, hogy két elem egyenlő vagy sem. Az operátor ehhez a == és a nem egyenlőhöz tartozó operátor: !=. Akkor akció közben így néznek ki:

# Equal
if a == b:
    print ("a is equal to b")
   
# Not equal 
if a != b:
    print ("a and b are not equal")
Figyelem! Gyakori hiba.

Megjegyzés: Elég könnyű összekeverni amikor így használjuk, hogy == és =. Használd ezt az alakot, amikor egyenlőséget vizsgálsz: ==, és használd ezt, amikor az értékre vagy kíváncsi: =.

A két leggyakoribb hiba, amikor összekeverik a = és == operátorakat, ezt demonstráljuk alább:

# This is wrong
a == 1
	
# This is also wrong
if a = 1:
    print ("A is one")

Állj! Kérlek menj vissza egy pillanat erejéig, és figyelmesen tanulmányozd az utóbbi két példát. Időt takarítasz meg, ha megtanulod, hogy mikor használj = és ==. Ne találgass.

3.2 Sorok behúzása (Indentation)

A sorok behúzása fontos. Minden sor az if feltétel alatt, ami be van húzva csak akkor hajtódik végre, ha az if feltételem teljesül:

if a == 1:
    print("If a is one, this will print.")
    print("So will this.")
    print("And this.")
	
print("This will always print because it is not indented.")

A sor behúzásának hasonlónak kell lenni, különben a kód nem működik.

if a == 1:
  print("Indented two spaces.")
    print("Indented four. This will generate an error.")
   print("The computer will want you to make up your mind.")

Amiután az if feltétel teljesült, nem lehetséges megint behúzni a sorokat, hogy viszamenjünk oda. A próbának újra végre kell hajtódnia.

if a == 1:
    print("If a is one, this will print.")
    print("So will this.")

print("This will always print because it is not indented.")
    print("This will generate an error. Why it is indented?")

3.3 Az És/Vagy logikai műveletek használata

Egy if parancs vizsgálható több feltétel alapján, ha összefűzzük őket, az and (és) és or(vagy) szavakkal. Ezek is operátoroknak minősülnek, miképpen a + és a -.

# And
if a < b and a < c:
    print ("a is less than b and c")
 
# Non-exclusive or   
if a < b or a < c:
    print ("a is less than either a or b (or both)")
Ismételd ezt magadtól, kérlek.

Gyakori hiba, hogy kihagyunk egy változót, amikor több feltételt vizsgálunk. Az alábbi kód nem fog működni, mivel a gép nem tudja, hogy mit kell ellenőríznie a cváltozóhoz képest. Nem fogja magától feltételezni, hogy a-t kellene vizsgálni.

# This is not correct
if a < b or < c:
    print ("a is less than b and c")

3.4 Boolean/Logikai változók

A Python támogatja a Boolean változókat. Mi az a Boolean változó? A Boolean változó képes tárolni True/igaz vagy False/hamis értéket. A Boolean algebrát George Boole alkotta 1854-ben. Ha sejtette volna, hogy milyen fontos lesz ez a modern számítógépes logika számára!

Egy if feltételnek szüksége van egy kifejezésre, ami True vagy False értéket ad vissza. Ami különleges benne az, hogy nem feltétlen szükséges összehasonlítás, ha a változó már önmagában képes igaz/hamis értéket visszaadni.

# Boolean data type. This is legal!
a = True
if a:
    print ("a is true")

Ha visszagondolok az iskolára, akkor elég népszerű dolog volt, valamire hamis kijelentést tenni. Várj három másodpercet, és kiáltsd, hogy nem is! Nos, még a számítógép is azt gondolja, hogy ez béna. Ha ezt akarod csinálni, akkor használd a not operátort. A következő kód használja a not-t, hogy megcserélje az a változót az igaz és hamis közt.

# How to use the not function
if not(a):
    print ("a is false")

Mivel a not egy operátor, és nem egy függvény, a zárójel nem szükséges. Ez szintén érvényes:

# How to use the not function
if not a:
    print ("a is false")

Szintén lehetséges, hogy a Boolean változót használjuk az and/és és or/vagy operátorokkal.

a = True
b = False

if a and b:
    print ("a and b are both true")
Ki tudta, hogy a True/False lehet nehéz?

Szintén lehetséges, hogy megváltoztassuk a változót az összehasonlítás eredményétől függően. A lenti kódban, az a és b változók összehasonlítódnak. Ha egyenlőek, akkor c True lesz, máskülönben c False lesz.

a = 3
b = 3
# This next line is strange-looking, but legal.
# c will be true or false, depending if
# a and b are equal.
c = a == b
# Prints value of c, in this case True
print(c)
A zéró mindig False-t jelent. Minden más az True.

Lehetőség van arra, hogy alkossunk egy if feltételt, ami nem ad vissza értékként igaz/hamisat. Ez nem mindig vágyott dolog, de fontos megértenünk, azt, hogyan kezeli a gép ezeket az értékeket, amikor majd problémákat keresünk. Az alábbi parancs érvényes és ki fog írni egy szöveget, mivel az if állítás után kapott érték nem nulla:

if 1:
	print ("1")
if "A":
	print ("A")

A lenti kód nem fog kinyomtatni bármit, mivel az if-re adott eredmény nulla, ami ugye hamis. Bármilyen más érték, ami nem nulla, igaznak minősül.

if 0:
	print ("Zero")

Az alábbi kódnál az első if feltétel működik. A probléma az, hogy mindig igaz lesz az eredmény, mégha az a változó nem egyenlő b-vel. Ez azért van, mivel b önmagában igaz.

a = "c"
if a == "B" or "b":
	print ("a is equal to b. Maybe.")
	
# This is a better way to do the if statement.
if a == "B" or a == "b":
	print ("a is equal to b.")

3.5 Vagy és Vagyha (Else and Else If)

A lenti kód kér egy hőmérsékletet a felhasználótól majd kiírja, hogyha az meleg.

temperature = int(input("What is the temperature in Fahrenheit? "))
if temperature > 90:
    print("It is hot outside")
print ("Done")

Ha a programozó végre akarja hajtatni a kódot, amikor az nem meleg, egyszerűen használhatja a különben/else parancsot. Megjegyzem, hogy az else parancs egy vonalban kell legyen az i-vel az if feltétel vizsgálatánál, és kettőspont jelöli, mit kell majd végrehajtania, mint az if feltételnél.

Egy if...else esetben, egy kódblokk mindig végrehajtódik. Az első blokk végre fog hajtódni, ha az if állítása True értéket ad vissza. A második blokk if generálja majd a False értéket.

temperature = int(input("What is the temperature in Fahrenheit? "))
if temperature > 90:
    print("It is hot outside")
else:
    print("It is not hot outside")
print ("Done")

Lehetőség van arra, hogy összeláncoljuk az if feltételeket, egyszerűen az else...if parancsot használva. A Python elif formában ismeri ezt.

temperature = int(input("What is the temperature in Fahrenheit? "))
if temperature > 90:
    print("It is hot outside")
elif temperature < 30:
    print("It is cold outside")
else:
    print("It is not hot outside")
print ("Done")
Videó: A logikai sorrend az if parancsnál

A lenti kódban, a program ki fogja írni, hogy “It is hot outside” (meleg van kint) még akkor is, ha 120 fokot írunk be. Miért? Hogyan lehet rendbe hozni ezt a kódot?

Ha nem érted, akkor nézd meg a videót is.

temperature = int(input("What is the temperature in Fahrenheit? "))
if temperature > 90:
    print("It is hot outside")
elif temperature > 110:
    print("Oh man, you could fry eggs on the pavement!")
elif temperature < 30:
    print("It is cold outside")
else:
    print("It is ok outside")
print ("Done")

3.6 Szöveg összehasonlítás

Lehetséges használni az if parancsot arra is, hogy szöveget hasonlítsunk össze. (Megjegyzés, ha Eclipse-t használsz, és nem IDLE-t, akkor a példa nem fog működni, mivel a beviteli adat egy extra adatot is tárol, amit a végrehajtás során visszaad a program. )

userName = input("What is your name? ")
if userName == "Paul":
    print("You have a nice name.")
else:
    print("Your name is ok.") 

Ez a példa csak akkor ad igazat, ha a felhasználó a “Paul” nevet adja meg. Nem fog működni, ha “paul” vagy “PAUL” neveket adunk meg.

Gyakori hiba, hogy elfelejtik az idézőjeleket, a szöveg körül. A lenti példában, a gép azon gondolkodik, hogy Paul egy változó, ami értéket tárol. Ez pedig hibához vezet, mivel a Paul nev változó nem tárol adatokat.

userName = input("What is your name? ")
if userName == Paul: # This does not work because quotes are missing
    print("You have a nice name.")
else:
    print("Your name is ok.") 

3.6.1 Többszörös szöveg lehetőségek

Amikor összehasonlítunk egy változót több szövegfüzér szerint, fontos emlékeznünk arra, hogy az összehasonlításba vonjuk be a változót. Például:

# This does not work! It will always be true
if userName == "Paul" or "Mary":

Ehelyett, ezt a kódot használjuk:

# This does work
if userName == "Paul" or userName == "Mary":

Ez azért fontos, mivel ha a változó nem nulla, a gép True értéket fog visszaadni. Szóval a gép számára a "Mary" ugyanaz a dolog, mint a True és eszerint fogja lefuttatni az if kódot.

3.6.2 Nagybetűre nem érzékeny összehasonlítás

Ha a program számára kell egy összehasonlítás, aminél a nagybetű/kisbetű nem fontos, akkor a legkönnyebb módja ennek, hogy mindent kisbetűre alakítunk. Ezt megtehetjük a lower paranccsal.

A lenti példa fogja, amit a felhasználó bevisz, és átalakítja kisbetűsre, és aztán összehasonlít. Fontos: ne hasonlítsd össze az így kapott eredményt nagybetűs szöveggel. Ha a felhasználó szövegét átalakítjuk kisbetűssé, akkor ne hasonlítsuk nagybetűs szöveggel, mivel hibás lesz a kódunk.

userName = input("What is your name? ")
if userName.lower() == "paul":
    print("You have a nice name.")
else:
    print("Your name is ok.") 	

3.7 Példa if parancsra

Video: If statement examaples

A következő példák a korábban tárgyalt elképzelések alapján lettek összeállítva. A videó nyomon követ minden sor kódot és elmagyarázza, hogyan működnek.

A videóban egy integrált szerkesztőt használunk, az Eclipset. Az alap verzió nem dolgozik a Pythonnal, de a PyDev verzió igen. A PyDev szerkesztő elérhető innen:
http://pydev.org/

A szerkesztő összetett, de sok lehetőséget kínál és elég erős környezet a munkához. Néhány programozó szereti az olyan környezetet használni, mint a Pydev, aminek van sok pluginja, amivel szinte bármit megtehetnek, csak kávét nem hoz még nekik. Más fejlesztők jobban szeretik a minimalista környzetet, aminél semmi sincs útban.

# Sample Python/Pygame Programs
# Simpson College Computer Science
# http://programarcadegames.com/
# http://simpson.edu/computer-science/

# Explanation video: http://youtu.be/pDpNSck2aXQ

# Variables used in the example if statements
a = 4
b = 5
c = 6

# Basic comparisons
if a < b:
    print("a is less than b")

if a > b:
    print("a is greater than than b")

if a <= b:
    print("a is less than or equal to b")

if a >= b:
    print("a is greater than or equal to b")

# NOTE: It is very easy to mix when to use == and =.
# Use == if you are asking if they are equal, use =
# if you are assigning a value.
if a == b:
    print("a is equal to b")

# Not equal
if a != b:
    print("a and b are not equal")

# And
if a < b and a < c:
    print("a is less than b and c")

# Non-exclusive or
if a < b or a < c:
    print("a is less than either b or c (or both)")


# Boolean data type. This is legal!
a = True
if a:
    print("a is true")

if not a:
    print("a is false")

a = True
b = False

if a and b:
    print("a and b are both true")

a = 3
b = 3
c = a == b
print(c)

# These are also legal and will trigger as being true because
# the values are not zero:
if 1:
    print("1")
if "A":
    print("A")

# This will not trigger as true because it is zero.
if 0:
    print("Zero")

# Comparing variables to multiple values.
# The first if statement appears to work, but it will always
# trigger as true even if the variable a is not equal to b.
# This is because "b" by itself is considered true.
a = "c"
if a == "B" or "b":
    print("a is equal to b. Maybe.")

# This is the proper way to do the if statement.
if a == "B" or a == "b":
    print("a is equal to b.")

# Example 1: If statement
temperature = int(input("What is the temperature in Fahrenheit? "))
if temperature > 90:
    print("It is hot outside")
print("Done")

# Example 2: Else statement
temperature = int(input("What is the temperature in Fahrenheit? "))
if temperature > 90:
    print("It is hot outside")
else:
    print("It is not hot outside")
print("Done")

# Example 3: Else if statement
temperature = int(input("What is the temperature in Fahrenheit? "))
if temperature > 90:
    print("It is hot outside")
elif temperature < 30:
    print("It is cold outside")
else:
    print("It is not hot outside")
print("Done")

# Example 4: Ordering of statements
# Something with this is wrong. What?
temperature = int(input("What is the temperature in Fahrenheit? "))
if temperature > 90:
    print("It is hot outside")
elif temperature > 110:
    print("Oh man, you could fry eggs on the pavement!")
elif temperature < 30:
    print("It is cold outside")
else:
    print("It is ok outside")
print("Done")

# Comparisons using string/text
# Note, this example does not work when running under Eclipse
# because the input will contain an extra carriage return at the
# end. It works fine under IDLE.
userName = input("What is your name? ")
if userName == "Paul":
    print("You have a nice name.")
else:
    print("Your name is ok.")

3.8 Áttekintés

3.8.1 Többválaszos tesztkérdések

Click here for a multiple-choice quiz.

3.8.2 Rövid válaszos munkafüzet

Click here for the chapter worksheet.

3.8.3 Laborgyakorlatok

Click here for the chapter lab.


You are not logged in. Log in here and track your progress.