Akasztófa (alapjáték)

🔖 string 🔖 f-string 🔖 list 🔖 print 🔖 for 🔖 while

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