Felfedés, szerencse kártya játék.

 Az alábbi projekt egy egyszerű játékot takar.

Remélem ebben a kódban is van, néhány követésre alkalmas ötlet.

import tkinter as tk
import pakli_modul as pm
import sys
from tkinter import messagebox as msg
import random


class TippeloJatek(tk.Canvas):
def __init__(self, container):
super().__init__(container)
self.configure(width=695, height=300, bg="green")

# ------------------------------------------------------------

# Modul osztály példány
self.modul_peldany = pm.FranciaKartya()
# Modul osztály metódussal megkapjuk az
# 54 lapos kevert paklit.
self.pakli = self.modul_peldany.kevert_lapok()

# Inicializált változók----------------------------------------

# Hat darab kártyanév lista
self.kartyak_hat_db_lista = []
self.uj_lapok = ['Káró05', 'Káró14']
# A hatdarab hátlapnév lista
self.hatlapok_hat_db_lista = ['hátlap1', 'hátlap2', 'hátlap3',
'hátlap4', 'hátlap5', 'hátlap6']

# Kártya képfájl objektumok lista
self.kartya_tk_lista = []
# Kártya képek ID lista
self.kartya_id_lista = []

# Hátlapok képfájl objektumok lista
self.hatlap_tk_lista = []
# képek ID lista
self.hatlap_id_lista = []

# Számolja a tag_bind() eseményeket
self.eger_esemeny_szamlalo = 0

# pontok gyűjtő, player vs computer.
self.ppont = 0
self.cpont = 0

# A már felfedett kártyák indexeinek
# a lista gyűjtője.
self.kihagy_index_lista = []

# osztály metódusok--------------------------------------------

# A hátlapok kattinthatóak
self.tag_bind_hatlap_esemeny()

# Hat darab kártyaképet készít
self.kartya_kepek_keszitese()
# Hat darab hátlap képet készít
self.hatlap_kepek_keszitese()

# A pakli lapok darabszám jelzője és
# az eredmény jelző
self.__text_widgets()

def __text_widgets(self):
"""
Elkészítjük a pakli darab szám követőt és
az aktuális pontokat kijelző szöveget.
:return:
"""
self.pakli_darab_jelzo_text = self.create_text(
100, 200,
text=f'Pakli lapok: {len(self.pakli)} darab',
font='Helvetica 12', fill='white')

self.eredmeny_jelzo_text = self.create_text(
560, 200, text=f'Player {self.ppont} : {self.cpont} Computer',
font='Helvetica 12', fill='white')

def valtozok_ellenorzese(self):
"""
Itt lehet print-eltetni azokat a változókat melyekre
kíváncsiak vagyunk. Az első adat a mindenkori
pakli tartalom.
:return:
"""
# print(f'\n\tvaltozok_ellenorzese() metódus')

# A pakli tartalmát és darab számát nyomtatja
self.modul_peldany.pakliprint(self.pakli)

def hat_darab_lapvalaszto(self):
"""
A pakliból kiválaszt hat darab kártyát. De
előtte üresre állítja a self.kartyak_hat_db_lista -t.
:return:
"""
# print(f'\n\that_darab_lapválasztó() metódus')

self.kartyak_hat_db_lista.clear()

# A hatdarabos kártyáklistát feltölti lapokkal
for _ in range(6):
db = len(self.kartyak_hat_db_lista)
if db < 6 and len(self.pakli) > 0:
self.kartyak_hat_db_lista += self.pakli[0:1]
del self.pakli[0:1]
else:
msg.showinfo('Üzenet!', 'A pakli elfogyott!')
break

def kartya_kepek_keszitese(self):
"""
Elkészít hat darab kártyát, az asztalra.
:return:
"""
# print(f'\n\n\tkártya_képek_készítése() metódus')

# Osztály metódus hívás
self.hat_darab_lapvalaszto()

# Kártya képek betöltése loop-ban
for knev1 in self.kartyak_hat_db_lista:
self.kartya_tk_lista.append(
tk.PhotoImage(file=f'CardsPhotos/{knev1}.png'))

