[Tutor PyCZ] Milované Livewires - A najednou tam lezou třídy

geon geon na post.cz
Pátek Březen 3 08:56:57 CET 2006


 > [Tutor PyCZ] Milované Livewires - A najednou tam lezou třídy
 >
 > Ahoj,
 > tak jsem dále pokročil v tvorbě oné robotí hry a dostal jsem se do
 > části, kde by to chtělo přidat další roboty aby jich hráče honilo víc.
 > Autor tutoriálu se jal používat třídy a k úpravě programu poskytl
 > instrukce:

Ahoj, autor (překladatel) jsem já ;-) a ty jsi asi první, kdo kurz 
prochází celý. Kurz byl původně (v originále) myšlen jako kurz na Letním 
pythonýrském táboře. Tak jsou dělané i ty listy --- nehotové, neříkající 
vše -- protože žák má na kurzu kdykoliv možnost zvednout ruku a zeptat 
se přímo. Offtopic - to je jeden z důvodů proč jsem proti zavádění 
eLearningu na ZŠ.


Třídy jsou zde použity jen ve svém velmi okrajovém významu. Žádná 
dědičnost, dokonce žádné metody. Jen jakoby obal na všechny proměnné, 
které k sobě patří. Abys nepsal např.:
xh=10
yh=20
Hrac_telo = ...

ale:

hrac.xh=10
hrac.yh=20
hrac.Hrac_telo = .... (nebo lépe přejmenovat na hrac.telo = ...)

V podstatě jen pro lepší přehled a následnou snažší manipulaci. Použití 
je toto.

class Hrac:
   pass

hrac=Hrac()
# a pak již můžeš dělat:
hrac.x=random(...)
hrac.y=.....


Udělal jsi ohromný kus práce, přesto bych bych nejdříve, abychom 
společně tvůj program zprovoznili (nefunguje - zkus si zkoírovat co jsi 
poslal a zkus to pustit) a okomonetovali (pokud chceš po ostatních, aby 
ti pomáhali s programem, je lepší komentovat, alespon základní smysly 
funkcí případně náročnějších míst).
 
 >
 > def vyrobRobota():
 >     xr=random.randint(8, 631)
 >     yr=random.randint(8, 471)
 >
 >     xr_round = xr / 10
 >     xh_round = xh / 10
 >     yr_round = yr / 10
 >     yh_round = yh / 10
 >     while xr_round == xh_round:
 >         while yr_round == yh_round:
 >             xr=random.randint(8, 631)
 >             yr=random.randint(8, 471)
 >

"nezamrzá" ti to někdy? - může to být tímto cyklem - protože z něho není 
cesty ven - musíš měnit i xh_round, ....
a neni lepší (zkus přijít na rozdíl)??:
while xr_round == xh_round and yr_round == yh_round:


 >     Robot_telo = box(xr-5,yr-5,xr+5,yr+5, filled=1, 
colour=Colour.dark_blue)
 >     return xr, yr, Robot_telo
 >

tady něco chybí, tady je chyba

 >         if "2" in klavesy:
 >             xh = xh + 0
 >             yh = yh - 10
 >             sleep(0.2)
 >             teleportace = teleportace + 0
 >             return xh, yh, teleportace
 >         elif "8" in klavesy:
 >             xh = xh + 0
 >             yh = yh + 10
 >             sleep(0.2)
 >             teleportace = teleportace + 0
 >             return xh, yh, teleportace
 >         elif "4" in klavesy:
 >             xh = xh - 10
 >             yh = yh + 0
 >             sleep(0.2)
 >             teleportace = teleportace + 0
 >             return xh, yh, teleportace
 >         elif "6" in klavesy:
 >             xh = xh + 10
 >             yh = yh + 0
 >             sleep(0.2)
 >             teleportace = teleportace + 0
 >             return xh, yh, teleportace
 >         elif "1" in klavesy:
 >             xh = xh - 10
 >             yh = yh - 10
 >             sleep(0.2)
 >             teleportace = teleportace + 0
 >             return xh, yh, teleportace
 >         elif "3" in klavesy:
 >             xh = xh + 10
 >             yh = yh - 10
 >             sleep(0.2)
 >             teleportace = teleportace + 0
 >             return xh, yh, teleportace
 >         elif "7" in klavesy:
 >             xh = xh - 10
 >             yh = yh + 10
 >             sleep(0.2)
 >             teleportace = teleportace + 0
 >             return xh, yh, teleportace
 >         elif "9" in klavesy:
 >             xh = xh + 10
 >             yh = yh + 10
 >             sleep(0.2)
 >             teleportace = teleportace + 0
 >             return xh, yh, teleportace
 >         elif teleportace < 5:
 >             if "t" in klavesy:
 >                 xh = random.randint(8, 631)
 >                 yh = random.randint(8, 471)
 >                 teleportace = teleportace + 1
 >                 sleep(0.1)
 >                 return xh, yh, teleportace
 >             else:
 >                 xh = xh + 0
 >                 yh = yh + 0
 >                 teleportace = teleportace + 0
 >                 return xh, yh, teleportace
 >         else:
 >             xh = xh + 0
 >             yh = yh + 0
 >             teleportace = teleportace + 0
 >             return xh, yh, teleportace

v této funkci se zbytečně stokrát opakuje return xh, .... Nešlo by to 
dát až na konec funkce? Je tam dvakrát stejný else... myslím že 
zbytečně... nemusí tam být ani jednou, nebo ano?



 >
 > def posunRobota(xr, xh, yr, yh, Robot_telo):
 >     if xr < xh:
 >         if yr == yh:
 >             xr = xr+5
 >             yr = yr+0
 >             move_to(Robot_telo, xr, yr)
 >             sleep(0.2)
 >             return xr, yr
 >         elif yr < yh:
 >             xr = xr+5
 >             yr = yr+5
 >             move_to(Robot_telo, xr, yr)
 >             sleep(0.2)
 >             return xr, yr
 >         elif yr > yh:
 >             xr = xr+5
 >             yr = yr-5
 >             move_to(Robot_telo, xr, yr)
 >             sleep(0.2)
 >             return xr, yr
 >         else:
 >             return xr, yr
 >     elif xr > xh:
 >         if yr == yh:
 >             xr = xr-5
 >             yr = yr+0
 >             move_to(Robot_telo, xr, yr)
 >             sleep(0.2)
 >             return xr, yr
 >         if yr < yh:
 >             xr = xr-5
 >             yr = yr+5
 >             move_to(Robot_telo, xr, yr)
 >             sleep(0.2)
 >             return xr, yr
 >         if yr > yh:
 >             xr = xr-5
 >             yr = yr-5
 >             move_to(Robot_telo, xr, yr)
 >             sleep(0.2)
 >             return xr, yr
 >         else:
 >             return xr, yr
 >     elif yr < yh:
 >         yr = yr+5
 >         xr = xr+0
 >         move_to(Robot_telo, xr, yr)
 >         sleep(0.2)
 >         return xr, yr
 >     elif yr > yh:
 >         yr = yr-5
 >         xr = xr+0
 >         move_to(Robot_telo, xr, yr)
 >         sleep(0.2)
 >         return xr, yr
 >     else:
 >         xr = xr+0
 >         yr = yr+0
 >         return xr, yr
 >

nemám tady u sebe konečné řešení, ale tahle "kalkulační matematika 
přibližování"
by také měla jít zjednodušit, asi takto:
Když bude souřasdnice hráče menší než souřadnice robota, přičti k 
souřadnici robora nějaký krok. A to se musí udělat zvlášť pro x a y a 
zvlášť pro menší a větší. Takže tohle je vlastně 1/4 této části

    if robot.x < hrac.x:
        robot.x=robot.x+krok/2
        


 >
 > def posunHrace():
 >     move_to(Hrac_telo, xh, yh)
 >
 > # Funkce znemožňující hráčův pohyb za okraj hrací plochy
 > def kontrola_plochy(xh, yh, Hrac_telo):
 >     if xh < 8:
 >        xh = 8
 >        yh = yh+0
 >        move_to(Hrac_telo, xh, yh)
 >        return xh, yh
 >     elif xh > 631:
 >        xh = 631
 >        yh = yh+0
 >        move_to(Hrac_telo, xh, yh)
 >        return xh, yh
 >     elif yh < 8:
 >        yh = 8
 >        xh = xh+0
 >        move_to(Hrac_telo, xh, yh)
 >        return xh, yh
 >     elif yh > 471:
 >        yh = 471
 >        xh = xh+0
 >        move_to(Hrac_telo, xh, yh)
 >        return xh, yh
 >     else:
 >        return xh, yh

a tady podobně:
  if hrac.x<0:  hrac.x=0

Stačí nastavit jen x-sovou souřadnici ne? Ostatní zůstaávají nemění se....  


 >
 > # Kontrola srážky s robotem
 > def kontrola_srazky(xr, xh, yr, yh, konec_sub):
 >     xr_round = xr / 10
 >     xh_round = xh / 10
 >     yr_round = yr / 10
 >     yh_round = yh / 10
 >     if xr_round == xh_round:
 >         if yr_round == yh_round:
 >             print "Prohrál jsi!"
 >             konec_sub = 1
 >             return konec_sub
 >         else:
 >             pass
 >     else:
 >         pass



zase mi připadají ty dvě else: pass nějaké navíc ....

 >
 > box(3,3,636,476)                        # Vytváří okraj hrací plochy
 >
 > xh, yh, Hrac_telo = vyrobHrace()
 > xr, yr, Robot_telo = vyrobRobota()
 >
 > while konec != 2:
 >     while 1:

není to while 1: zbytečné??

 >         klavesy = keys_pressed()
 >
 >         xh, yh, teleportace = zmena_XY_hr(xh, yh, teleportace)
 >         posunHrace()
 >
 >         xh, yh = kontrola_plochy(xh, yh, Hrac_telo)
 >         xr, yr = posunRobota(xr, xh, yr, yh, Robot_telo)
 >         konec_sub = kontrola_srazky(xr, xh, yr, yh, konec_sub)
 >         # Ukončení hry v případě kolize
 >         if konec_sub == 1:
 >             konec = 2
 >             break

není to break zbytečné???

 >         # Přerušení hry ze strany uživatele
 >         if "q" in klavesy:
 >             konec = 2
 >             break
 >
 > end_graphics()
 >


Možná budeš chtít se ptát na jednotlivé detaily, tak se ptej, dej sem 
funkcční kousek kodu a můžeme to řešit. Dlouhé programy často odrazují 
od odpovídání ;-) Zkus si vždy v malém programu nasimulovat svůj 
problém, odprostit ho od věcí, které tam být nemusí a hurá s ním sem

Určite jsem na něco zapomněl, jako vždy, ale alespoň doufám, že jsem 
nikde neudělal chybu...

geon


Další informace o konferenci Tutor