Akasztófa (alapjáték)
A megoldás menete
Ebben a feladatban egy egyszerű akasztófa játékot fogunk elkészíteni, amiben a játékosnak ki kell találni egy szó betűit.
#1.
Első lépésként hozzunk létre két változót! Az első tartalmazza a feladványt, a második pedig annyi alulvonás karaktert, ahány betűből áll a feladvány.
Annak érdekében, hogy tetszőleges hosszúságú feladvánnyal is működjön a programunk, a len()
függvény segítségével kérjük le, hogy hány betűből áll a szó!
feladvany = "almafa"
megfejtes = "_" * len(feladavany)
A *
műveleti jel ebben az esetben nem szorzást végez, hanem megismétli a szöveget annyiszor, amennyi a jobb oldalán áll.
A játékos tippje után, ha olyan betűt ír be, ami szerepel a feladaványban, az alulvonást ki fogjuk cserélni a megfelelő betűre. A Python viszont nem engedi, hogy egy szöveg karaktereit módosítsuk, ezért készítsünk a szövegből egy listát, ami a megfejtés betűit tartalmazza!
feladvany = "almafa"
megfejtes = list("_" * len(feladavany))
#2.
Írjuk ki a képernyőre a megfejtést, ami egyelőre csak alulvonásokat tartalmaz!
print(f"{megfejtes}") # -> "______"
Látni fogjuk, hogy az alulvonások felsorolásszerűen jelennek meg. Ez azért van, mert a megfejtés változónk nem egy szöveg, hanem egy szöveg betűinek a listája.
A feladat megoldása közben ilyen formában van rá szükségünk, a képernyőn viszont rendes szövegként szeretnénk látni, ezért a kiírás előtt a join()
függvény segítségével fűzzük össze a listában találató betűket, hogy újra egy szóként jelenjenek meg!
Figyeljünk arra, hogy az összefűzés idézőjelek között van! Az összefűzéshez használjunk idézőjelek helyett aposztrófokat!
print(f"{''.join(megfejtes)}") # -> ['_', '_', '_', '_', '_', '_']
#3.
Írjunk egy üres sort, hogy a kiírás szebben tagolt legyen, majd kérjünk be a felhasználótól egy betűt, és tároljuk el egy változóban!
Feltételezzük, hogy a felhasználó tényleg egy betűt ír be. Ezt nem fogjuk ellenőrizni.
print()
tipp = input("Tipp: ")
Készítsünk a feladványból egy felsorolást az enumerate()
függvény segítségével, és lépkedjünk végig a felsorolás elemein egy for
ciklussal!
for sorszam, betu in enumerate(feladvany):
# ???
Ellenőrizzük, hogy a játékos tippje megegyezik-e a felsorolás éppen vizsgált elemével, és ha igen, a megfelelő alulvonást cseréljük ki a megfejtésben!
for sorszam, betu in enumerate(feladvany):
if betu == tipp:
megfejtes[sorszam] = tipp
Végül, függetlenül attól, hogy a felhasználó eltalálta-e a feladvány valamelyik betűjét, a megoldást írjuk ki újra a képernyőre úgy, ahogy az előbb is tettük!
print(f"{''.join(megfejtes)}")
#4.
Ezen a ponton a játékos egyszer tud tippelni, majd a program futása véget ér. Ha azt szeretnénk, hogy többször is tippeljen, akkor az eddig megírt kódunk egy részét meg kell ismételni. Ehhez helyezzük a megfelelő kódrészletet egy `while` ciklusba, és ismételjük azt (egyelőre) végtelenszer!
feladvany = "almafa"
megfejtes = list("_" * len(feladvany))
print(f"{''.join(megfejtes)}")
while True: # Az igaz feltétel miatt magától soha nem áll le a ciklus
print()
tipp = input("Tipp: ")
for sorszam, betu in enumerate(feladvany):
if betu == tipp:
megfejtes[sorszam] = tipp
print(f"{''.join(megfejtes)}")
Így néz ki eddig a teljes programkódunk. Ez viszont egészen addig fut, amíg a játékos be nem zárja az ablakot. Ha az összes betűt eltalálta, akkor sem áll meg.
Ahhoz, hogy a ciklust megállítsuk, ellenőriznünk kell, hogy a játékos kitalálta-e a feladványt. Ezt legegyszerűbben úgy tudjuk megtenni, hogy összehasonlítjuk a feladvány és a megfejtés változókat, és ha azok ugyanazt a szöveget tartalmazzák, az azt jelenti, hogy a játékos mindent betűt megtalált. Ebben az esetben a break
utasítás segítségével megállítjuk a ciklust.
# ...
while True:
# ...
if ''.join(megfejtes) == feladvany: # A megfejtés betűit ne felejtsük el összefűzni!
print(f"Helyes megoldas!")
break
#5.
A ciklusunk most már megáll, ha a játékos kitalálta a feladványt, de ez nem túl nehéz feladat, hiszen az összes betűt végigpróbálhatja. Az akasztófa játék szabályai szerint viszont minden hibás tipp estében veszít egy életet, és amikor az összes élete elfogy, akkor vége a játéknak.
Ahhoz, hogy ezt ellenőrizzük, a kód elején hozzunk létre egy változót, és a kezdőértékét állítsuk 10-re!
feladvany = "almafa"
megfejtes = list("_" * len(feladvany))
elet = 10
# ...
Ezután a kódnak azon a részén, ahol ellenőrizzük, hogy a játékos jól tippelt-e, hozzunk létre egy változót hamis kezdőértékkel! Ha a játékos eltalált egy betűt, akkor a változót állítsuk át igazra! Miután a feladvány összes betűjét ellenőriztük, nézzük meg, hogy a változónk még mindig hamis-e! Ha még mindig hamis, akkor a játékos helytelenül tippelt, tehát levonunk tőle egy életet.
# ...
while True:
# ...
talalt = False
for sorszam, betu in enumerate(feladvany):
if betu == tipp:
megfejtes[sorszam] = tipp
talalt = True
if talalt == False:
elet -= 1
# ...
Utolsó lépésként a ciklus végén ellenőrizzük a játékos életeinek a számát! Ha elfogyott, írjuk ki a megfelelő üzenetet, majd állítsuk meg a ciklust!
# ...
while True:
# ...
if elet == 0:
print(f"Sajnos vesztettel!")
print(f"A helyes megfejtes: {feladvany}")
break
A teljes kód
feladvany = "almafa"
megfejtes = list("_" * len(feladvany))
elet = 10
print(f"{''.join(megfejtes)}")
while True:
print()
tipp = input("Tipp: ")
talalt = False
for sorszam, betu in enumerate(feladvany):
if betu == tipp:
megfejtes[sorszam] = tipp
talalt = True
if talalt == False:
elet -= 1
print(f"{''.join(megfejtes)}")
if ''.join(megfejtes) == feladvany:
print(f"Helyes megoldas!")
break
if elet == 0:
print(f"Sajnos vesztettel!")
print(f"A helyes megfejtes: {feladvany}")
break