# Kártya képek létrehozása a vásznon loop-ban
jobbra1 = 0
for i, knev2 in enumerate(self.kartyak_hat_db_lista):
self.kartya_id_lista.append(
self.create_image(60 + jobbra1, 80,
image=self.kartya_tk_lista[i],
tags=f'{knev2}'))
jobbra1 += 110

# Változók ellenőrzése
# self.valtozok_ellenorzese()

def hatlap_kepek_keszitese(self):
"""
A kártyákra ráhelyez egy egy hátlapot.
:return:
"""
# print(f'\n\thátlap_képek_készítése() metódus')
# Hátlap kép betöltése
for hlap1 in self.hatlapok_hat_db_lista:
self.hatlap_tk_lista.append(
tk.PhotoImage(file=f'CardsPhotos/{hlap1}.png'))

# Hátlap képek létrehozása a vásznon loop-ban
jobbra = 0
for i, hlap2 in enumerate(self.hatlapok_hat_db_lista):
self.hatlap_id_lista.append(
self.create_image(60 + jobbra, 80,
image=self.hatlap_tk_lista[i],
tags=f'{hlap2}'))
jobbra += 110

def kartyak_csere_ujlapok(self):
"""
A metódus hívásakor a felfedett kártyákat
újakra cseréli a pakliból. Ha előbb hívjuk
figyelmeztető üzenet.
:return:
"""
# print(f'\n\n\tkártyák_csere_ujlapok() metódus')

# Amikor eléri a hatot...
if self.eger_esemeny_szamlalo == 6:
# .. a hátlapok megjelennek
self.megjeleno_hatlapok()
# Nullázom a számlálót
self.eger_esemeny_szamlalo = 0
# Nullázom a kihagyandó_index listát
self.kihagy_index_lista.clear()

# Osztály metódus hívás
self.hat_darab_lapvalaszto()

# Hat darab kártya lecserélése új lapokra ciklus
for i, lap in enumerate(self.kartyak_hat_db_lista):
self.kartya_tk_lista[i].config(
file=f"CardsPhotos/{self.kartyak_hat_db_lista[i]}.png")

# Változók ellenőrzése
# self.valtozok_ellenorzese()

# A maradék pakli darabszám frissítése.
self.itemconfigure(self.pakli_darab_jelzo_text,
text=f'Pakli lapok: {len(self.pakli)} darab')

else:
msg.showinfo('Figyelmeztetés!',
'Nem lehet új lapokat kérni,\n'
'amíg van felfedetlen!')

def megjeleno_hatlapok(self):
"""Egér kattintások után, pótolja a hátlapokat
az új kártyákra. hátlapok képeit megmutatja.
"""
# print(f'\n\tmegjeleno_hatlapok() metódus')
if self.hatlap_id_lista:
for hlap in self.hatlapok_hat_db_lista:
self.itemconfig(hlap, state="normal")

def tag_bind_hatlap_esemeny(self):
"""Lehetővé teszi a hátlapra kattintásokat,
az egér bal gombjával.
"""
# print(f'\n\ttag_bind_hatlap_esemeny() metódus')
for hnev in self.hatlapok_hat_db_lista:
self.tag_bind(hnev, "<Button-1>",
lambda event: self.hatlapot_elrejt())

def hatlapot_elrejt(self):
"""
Egy hátlapképre kattintáskor az eltűnik. 'tag_bind()'
:return:
"""
# Minden kattintással növeljük
self.eger_esemeny_szamlalo += 1

# A kattintott lap sorszáma 1 - 6 ig.
item = self.find_withtag("current")
# zárójel eltávolítás
tetel = item[0]

# A kattintott hátlap eltűnik
self.itemconfig(tetel, state="hidden")

# A kattintott hátlap alatti kártya index-e.
index1 = tetel - 7

# ------------------------------------------------------
# A computer ezt a lapot nem választhatja ezért listázom
self.kihagy_index_lista.extend([index1])
print(f'{self.kihagy_index_lista=}')
# ------------------------------------------------------

# Kiveszem a kattintott hátlap alatti kártya
# nevét az index1 -el.
kartya_nev = self.kartyak_hat_db_lista[index1]
# print(f'{kartya_nev}')

# Az index ellenőrzése
# index2 = self.kartyak_hat_db_lista.index(kartya_nev, 0, 7)
# print(f'A keresett kártya index: {index2}')

# A kártya str nevéből kinyerem az int értéket
kartya_ertek = int(kartya_nev[-2:])
# Az értéket átadom az eredmény jelzőnek.
self.ppont += kartya_ertek

# Konfigurálással megjelenítem
self.itemconfigure(
self.eredmeny_jelzo_text,
text=f'Player {self.ppont} : {self.cpont} Computer')

self.gep_random_valasz()

def gep_random_valasz(self):
"""
Computer random választ egy lapot.
:return:
"""
print(f'\n\n\tgep_random_valasz() metódus')
# A hatdarab kártyalap lista indexei
valaszthato = [0, 1, 2, 3, 4, 5]

# Kivesszük a lista azon elemeit, melyeket már választottunk.
valaszthato = [x for x in valaszthato if not (x in self.kihagy_index_lista)]
print(f'\n{valaszthato=}')

# A maradék választható lista elemből, random kapunk egy számot.
while True:
# A kiválasztott elem_lista == index.
elem_lista = [x for x in random.choices(valaszthato)]
# Ha nem egy üres listát kaptunk
if elem_lista:
index = elem_lista[0]
print(f'{index=}')

# A kihagyandó_index_listába töltjük az uj indexet
self.kihagy_index_lista.extend([index])
print(f'Kihagyandó index lista: {self.kihagy_index_lista}')

# Kiemeljük a véletlen választott lap nevét
lap_nev = self.kartyak_hat_db_lista[index]
print(f'{lap_nev=}')

# A lapnévből kivesszük az értékét
lap_ertek = int(lap_nev[-2:])
print(f'{lap_ertek=}')

# A lap értéket átadjuk a gép pont gyűjtónek
self.cpont += lap_ertek

# Pontok kijelző frissítése
self.itemconfigure(
self.eredmeny_jelzo_text,
text=f'Player {self.ppont} : {self.cpont} Computer')

# Kiválaszjuk az itemconfig -hoz a hátlapot,
# amit eltüntet.
hatlap = self.hatlapok_hat_db_lista[index]

# A kattintott hátlap eltűnik
self.itemconfig(hatlap, state="hidden")

# Bár ez nem egér kattintásra történt de számít,
# ezért növelgetjük itt is.
self.eger_esemeny_szamlalo += 1

break


class App(tk.Tk):
def __init__(self):
super().__init__()
self.title('Felfedés szerencse játék.')
self.configure(bg='black')
self.geometry('700x350+500+100')

# Osztály példányosítás
self.canvas = TippeloJatek(self)
# A canvas konténer megjelenítése az App ablakban
self.canvas.grid(row=0, column=0, rowspan=2)

# ---------------------------------------------------
# Keret a widgeteknek
self.frame1 = tk.Frame(self,
bg='orange',
highlightthickness=2,
highlightbackground='white')
self.frame1.grid(row=2, column=0, sticky="nsew")

# Button
self.ujkep_megjelenito_g = tk.Button(
self.frame1, text="Újképek",
command=self.canvas.kartyak_csere_ujlapok)

self.ujkep_megjelenito_g.pack(
side=tk.LEFT,
padx=2, pady=2)

# Button
self.kilepes_gomb = tk.Button(
self.frame1, text="kilépés",
command=sys.exit)

self.kilepes_gomb.pack(
side=tk.LEFT,
padx=2, pady=2)

# Label, kezdő lépések szövege
self.indito_szoveg = tk.Label(
self.frame1,
text='Az egér bal gombjával kattints egy hátlapra, '
'a Computer követ és random választ.',
bg='orange', font='Helvetica 12')

self.indito_szoveg.pack(side=tk.LEFT, padx=2, pady=2)


# Indító állomás.
if __name__ == '__main__':
app = App()
app.mainloop()


Nincsenek megjegyzések:

Megjegyzés küldése