Kő-Papír-Olló
Gyakorló feladat
A kő-papír-olló egy egyszerű, mégis rendkívül szórakoztató játék, amelyet világszerte játszanak minden korosztályban. Eredete nem pontosan ismert, de valószínűleg több száz éves múltra tekint vissza. A legtöbb forrás azt állítja, hogy Kínából származik, és az ottani kultúrában régi idők óta játszották. Később terjedt el Japánban és onnan a világ más részeire.
A jelzések:
Kő: A játékos ökölbe szorított keze jelképezi a követ.
Papír: A kéz kinyitott ujjakkal jelképezik a papírt.
Olló: Két ujj kinyújtva jelképezi az ollót.

A játék szabályai nagyon egyszerűek:
A kő legyőzi az ollót („a kő zúzza az ollót”),
Az olló legyőzi a papírt („az olló kivágja a papírt”),
A papír pedig legyőzi a követ („a papír becsomagolja a követ”).
Ha mindkét játékos ugyanazt választja (pl. mindkettő követ), akkor döntetlen az eredmény.
Miért olyan népszerű játék?
A kő-papír-olló játék egyszerűsége és gyorsan megtanulhatósága miatt rendkívül népszerű. Nem igényel semmilyen speciális felszerelést vagy előkészületet, csak két játékost és az ujjukat. Emellett a játék lehetőséget ad a stratégiaalkotásra és a megfigyelésre is: egyes játékosok előre jelzik az ellenfél választását és ennek megfelelően választanak, míg mások véletlenszerűen választanak, így a játék mindig izgalmas és kiszámíthatatlan marad.
A kő-papír-olló egyszerűsége miatt bárhol és bármikor játszható, legyen az egy iskolai szünetben, egy kávézóban vagy akár egy hosszú utazás során. Ez az egyszerű, mégis szórakoztató játék már generációk óta szórakoztatja az embereket, és valószínűleg még hosszú ideig népszerű marad.
Ha többet szeretnél tudni a játékról, a Wikipédia oldalán erről többet olvashatsz.
Valósítsuk meg a Python-ban a Kő-Papír-Olló játékot
Tehát, a feladat az, hogy írj egy kódot, amely az alábbi módon fog működni:
Starter kód:
Adott egy kódrészlet, amelyet Neked csak folytatnod kell. Másold ki és illeszd be a PyCharm kódetitorodba. Kérlek, a kód fenti részét ne írd át, folytasd lentebb, a komment utáni rész után:
rock = '''
_______
---' ____)
(_____)
(_____)
(____)
---.__(___)
'''
paper = '''
_______
---' ____)____
______)
_______)
_______)
---.__________)
'''
scissors = '''
_______
---' ____)____
______)
__________)
(____)
---.__(___)
'''
# Folyasd a kódot lentebb
Jó munkát kívánok és találkozunk a megoldás szekcióban!
A feladat megoldása
1. lépés:
Ahelyett, hogy a komplex megoldások elvonnák a figyelmünket, a legegyszerűbb talán, ha a nagy problémákat lebontjuk kisebbekre. Például, generálhatnánk random egész számokat is, amelyhez hozzá tudjuk rendelni a kő-papír-olló ábrákat.
Gondoljuk csak végig a logikát. A számítógép fog egyet választani a három közül (kő-papír-olló) és mi is választunk egyet. Ha a számítógép a követ választotta és mi az ollót, akkor a számítógép nyer. Ha mi a papírt szeretnénk és a számítógép a követ, akkor mi leszünk a nyertesek.
Az első dolog, amit megtehetünk az, amit már biztosan tudunk: azt, hogy a felhasználónak is meg kell adni egy választást. Egy input() – ot hozunk létre, benne egy tájékoztató szövegrészlettel, majd a bevitt adatot elmentjük egy változóban. A print() parancs segítségéval csak magunknak íratjuk ki a bevitt számot, hogy átlássuk a folyamatot. Mivel számokkal fogunk dolgozni, ezért az input előtt már egy lépésben átalakíthatjuk az alapértelmezett string formátumot integer (egész szám) formátumra:
rock = '''
_______
---' ____)
(_____)
(_____)
(____)
---.__(___)
'''
paper = '''
_______
---' ____)____
______)
_______)
_______)
---.__________)
'''
scissors = '''
_______
---' ____)____
______)
__________)
(____)
---.__(___)
'''
# Folyasd a kódot lentebb
user_choice = int(input("Melyiket választod? Kérlek, számokkal válaszolj: Kő = 0, Papír = 1, Olló = 2 "))
print(user_choice)
2. lépés:
Meg kell adnunk a választást a számítógépnek is. Ebben a random modul fog nekünk segíteni. Először beimportáljuk, majd a random.randint() zárójelek között megadjuk, mely számok között adunk választási lehetőséget. Jelen esetben a 0 és a 2 között lehet választani a user-nek is, tehát úgy fer, ha a számítógép is így teszi. A generált véletlenszerű számot lementjük egy változóban úgy, ahogyan a user-nél is tettük.
rock = '''
_______
---' ____)
(_____)
(_____)
(____)
---.__(___)
'''
paper = '''
_______
---' ____)____
______)
_______)
_______)
---.__________)
'''
scissors = '''
_______
---' ____)____
______)
__________)
(____)
---.__(___)
'''
# Folyasd a kódot lentebb
import random
user_choice = int(input("Melyiket választod? Kérlek, számokkal válaszolj: Kő = 0, Papír = 1, Olló = 2 "))
print(user_choice)
computer_choice = random.randint(0, 2)
print(computer_choice)
Output:
Ha nagyon kíváncsiak lennénk (én mindig az vagyok), akkor futtatás után már láthatunk is egy működő alapot. Azt mutatja a konzolunk, hogy mi a 1-et adtuk meg, a számítógép pedig a 2-est választotta. Ezek a számpárok minden futtatáskor változnak mostantól.
Melyiket választod? Kérlek, számokkal válaszolj: Kő = 0, Papír = 1, Olló = 2 1
1
2
3. lépés:
Innentől kezdve gondolkozhatunk azon, hogyan tudjuk összehasonlítani az általunk megadott számot a számítógép által választott értékkel. If-elif-else blokkokat fogunk használni.
Nézzünk rá egy pillanatra a játékszabályokra:
A kő (0) legyőzi az ollót (2): 0 → 2
Az olló (2) legyőzi a papírt (1): 2 → 1
A papír (1) pedig legyőzi a követ (0): 1 → 0
Ha mindkét játékos ugyanazt választja (pl. mindkettő kettőt), akkor döntetlen az eredmény. ==
1. A szabályok ismerete után az első if szekcióban egyben lehetőségünk adatik kikötni a feltételeket a user szemszögéből. Egy sorban az „and” összeköt két feltételt, az „or” pedig a „vagy” miatt vagy az egyik, vagy a másik feltétel lesz igaz. A fenti játékszabály miatt 3 db „or” fog szerepelni. Amikor ezek a feltételek teljesülnek, a user nyert és ezt ki is íratjuk egy üzenetben.
2. Ezt követően egy elif szekcióban ugyan ezt megismételjük, de a számítógép szemszögéből.
3. A következő elif szekció akkor teljesül, ha a fentiek közül egyik sem igaz. Tehát el tudjuk kapni a döntetlen végeredményt, tehát amikor a user és a számítógép is ugyan azt a számot választották.
4. A választható számok skálája 0, 1, és a 2. De mi van, ha valaki ezeknél nagyobb vagy kisebb számokat ad meg? Az else blokk alkalmas lesz arra, hogy tudassuk a user felé, hogy érvénytelen számot adott meg, ezért elvesztette a játékot. A számítógép nem tud rossz számot generálni, csak aközött működik a random, amely között az intervallumokat megadtuk.
rock = '''
_______
---' ____)
(_____)
(_____)
(____)
---.__(___)
'''
paper = '''
_______
---' ____)____
______)
_______)
_______)
---.__________)
'''
scissors = '''
_______
---' ____)____
______)
__________)
(____)
---.__(___)
'''
# Folyasd a kódot lentebb
import random
user_choice = int(input("Melyiket választod? Kérlek, számokkal válaszolj: Kő = 0, Papír = 1, Olló = 2 "))
print(user_choice)
computer_choice = random.randint(0, 2)
print(computer_choice)
if user_choice == 0 and computer_choice == 2 or user_choice == 2 and computer_choice == 1 or user_choice == 1 and computer_choice == 0:
print("Hurrá, Csaba nyert! :)")
elif computer_choice == 0 and user_choice == 2 or computer_choice == 2 and user_choice == 1 or computer_choice == 1 and user_choice == 0:
print("Computer nyert!")
elif user_choice == computer_choice:
print("Döntetlen!")
else:
print("Computer: Érvénytelen számot adtál meg, ezért vesztettél!")
4. lépés:
Elérkezett az idő, amikor a programunk készen áll és már csak a képeket kell hozzárendelnünk. Rengeteg féleképpen meg lehet oldani ezt a programot, de mutatok két lehetséges megoldást:
#1 . Képek hozzárendelése if-elif-else feltételek megadásával:
Mind a user_choice és computer_choice alá feltételeket szabunk, mit írjon ki, amikor nullát, egyet vagy kettőt választ valaki.
Az első sor az if, a nulla számot tartalmazza (kő változó beillesztése), ha nem nulla, akkor jön az elif az egy értékkel (papír változó beillesztése, majd a kettő (olló változó beillesztése). Az f ” String segítségével tetszőleges szöveget írhatunk a változó elé vagy mögé.
A user felöli oldalon 2db elif található, mivel egy szekcióval többre van szükségünk akkor, ha azt szeretnénk, hogy ne jelenjen meg ábra érvénytelen (intervallumon kívüli) szám esetén.
rock = '''
_______
---' ____)
(_____)
(_____)
(____)
---.__(___)
'''
paper = '''
_______
---' ____)____
______)
_______)
_______)
---.__________)
'''
scissors = '''
_______
---' ____)____
______)
__________)
(____)
---.__(___)
'''
# Folyasd a kódot lentebb
import random
user_choice = int(input("Melyiket választod? Kérlek, számokkal válaszolj: Kő = 0, Papír = 1, Olló = 2 "))
print(user_choice)
if user_choice == 0:
print(f"User: Kő {rock}")
elif user_choice == 1:
print(f"User: Papír {paper}")
elif user_choice == 2:
print(f"User: Olló {scissors}")
else:
print("Csak 0 és 2 között választhatsz!")
computer_choice = random.randint(0, 2)
print(computer_choice)
if computer_choice == 0:
print(f"Computer: Kő {rock}")
elif computer_choice == 1:
print(f"Computer: Papír {paper}")
else:
print(f"Computer: Olló {scissors}")
if user_choice == 0 and computer_choice == 2 or user_choice == 2 and computer_choice == 1 or user_choice == 1 and computer_choice == 0:
print("Hurrá, Csaba nyert! :)")
elif computer_choice == 0 and user_choice == 2 or computer_choice == 2 and user_choice == 1 or computer_choice == 1 and user_choice == 0:
print("Computer nyert!")
elif user_choice == computer_choice:
print("Döntetlen!")
else:
print("Computer: Érvénytelen számot adtál meg, ezért vesztettél!")
Output:
Melyiket választod? Kérlek, számokkal válaszolj: Kő = 0, Papír = 1, Olló = 2 1
1
User: Papír
_______
---' ____)____
______)
_______)
_______)
---.__________)
2
Computer: Olló
_______
---' ____)____
______)
__________)
(____)
---.__(___)
Computer nyert!
Process finished with exit code 0
#2 . Képek hozzárendelése listával (ez a szebbik megoldás):
Annyi változás történt az előző megoldáshoz képest, hogy itt most rögtön az import alatt létrehozunk egy listát, amely a kő, papír, olló változókat tartalmazza, ergo ebben a listában lesznek a képeink. Majd letároljuk egy változóban.
amikor a user_choices alatt meg szeretnénk jeleníteni a választott képet, akkor a game_images lesz a változó és a [] szögletes zárójel lesz az index, amit a felhasználó választott. Így pontosan az az ábra jelenik meg, ami a választott számot takarja.
Viszont létre kell hozni egy if – else blokkot is arra az esetre, ha a user nem létező számot adna meg.
A computer_choices alatt minden simán megy. Ott csak a game_images [] szögletes zárójelben a computer_choice – a számítógépünk által választott index szám.
rock = '''
_______
---' ____)
(_____)
(_____)
(____)
---.__(___)
'''
paper = '''
_______
---' ____)____
______)
_______)
_______)
---.__________)
'''
scissors = '''
_______
---' ____)____
______)
__________)
(____)
---.__(___)
'''
# Folyasd a kódot lentebb
import random
game_images = [rock, paper, scissors]
user_choice = int(input("Melyiket választod? Kérlek, számokkal válaszolj: Kő = 0, Papír = 1, Olló = 2 "))
if user_choice >= 3 or user_choice < 0:
print("Computer: Csak 0 és 2 között választhatsz!")
else:
print(game_images[user_choice])
computer_choice = random.randint(0, 2)
print("A számítógép választása:")
print(game_images[computer_choice])
if user_choice == 0 and computer_choice == 2 or user_choice == 2 and computer_choice == 1 or user_choice == 1 and computer_choice == 0:
print("Hurrá, Csaba nyert! :)")
elif computer_choice == 0 and user_choice == 2 or computer_choice == 2 and user_choice == 1 or computer_choice == 1 and user_choice == 0:
print("Computer nyert!")
elif user_choice == computer_choice:
print("Döntetlen!")
else:
print("Computer: Érvénytelen számot adtál meg, ezért vesztettél!")
Output:
Melyiket választod? Kérlek, számokkal válaszolj: Kő = 0, Papír = 1, Olló = 2 0
_______
---' ____)
(_____)
(_____)
(____)
---.__(___)
A számítógép választása:
_______
---' ____)____
______)
__________)
(____)
---.__(___)
Hurrá, Csaba nyert! :)
Process finished with exit code 0
Ha sikerült önállóan megoldanod a feladatot, gratulálok és találkozunk a következő modulban!