Feladat: pythonban írni valamilyen apró játékprogramot, a TKINTER grafikus könyvtár használatának segítségével.

Gondoltam, megpróbálom a pasziánsz kártyajátékot elkészíteni. Egyszer valamikor kb. 30-35 éve már elkészítettem, akkor még C64-re. Joystickkal kellett kattintgatni és akkor mai emlékeim szerint pikk-pakk összehoztam. Lehet csak az idő miatt tűnik így, most mindenesetre egy hétig készítettem a béta változatát napi 2-3 órában. Így utólag nem vágnák bele újra.
Sok időt elvett, egyszerűbb lett volna tényleg valami fallabda-szerű játékot, vagy logikai játékot készíteni. Végül azonban igazán jól, élvezetes, működő kis játék kerekedett belőle. Apróbb javítások még ugyan ráférnének, meg a kódot magát is lehetne egyszerűsíteni, szépíteni, de erre most tényleg nincs több időm, ezért is lett béta. Majd egyszer talán optimalizálom, hogy alfásodjon 🙂
Egy tényleg nagyon gyors és felületes leírás írnék most róla. Kezdjük a végén:
# Kártyalap képek mappája
image_dir = "Cards_gif/"
width1 = 650
height1 = 500
canvas1 = Canvas(width=width1, height=height1, bg='#002f00')
canvas1.pack()
# betöltjük az összes kártyaképet egy szótárba
image_dict = create_images()
# bal egérgomb lenyomásakor hívjuk a getxy fv-t
canvas1.bind('', getxy)
# középső egérgomb lenyomásakor hívjuk az atrak fv-t
canvas1.bind('', megfog)
canvas1.bind('', lerak)
# jobb egérgomb lenyomásakor hívjuk az uj_leosztas fv-t
canvas1.bind('', uj_leosztas)
root.mainloop()
A kártyák lapjai gif kiterjesztésű képek, melyeket egy mappába tettem, ennek elérhetőségét beállítom az image_dir változóban.
Látható még a vászon méretének megadása, majd egy függvényhívás mely egy szótárba tölti az összes kártyaképet.
Majd az egér mindhárom gombjának lenyomásához hozzárendelek egy eseményt, egy-egy függvényhívást. A jobb egérgomb kattintására megkeveri és leteríti az asztalra a kártyalapokat.
A bal egérgomb kattintására az adott kártya a neki megfelelő helyre teleportál, ha van ilyen hely. Ha nincs akkor nem történik semmi. A talonba lerakott paklit folyamatosan lehet lapozgatni szintén bal egérgombbal.
A középső egérgomb a több felfordított, egymásra helyezett kártyák csoportos áthelyezésére szolgál. Pontosan az átrakni kívánt paklicsomag legalsó (még felfelé fordított) lapján kell lenyomni a középső egérgombot, majd a kívánt helyre húzni az egérmutatót, és ott felengedni.
Minden oszlop, valamint a végső helyekre kerülő (4 db) csomag és a talonban lévő le és felfordított (2 db) csomag is egy egy lista. A listák elemei a kártyalapok.
Lista tartalmazza szintén az egyes listákban található felfordított lapok számát, hogy a lapok áthelyezése után is annyi maradjon felfordítva amennyinek kell. De listába van foglalva a lehetséges kártyamozgások variációi is. Ennek megmutatásához azonban előtte kell egy kis magyarázat:
Két függvény látható a fenti képen, elég jól el van látva magyarázattal, sokat nem is írnék külön róla. Az első most a lényegesebb, hogy megértsük a kártyalapok neveit, és hogy miként került elkészítésre a variációs lehetőségek listája.
# egymásra pakolható kártyalapok definíciós listája
goood_check = ('C2CA', 'C2D3', 'C2H3',
'S2SA', 'S2D3', 'S2H3',
'D2DA', 'D2C3', 'D2S3',
'H2HA', 'H2C3', 'H2S3',
'C3C2', 'C3D4', 'C3H4',
'S3S2', 'S3D4', 'S3H4',
'D3D2', 'D3C4', 'D3S4',
'H3H2', 'H3C4', 'H3S4',
....
....
....
'DJDT', 'DJCQ', 'DJSQ',
'HJHT', 'HJCQ', 'HJSQ',
'CQCJ', 'CQDK', 'CQHK',
'SQSJ', 'SQDK', 'SQHK',
'DQDJ', 'DQCK', 'DQSK',
'HQHJ', 'HQCK', 'HQSK',
'CKCQ', 'SKSQ', 'DKDQ', 'HKHQ'
)
A fenti kódban látható ennek a listának az eleje és a vége. A megértéshez ennyi is elég. Nézzük az első sorát: ‘C2CA’, ‘C2D3’, ‘C2H3’,
Ez azt jelenti, hogy:
- C2 – azaz a Treff 2-est lehet rakni a már a helyére került, felfordított CA-ra azaz a Treff ászra,
- valamint a D3-ra azaz a Káró 3-asra ha valamelyik oszlopban az az utolsó felfordított kártya
- és a H3-ra azaz a Kőr 3-asra ha valamelyik oszlopban az az utolsó felfordított kártya
Ugyanígy a listában szerepel az összes kártyalap – összes lehetséges áthelyezés variációja. Nagyon a működésébe nem folynék bele itt, ha valakinek van kérdése a kóddal kapcsolatban, az keressen meg. Lényege, hogy a bal kattintás után, annak pozíciója alapján megnézi, melyik listán történt a kattintás, és azon lista utolsó elemének van-e olyan kombinációs variációja, mely alapján egy másik lista utolsó elemének a függvényében annak oda áthelyezése megtörténhet.
A kód jelenlegi (béta) verziója 843 sorból áll, mondhatni egérgörgőt füstöltető hosszúságú.
Ha valaki tesztelni akarja, játszani vele, vagy tovább fejleszteni, akkor szívesen eljuttatom neki.
Nem, azért nem tudom pakolni ilyen sebességgel a lapokat. A videó közepét felgyorsítottam négyszeres sebességre, hogy ne legyen olyan hosszú.
