Funkce ve hře

28 views
Skip to first unread message

Tomáš Roj

unread,
Sep 7, 2018, 12:48:56 PM9/7/18
to django-cs
Ahoj všichni,

potřeboval bych poradit. Dělám hru kámen, nůžky, papír v grafickém rozhraní tkinter. Program funguje tak, že když se stiskne button např. pro "papír" spustí se funkce, ve které se tah od člověka definuje jako kámen. Bohužel mi, ale pořád vyskakuje chyba že tah od uživatele, není definován. Může mi, prosím někdo poradit? (tah od uživatele mám definován, jen v té funkci)


Díky, za rady,
Tomáš

Petr Messner

unread,
Sep 7, 2018, 1:08:58 PM9/7/18
to djan...@googlegroups.com
Pošli kód prosím tě :) Nebo ho můžeš nahrát na Github a poslat sem odkaz. 

Petr Messner

7. 9. 2018 v 18:48, Tomáš Roj <Rojt...@email.cz>:

--
--
E-mailová skupina djan...@googlegroups.com
Správa: http://groups.google.cz/group/django-cs
---
Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny „django-cs“ ve Skupinách Google.
Chcete-li zrušit odběr skupiny a přestat dostávat e-maily ze skupiny, zašlete e-mail na adresu django-cs+...@googlegroups.com.
Chcete-li tuto diskusi zobrazit na webu, navštivte https://groups.google.com/d/msgid/django-cs/f3c07417-2e82-4d64-af39-ec68b220bac7%40googlegroups.com.
Další možnosti najdete na https://groups.google.com/d/optout.

rojt...@email.cz

unread,
Sep 7, 2018, 1:13:09 PM9/7/18
to djan...@googlegroups.com
Ahoj, posílám ten zdrojový kod.

Kamen_nuzky.py

Petr Messner

unread,
Sep 7, 2018, 3:08:40 PM9/7/18
to djan...@googlegroups.com

Ahoj, posílám ten zdrojový kod.

Je vidět, že vycházíš z kámen-nůžky-papír na naučse: https://naucse.python.cz/course/pyladies/beginners/comparisons/ (až na konci stránky)

To, co je na naučse, je jednoduchý program. Zjistí si vstup, něco udělá, vypíše nějaký výstup, konec. Většina programů pro příkazovou řádku je takhle jednoduchá. A jedoduše se to programuje.

Ty se teď ale snažíš o okýnkovou aplikaci. Ty už tak jednoduché nejsou. Okýnková aplikace se spustí, ale nemůže ještě nic dělat, musí počkat, až do ní uživatel začne nějak klikat, aby vůbec věděla co má dělat. A pak je to ještě horší! Nejenže musí začít něco dělat, ale mezitím musí stále reagovat na uživatelovo klikání (jak vypadá zaseklý program, který v tomto selhal, jsi už asi někdy zažil). Takže programování okýnkových aplikací proto není tak jednoduchý jako těch pro příkazovou řádku.

Okýnkový aplikace fungujou tak, že
1) sestavíš nějaký prvotní stav té aplikace - vytvoříš okno, do něj dáš texty (labels), tlačítka, tabulky, obrázky apod.
2) dál už nic - spustíš nějakou funkci, která si běh programu zcela převezme a běží typicky až do konce tvého programu. Tahle funkce obsahuje nekonečnou smyčku (tzv. event loop), která zpracovává všechny vstupy (klikání myší, klávesnice, hodiny, signály, síť apod.) a nějak na ně reaguje.

Jak teda udělat, aby tvoje aplikace po kliknutí na tlačítko něco dělala? To se dělá tak, že tomu tlačítku nastavíš tzv. handler (někdy se tomu říká callback, nebo action apod.), což je funkce, která je zavolána v reakci na kliknutí na tlačítko, a ty v tomhle handleru (v té funkci) můžeš zkusit něco udělat (samozřejmě můžeš volat další funkce, nemusí to být fyzicky v jedné obrovské funkci). Ale nemělo by to trvat moc dlouho, aby program nevypadal zaseklý.

Z toho plyne, že veškerá logika té aplikace, pokud to není inicializace (tvorba toho prvotního stavu), tak bude uvnitř nějakého handleru. Takže je zřejmé, že tvoje if tah_clovek == "Kámen": je na špatném místě - není to uvnitř žádného handleru.

Když se na svůj program podíváš tak, jak se na něj dívá Python - prostě jedeš odshora dolu - tak to nemůže fungovat. 
- importuješ něco - ok
- vytvoříš window a lblněco - ok
- vytvoříš moznosti a tah_pocitac - ok
- vytvoříš nějaké funkce, které se jmenují Kamen, Nuzky a Papir - ok. Pozor, ty funkce nejsou spuštěny, jen jsou "zaevidovány", proměnná tah_clovek teď nikde neexistuje.
- vytvoříš nějaké buttony - ok. Těm buttonům dáš odkaz na ty předchozí funkce. To ale ty funkce nespustí. Jen ty buttony budou vědět, že když se na ně někdy v budoucnu klikne, tak teprve potom se spustí tyhle jejich funkce.
- další lblněco
- a teď je tam nějaký if tah_clovek. Co to je? Žádná proměnná tah_clovek přeci neexistuje. Doteď nebyla nijak vytvořena. Python panikaří a končí. Oprávněně.

Zkus svůj program upravit.

To, že ve funkci Kamen (stejně tak Nuzky a Papir) máš porovnání místo přiřazení, a že kdyby to bylo přiřazení, tak by ta proměnná byla lokální jen v té funkci a nebyla by vidět "ven", je jen detail.

PM

rojt...@email.cz

unread,
Sep 7, 2018, 3:52:09 PM9/7/18
to djan...@googlegroups.com
Ahoj,
diky moc za tvou obsáhlou pomoc. Jsem si jistáhnu,  že mi pomůže i do budoucnaa jsem za ní moc vděčný. Budu se řídit tvými radami a snad to opravím. 

S pozdravem,
Tomáš 

--
--
E-mailová skupina djan...@googlegroups.com
Správa: http://groups.google.cz/group/django-cs
---
Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny „django-cs“ ve Skupinách Google.
Chcete-li zrušit odběr skupiny a přestat dostávat e-maily ze skupiny, zašlete e-mail na adresu django-cs+...@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages