[Tutor PyCZ] Dalsi problem s Livewires

geon geon na post.cz
Úterý Únor 28 14:32:38 CET 2006


Tomáš Bělonožník napsal(a):
> Moc díky za rady, konečně už jsem pochopil to "xh, yh, Hrac_telo =
> vyrobHrace()".  Narazil jsem ale na další problém, který souvisí s
> prvním. Snažil jsem se funkci posunHrace napsat takhle:
>
> def posunHrace():
>     stisky = keys_pressed()
>     if "2" in stisky:
>         yh = yh - 10
>         move_to(Hrac_telo, xh, yh)
>         return yh
>
> Mělo to fungovat tak, abych změnil yh, pak posunul hráče podle na
> novou hodnotu, a pak si nechal vrátit yh v nové formě. Hází mi to ale
> chybu "local variable 'yh' referenced before assignment". Chápu to
> tak, že jsem proměnnou yh zmínil ještě předtím, než jsem jí přiřadil
> nějakou hodnotu. Ale proč si tu hodnotu nevezme sám z vyšších pater
> programu, jako to udělal, když řádek move_to vypadal
> "move_to(Hrac_telo, xh, yh-10)". To totiž hráčem opravdu posunul o 10
> pixelů. Potřeboval bych tedy prosím vědět, jak říci funkci, aby si
> vzala potřebné hodnoty "zeshora"
>
>   
Potřebnou teorii jistě dodá pepr :-) , já jen za sebe:

To je to, o čem jsem psal ve svém druhém mailu. Musíš této funkci 
potřebné parametry *předat* a ona je musí umět *přijímat*.
Předávání se děje při volání funkce, tedy:
posunHrace(xh, yh)  [1]

a v definici funkce se nadefinuje, že musí přijímat 2 parametry:
def posunHrace(xh,yh):
   ....

Nesmíš ovšem zapomenou, že funkce bude ty dvě proměnné vracet (nebo tam 
máš 3 - no to je ostatně jedno, to již si uděláš podle své aktuální 
situace). Takže někde ve funkci je radka:
return xh, yh

No a nakonec tedy musím opravit svůj [1] takto:
xh, yh = posunHrace(xh, yh)

Snad jsem na nic nezapomněl. Trocha teorie ode mne: některé proměnné 
skutečně funkce dokáže brát zezhora - zde třeba Hrac_telo nebo tvůj výše 
uváděný move_to(Hrac_telo, xh, yh-10) . Jsou to ale vzdy jen ty 
proměnné, které se ve funkci nemění - jsou tam jen jakoby read-only. 
Proto ti to házelo tu chybu, protože jsi chtěl změnit read-only 
proměnnou. (jinak se toto právě dá řešit pomocí zglobalizování proměnné, 
ale to je fuj :-) ,  to už jsme se dohodli...)

-- 
geon
Vyjímka je pravidlo.



Další informace o konferenci Tutor