Hra:Roboti přichází – Python – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Hra:Roboti přichází – Python – Fórum – Programujte.comHra:Roboti přichází – Python – Fórum – Programujte.com

 

Ahoj30
Návštěvník
30. 7. 2010   #1
-
0
-

Dělam hru ze stránek(http://geon.wz.cz/livewires/5-robots.html)
Pohybujete se s kolečkem a utíkáte před čtverečky, kteří vás pronásledují.
Bohužel jsem se zastavil zrovna u toho pohybování :D
toto je kostra programu

from livewires import *  # Jako obvykle


begin_graphics() # Abychom vůbec mohli malovat
allow_moveables() # Vysvětlím později
vyrobHrace()
koncime = 0

while not koncime:
posunHrace()

end_graphics() # Skončili jsme


Skončil jsem u části Lokální proměnné a global
Měl jsem uděkat toto:
Změňte vyrobHrace tak, aby aby hodnota vrácena z funkce circle() se uložila do proměnné (snad s názvem hrac_telo nebo jinak); a

...obnovte celý cyklus while tak jak je výše v kostře programu a

...založte staronovou funkci posunHrace(), která bude používat funkci keys_pressed() a tak zjišťovat, které klávesy jsou stisknuty. (Vlastně do ní vložíte tělo z výše uvedeného cyklu while, bez zbytečných věcí - spánku a tisku.) Prozatím by mohla pouze reagovat na klávesu ‘q’ tak, že když stiskneme klávesu ‘q’ - do proměnné koncime uložíme 1 (tedy místo příkazu break bude koncime=1) a tím se ukončí cyklus while a program normálně skončí.
a poté : zglobalizujte” proměnnou koncime ve funkci posunHrace a měla být začít fungovat klávesa ‘q’. Vyzkoušejte.

Asi jsem někde napsal zas nějakou blbost, ale mě ten program nechce skončit. Tak jestli byste mi ho nemohli prosím opravit abych mohl pokračovat.
Tady je:
import random

import time
from livewires import *
begin_graphics()
allow_moveables()
def vyrobHrace():
hrac_x=random.randint(0,63)
hrac_y=random.randint(0,47)
hrac_telo=circle(10*hrac_x+4, 10*hrac_y+4, 5, filled=1)
return hrac_telo
vyrobHrace()
koncime = 0
while not koncime:
def posunHrace():
global koncime
klavesy=key_pressed()
if 'q' in klavesy:
koncime = 1


end_graphics()



Nahlásit jako SPAM
IP: 85.160.75.–
zdenda
~ Anonymní uživatel
257 příspěvků
30. 7. 2010   #2
-
0
-

Protože v tom cyklu máš jen definici té funkce. Ještě ji musíš vyvolat. A taky bych du definici přesunul ven z toho cyklu, takže nějak takhle:

def posunHrace(): 

global koncime
klavesy=keys_pressed()
if 'q' in klavesy:
koncime = 1

while not koncime:
posunHrace()

Nahlásit jako SPAM
IP: 213.211.51.–
Ahoj30
Návštěvník
30. 7. 2010   #3
-
0
-

Díky už to funguje :)

Nahlásit jako SPAM
IP: 85.160.75.–
Ahoj30
Návštěvník
31. 7. 2010   #4
-
0
-

Tak jsem tady zas.
Tentokrát mám problém s pohybem. Program by měl po zmačknutí 'd' posunout kuličku doprava. Bohužel když zmačknu 'd' kulička se sice pohne, ale asi o milimetr. Když 'd' zmáčknu podruhé kulička už se ani nehne.

import random

import time
from livewires import *
begin_graphics()
allow_moveables()
def vyrobHrace():
global hrac_x
global hrac_y
global hrac_telo
hrac_x=random.randint(0,63)
hrac_y=random.randint(0,47)
hrac_telo=circle(10*hrac_x+4, 10*hrac_y+4, 5, filled=1)


vyrobHrace()
global koncime
koncime = 0

def posunHrace():
global koncime
klavesy = keys_pressed()
if 'd' in klavesy:
move_to(hrac_telo,10*hrac_x+5.1,10*hrac_y+4)

while not koncime:
posunHrace()



end_graphics()


Stránky odkud hru dělam ( http://geon.wz.cz/livewires/5-robots.html ). Jsem stále u části Lokální proměnné a global)
Děkuju že se mnou máte trpělivost.

Nahlásit jako SPAM
IP: 85.160.73.–
zdenda
~ Anonymní uživatel
257 příspěvků
31. 7. 2010   #5
-
0
-

Posunuješ toho hráče pořád na stejnou pozici. Musíš aktualizovat ty souřadnice. Nějak takhle:

def posunHrace(): 

global hrac_x
global hrac_y
klavesy = keys_pressed()
if 'd' in klavesy:
hrac_x = hrac_x + 1
move_to(hrac_telo, 10 * hrac_x + 4, 10 * hrac_y + 4)
if 'a' in klavesy:
hrac_x = hrac_x - 1
move_to(hrac_telo, 10 * hrac_x + 4, 10 * hrac_y + 4)
if 'w' in klavesy:
hrac_y = hrac_y + 1
move_to(hrac_telo, 10 * hrac_x + 4, 10 * hrac_y + 4)
if 's' in klavesy:
hrac_y = hrac_y - 1
move_to(hrac_telo, 10 * hrac_x + 4, 10 * hrac_y + 4)
Respektive takhle:
def posunHrace(): 

global hrac_x
global hrac_y
klavesy = keys_pressed()
if 'd' in klavesy:
hrac_x = hrac_x + 1
if 'a' in klavesy:
hrac_x = hrac_x - 1
if 'w' in klavesy:
hrac_y = hrac_y + 1
if 's' in klavesy:
hrac_y = hrac_y - 1
move_to(hrac_telo, 10 * hrac_x + 4, 10 * hrac_y + 4)

Nahlásit jako SPAM
IP: 213.211.51.–
zdenda
~ Anonymní uživatel
257 příspěvků
31. 7. 2010   #6
-
0
-

A ještě je potřeba myslet na to, že ten cyklus beží rychle pořád dokola a i krátký stisk klávesy stihne zaznamenat mockrát. To můžeš nejjednodušeji vyřešit tím, že do něj přidáš zpoždění.

while not koncime: 

posunHrace()
sleep(0.05);

Nahlásit jako SPAM
IP: 213.211.51.–
Ahoj30
Návštěvník
31. 7. 2010   #7
-
0
-

Díky :)
Tak snad se konečně rozjedu a udělam taky něco sam. Ať tady moc neotravuju, ale jestli mě programování neomrzí, budu zde na foru otravovat asi celý život :)

Nahlásit jako SPAM
IP: 85.160.73.–
Ahoj30
Návštěvník
6. 8. 2010   #8
-
0
-

V tuto chvíli mam udělat toto: Namísto jediného objektu robot, bychom měli mít seznam robots, obsahující všechny roboty na ploše.Každá položka seznamu bude instance třídy Robot a vytvořit pro každého Robot atribut a jmenem srot
Chci se zeptat jestli to je dobře mně se zdá že jsem udělal nějakou blbost.

def vyrobRoboty():

global robot, robot2, robot3
robots=[]
robot = Robot()
robot2 = Robot()
robot3 = Robot()
robots.append(robot)
robots.append(robot2)
robots.append(robot3)
robot.srot = 1
robot2.srot = 1
robot3.srot = 1

robot.x = random.randint(0, 63)
robot.y = random.randint(0, 47)
robot.telo = circle(10*robot.x + 4, 10* robot.y + 4, 7)



Jestli jsem to napsal správně tak u další části už si nevim rady

Na kontrolu srážek budeme mít dvě funkce. První bude kontrolovat, jestli je hráč na stejném místě jako robot (nebo hromada šrotu), tedy něco jako funkce srazka, kterou již máme. Další věc, kterou potřebujeme ověřovat je, jestli se srazili dva roboti. Z toho vyplývá, že potřebujeme více než jen vědět “srazili se nějací roboti?”; potřebujeme znát kteří roboti. Nejlepší bude vytvořit funkci, která bude určovat pro každého jednotlivého robota, jestli existuje jiný robot který je v řadě před ním, se kterým se srazil. Po takovéto kontrole celého seznamu získáme každou srážku přesně jednou. (Víte proč?) Funkce bude vracet buď 0 nebo instanci Robot, který se srazil s robotem, na kterého se ptáme. Funkce kontrolaSrazek bude volat jednou pro každého funkci je hráč mrtvý.
Já jsem si to představoval nějak takto:
def srazkaRobotu():

global robot, robot2, robot3
if robot2 == robots index(0):
robot2.srot = 0
if robot3 == robots index(1):
robot3.srot = 0


def kontrolaSrazek():

global koncime, robot, hrac

if robot:
if srazka():
print 'Prohrals'

if robot2:
if srazka():
print 'Prohrals'

if robot3:
if srazka():
print 'Prohrals'

Nahlásit jako SPAM
IP: 85.160.98.–
zdenda
~ Anonymní uživatel
257 příspěvků
7. 8. 2010   #9
-
0
-

Při výrobě inicializuješ jen prvního robota. Taky v tu dobu ještě do ničeho nenarazil, takže šrot bude 0 a ne 1.
Významem vkládání robotů do seznamu je právě to, abys při dalších testech mohl procházet ten seznam a nemusel ifovat jednotlivé proměnné jako blázen.

Nahlásit jako SPAM
IP: 213.211.51.–
zdenda
~ Anonymní uživatel
257 příspěvků
7. 8. 2010   #10
-
0
-

To co jsem hodil jako přílohu není podle toho článku, jen jsem to spatlal pro inspiraci.
Taky by nebylo od věci naučit se aspoň to, co je v tom článku v sekci "Co musíte znát", protože mám pocit, že vůbec netušíš, co děláš.

Nahlásit jako SPAM
IP: 213.211.51.–
Ahoj
~ Anonymní uživatel
5 příspěvků
12. 8. 2010   #11
-
0
-

Děkuju za tu přílohu je mi to jasnější a už si uvědomuju co jsem to napsal za blbost. Ty listy které jsem si měl před tímto projektem přečíst jsem si přečetl.
Teď si ale nevím rady u srážky robotů.
Mam vytvořit funkci ktera kontroluje jestli robot, na kterého se zrovna v seznamu díváme je ten samý, jako jako robot, na kterého se ptáme. Pokud ano, break.
Kontrolovat jestli robot, na kterého se zrovna v seznamu díváme, není náhodou na stejném místě jako robot, na kterého se ptáme. Pokud ano, vrátíme ho (pomocí funkce return)
Řekli byste mi prosím proč to nefunguje?

def srazkaRobota():

global robot
for robot in seznam:
if robot == robot:
break

if robot.x == robot.x and robot.y == robot.y:
return robot
return 0

Nahlásit jako SPAM
IP: 85.160.86.–
Tom
~ Anonymní uživatel
434 příspěvků
12. 8. 2010   #12
-
0
-

To Ahoj :
Ja bych takhle od pohledu rekl, ze "robot == robot" bude vzdy pravda, at uz v seznamu vyberes za "robot" cokoliv. Stejne jako 1 == 1 je vzdy pravda a hruska == hruska taky. Nevim jak vypada cely kod, ale pokud bys mel nejakeho hlavniho robota (v prikladu v promenne "robik"), ktereho chces testovat oproti seznamu robotu, tak spis nejak:



for robot in seznam_robotu:
if robot == robik:
break


Jestli placam nesmysli, tak se omlouvam....

Nahlásit jako SPAM
IP: 212.4.138.–
Ahoj
~ Anonymní uživatel
5 příspěvků
12. 8. 2010   #13
-
0
-

Bylo to tím, ale já zapomněl ty čísla zaokrouhlit, takže se ti roboti ne a ne proměnit na šrot.
Děkuju za vysvětlení

Nahlásit jako SPAM
IP: 85.160.64.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 3 hosté

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý