[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