Gå til innhold

Anbefalte innlegg

Hei. Holder på med å lage et spill i Python. Kommer kanskje til å endre hele oppsettet ettersom jeg kanskje har funnet på en bedre løsning. Men jeg har enda ikke fått denne løsningen til å funke, så jeg lurte på om det var noen her som visste om jeg har skrevet inn noe feil, eller om den måten faktisk går i det hele tatt?

 

La oss si at vi kjører på en vei i spillet. Så får vi valget om vi vil kjøre til høyre eller til venstre, derreter får vi valget om å stoppe, eller å kjøre videre. Foreløpig ser det sånn ut:

 

print 'Spillet'
print 'Test'


def meny1():
while True:
	print
	print 'Vil du kjøre til høyre eller til venstre?'
	print
	choice = raw_input('velg: ')
	if choice == 'Venstre':
		venstre()
	elif choice == 'Høyre':
		høyre()
	else:
		print
		print 'du har skrevet inn feil kommando'
		print
meny1()

def venstre():
print
print 'dette er ja'
goto meny2()

def meny2():
while True:
	print
	print 'Du kjørte til venstre'
	print 'Vil du stoppe nå, eller kjøre videre?
	print
	choice2 = raw_input('velg: ')
	if choice2 == 'Venstre':
		venstre2()
	elif choice == 'Stopp':
		stopp()
	else:
		print
		print 'feil'

def venstre2():
print 'test'

meny2()

 

Det kan se litt rotete ut foreløpig. Men det jeg lurte på, var om det fantes en goto kommando. I dette eksempelet har jeg skrevet inn

 

def venstre():
print
print 'dette er ja'
goto meny2()

 

Men det gikk ikke så godt. Vet noen om dette faktisk virker, eller om jeg bare må gi opp?

 

Fant et eksempel et annet sted, men da var det ikke samme oppsett. Jeg prøvde det, men det funket heller ikke. Da var hele koden:

 

goto .meny2()

label .meny2
meny2()

 

Så... Finnes det noen goto kommandoer i Python? Dette hadde vært til svært nytte. Jeg håper det er noen her som vet hvordan jeg gjør dette.

 

Jeg takker på forhånd :)

 

Mvh. Stigah

Lenke til kommentar
Videoannonse
Annonse
Da må du fortelle meg hvorfor dette er en negativ ting :p Finnes det noen andre måter jeg kan gjøre dette på?

 

Som du sier selv, så ser koden litt rotete ut allerede. Å ha masse kode, og hoppe rundt i den med goto, pleier å føre til rimelig fæl og uoversiktelig kode egentlig.

 

Nå vet jeg ikke helt hvordan spillet skal fungere, men jeg tror du kan snu eller knekke om på hvordan du legger opp koden.

 

En tanke kan være å ha en main event loop, som leser input osv, og så har en graf av noe slag som du navigerer rundt.

 

Dersom du skal f.eks ha forskjellige rom eller veier, så kan en grei måte å gjøre det på kanskje være å skrive en klasser eller instanser for hvert rom, og så implementere metoder for å gi rommene eller veiene oppførsel. Da kan du også lett lage en større mengde av dem, ved å subklasse for å bytte ut eller gi annen funksjonalitet, dynamisk lage en instans, og så endre oppførselen på den osv.

 

Hvis du f.eks har en klasse som implementerer "entered" når du kjører inn på en ny vei, så kan du skrive logikk for ting som skal skje der. Kjører noen til venstre, så kan du bruke returverdien til å gi det nye rommet/veien/whatnot.

 

class SomeRoad:
def venstre():
	return SomeOtherRoad()

Lenke til kommentar

Tusen, tusen takk terjeelde :D (Finnes det noen takke knapp her?)

 

Jeg hadde også blitt utrolig glad hvis du hadde lagt det inn i et "script" som et eksempel. F.eks. endret på det jeg nevnte først.

 

I spillet mitt kjører man en bil. Du blir stoppet av politiet, pga. kollisjon lengre fremme. Politimannen spør da om hvor du skal. Hvis du velger A, sier han kanskje at jeg er nødt til å snu. Hvis jeg velger B, sier han at jeg kan fortsette.

 

Etter en stund ringer en ukjent person til deg. Han sier at du er nødt til å møte han. Du kan da velge enten ja eller nei. Så langt har jeg kommet, altså til den andre menyen, som jeg nevnte i eksempelet:

 

def meny2():
while True:
	print
	print 'Du kjørte til venstre'
	print 'Vil du stoppe nå, eller kjøre videre?
	print
	choice2 = raw_input('velg: ')
	if choice2 == 'Venstre':
		venstre2()
	elif choice == 'Stopp':
		stopp()
	else:
		print
		print 'feil'

 

 

Men uansett: Jeg håper du vil legge den koden din inn i et eksempel. Jeg er enda ikke proff i Python, så det hadde blitt mye lettere for meg med et eksempel i begynnelsen :p

 

Mvh. Stigah.

Lenke til kommentar

Jeg prøvde litt da jeg sto opp i dag, og kom frem til dette:

 

def valg():
while True:
	print
	print 'Meny 1'
	print
	valg = raw_input('Skriv inn noe: ')
	if valg == 'Ja':
		ja()
	elif valg == 'Nei':
		nei()
	else:
		print '\nDu har skrevet inn feil kommando'

valg()



def ja():
print
print 'test'
class SomeRoad:
	def ja():
		return valg2()  


def valg2():
while True:
	print
	print 'Meny 2'
	print
	valg2 = raw_input('Skriv inn noe: ')
	if valg2 == 'Ja':
		ja2()
	elif valg2 == 'Nei':
		nei2()
	else:
		print '\nDu har skrevet inn feil kommando'


valg2()

 

Altså: Når vi skriver inn Ja, kommer vi til:

 

def ja():
print
print 'test'
class SomeRoad:
	def ja():
		return valg2()

 

Jeg gjorde dette uten hell. Jeg håper jeg kan få en liten forklaring, eller i alle fall et eksempel på hvordan jeg kan gjøre dette :D

 

Mvh. Stigah

Lenke til kommentar
La oss si at vi kjører på en vei i spillet. Så får vi valget om vi vil kjøre til høyre eller til venstre, derreter får vi valget om å stoppe, eller å kjøre videre. Foreløpig ser det sånn ut:

 

There is more than one way to skin a cat...

 

(...)
meny1()

def venstre():
	# (...)
goto meny2()

def meny2():
# (...)
meny2()

 

Mao. du vil en en ikke-lokal goto? Noen språk (deriblant Simula) støtter det, men eh, det byr på en rekke, eh, utfordringer, så la oss heller fokusere på ting som er tilgjengelige i Python.

 

Det kan se litt rotete ut foreløpig. Men det jeg lurte på, var om det fantes en goto kommando.

 

Python har ingen generell goto-setning. Det finnes setninger for å hoppe tilbake til et punkt tidligere i koden (gjennom try-except - som er det nærmeste du kommer en ikke-lokal goto), eller hoppe ut av en løkke eller en funksjon (hhv. break og return).

 

Så... Finnes det noen goto kommandoer i Python? Dette hadde vært til svært nytte.

 

Ja, det ville ha vært veldig nyttig, men goto-setning finnes ikke i Python. Dermed til alternativene:

  • Lage en tilstandsmaskin vha en dict, bruke input som nøkkelen:
     
    states = {"left": go_left, 
    	  "right": go_right,
    	  "stop": stop,}
    while True:
    choice = raw_input("next move:")
    if choice in states:
    	states[choice]()
    else:
    	print "Invalid input <%s>" % choice


     
    go_left, go_right, stop blir da funksjoner som endrer på tilstanden i programmet og utfører handlinger som er ellers knyttet til den spesifikke bevegelsen. Disse kan gjerne være lokale funksjoner (lokale til den "enheten" som inneholder løkken over, eller være metoder.
     

  • Bruke if-else. Det er tross alt ikke så vanskelig:
     
    while True:
    choice = raw_input("next move:")
    if choice == "left":
    	go_left()
    elif choice == "right".
    	go_right()
    # elif ...


Det du ville var:

 

I spillet mitt kjører man en bil. Du blir stoppet av politiet, pga. kollisjon lengre fremme. Politimannen spør da om hvor du skal. Hvis du velger A, sier han kanskje at jeg er nødt til å snu. Hvis jeg velger B, sier han at jeg kan fortsette.

 

Etter en stund ringer en ukjent person til deg. Han sier at du er nødt til å møte han. Du kan da velge enten ja eller nei. Så langt har jeg kommet, altså til den andre menyen (...)

 

Er det nødvendig med goto i det hele tatt? Det ser ut som at interaksjonen med andre elementer bestemmer kjøreretningen. Kanskje løsningen er å lage en eller annen representasjon av de elementene som interagerer (personen som kjører en bil, politiet, ukjent person) -- typisk en rekke klasser -- og så la klassene bestemme selv hvordan de samspiller?

 

class Policeman(object):
# ...

class Player(object):
def __init__(self):
	self.direction = None # left, right, forward, backward, None

def change_direction(self, other):
	if something(self, other):
		self.direction = backward
	elif something_else(self, other):
		self.direction = left
# end Player

# ...
player = Player()
police = Policeman()
mystery_man = ...
if met_policeman():
player.change_direction(police)
elif phone_call(mystery:man):
player.change_direction(mystery_man)

 

something/something_else kan gjerne være metoder, forøvrig. Det blir ingen eksplisitt goto for å hoppe mellom tilstandene, men man vil da heller kalle de passende metodene.

Lenke til kommentar

Tusen, tusen takk zotbar1234. Det var en veldig lærerik post :D

 

Men som sagt; Jeg er nybegynner i python, og lurte derfor på om du kunne vist det i et eksempel :)

 

Jeg prøvde å ta

states = {"left": go_left,
	  "right": go_right,
	  "stop": stop,}
while True:
choice = raw_input("next move:")
if choice in states:
	states[choice]()
else:
	print "Invalid input <%s>" % choice

 

og

while True:
choice = raw_input("next move:")
if choice == "left":
	go_left()
elif choice == "right".
	go_right()
# elif ...

 

sammen, men uten hell.

 

states = {"left": go_left,
	  "right": go_right,
	  "stop": stop,}
while True:
choice = raw_input("next move:")
if choice == "left":
	go_left()
elif choice == "right".
	go_right()
# elif ...

 

 

Men så prøvde jeg meg på koden

states = {"left": go_left,
	  "right": go_right,
	  "stop": stop,}
while True:
choice = raw_input("next move:")
if choice in states:
	states[choice]()
else:
	print "Invalid input <%s>" % choice

 

uten å endre den. Fikk da error meldingen:

, line 1, in <module>

states = {"left": go_left,

NameError: name 'go_left' is not defined

 

Jeg takker enda en gang for en veldig lærerik post :D Jeg kommer nokk til å bruke disse kodene mye, så raskt jeg har lært meg hvordan :p

 

Mvh. Stigah

Lenke til kommentar

Ja har vel hjulpet deg litt med det samme på et annet forum.

Du må nok satse litt mere på dette,og bruke tid på og lære deg deg basic ting om språket.

Nok om det det bare og spørre om hjelp.

 

uten å endre den. Fikk da error meldingen:

Zotbar1234 er gitt deg generelle idèer ikke ferdige script.

 

Kan gi deg noen tips hvordan du kan bryte ned i python shell for og forstå hva som skjer.

Fyr opp python shell skriv eller kopiere inn.

 

>>> # Dette er dicitonary består av <key value>
>>> states = {'left': go_left,
	  'right': go_right,
	  'stop': stop}

Traceback (most recent call last):
 File "<pyshell#131>", line 1, in <module>
states = {'left': go_left,
NameError: name 'go_left' is not defined

>>> # vi får nameError fordi vi ikke har definert go_left,go_rigt,stop
>>> # Test,setter vi inn verdier virker dictionary
>>> states = {'left': 1,
	  'right': 2,
	  'stop': 3}
>>> states
{'right': 2, 'stop': 3, 'left': 1}

# skriver inn key og value blir returnert
>>> states['left']
1
>>> # Vi setter variabler
>>> go_left = 'this way is left'  #kunne ha vært en funksjon go_left()
>>> go_right = 'this way is right'
>>> stop = 'this is stop'
>>> 
>>> # Vi tester igjen
>>> states = {'left': go_left,
	  'right': go_right,
	  'stop': stop}
>>> # ingen nameError feil
>>> states
{'right': 'this way is right', 'stop': 'this is stop', 'left': 'this way is left'}
>>> states['stop']
'this is stop'

>>> type(states)  
<type 'dict'>  # Vi ser at dette er dict objekt(dicionary)

>>> # vi tester noen metoder for dictonary
>>> # Først se hvilken metoder som ligger under states
# dir() er til god hjelp test dette med list,string,integer
se hvilen metoder som ligger under hver(test dem ut)

>>> dir(states)
['__class__', '__cmp__', '__contains__', '__delattr__', '__delitem__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'has_key', 'items', 'iteritems', 'iterkeys', 'itervalues', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']

>>> states.keys()
['right', 'stop', 'left']
>>> states.values()
['this way is right', 'this is stop', 'this way is left']
>>> 
>>> # Vi går videre og ser på bruker input og <if>
>>> choice = raw_input("next move:")
next move:left
>>> choice
'left'
>>> type(choice)
<type 'str'>

>>> # vi ser at bruker input retunerer er string objekt
>>> if choice in states:  #viss 'left' finnes states
states[choice]		#ja viss så returner verdien for 'left'
else:
print 'finnes ikke'

'this way is left'		#ja det virker

 

Dette kan være til meget god help til og forstå hva som skjer i et script.

Du ser live hva som skjer.

Endret av SNIPPSAT
Lenke til kommentar

Tusen takk for det flotte eksempelet SNIPPSAT :D Eller var dette en oppgave? Kopierte den inn i python shell, men får denne error meldingen med en gang:

 

There's an error in your program:

invalid syntax

 

på ordet recent. Derfor lurte jeg på om dette var en oppgave, altså noe jeg var nødt til å løse, eller om dette er et eksempel. Men uansett, takk for hjelpen :D

 

Ja har vel hjulpet deg litt med det samme på et annet forum.

 

Hehe. Du fant ut at det var meg ja? :)

 

Mvh. Stigah

Lenke til kommentar

Python shell må du bare skrive inn 1 og 1 line eller sekvens.

Da får du resultat av hva som returners.

 

Kopirere dette og lim inn,da virker det.

states = {'left': 1,
	  'right': 2,
	  'stop': 3}

States #Samme som print states i et script

<returner dicitonary>

 

Da skjønner du vel opplegget.

 

Dette er en meget bra serie om hvordan man bruker python shell.

Tar for seg basic funksjoner for språket.

 

Mange bra videoer her.

http://showmedo.com/videos/python

 

Byte of python er bra.

http://www.swaroopch.com/notes/Python

Endret av SNIPPSAT
Lenke til kommentar
  • 2 måneder senere...

Usikker på om dette er/var et troll eller om du virkelig ønsket hjelp.

 

Har laget ferdig et fungerende skript som viser hvordan Exceptions virker og hvordan du skal bruke dictionary for å kalle metoder.

 

Man må selvfølgelig ha noe mer som skjer, for eksempel registrer hvor spilleren befinner seg i spillet. Og dermed hvilke muligheter han har for hvor han skal neste gang.

 

import string

# En exception som vi kan bruke hvis spilleren gjør noe som fører til
# at han dør

class Death(Exception):
   def __init__(self, value):
       self.value = value
   def __str__(self):
       return repr(self.value)

# du må definere funksjonene som skal kalles

def go_left():
   print "You turned left"

def go_right():
   print "You turned right"

def stop():
   print "You slow down, and your car stops. It wont start again..."
   raise Death("stopped car") # her provoserer vi en exception, dette
                              # fører til at programmet ditt hopper
                              # ut av while-løkken

states = {"left": go_left,
         "right": go_right,
         "stop": stop,}


try: # imellom try og except kan det raises en exception vi har her
    # definert vår egen exception: Death, som tar dødsårsaken som
    # parameter
    #
    # bare som et eksempel så dør spilleren dersom han stopper bilen
    # ala filmen Speed.

   while True:
       print "Choices: [%s]" % string.join(states.keys(), ", ")
       choice = raw_input("Your next move: ")
       if choice in states:
           states[choice]() # kaller funksjonene i states
       else:
           print "Invalid input <%s>" % choice

except Death as reason:
   print "You died:", reason


print "Game over!"

 

Se pastie for highlighting av koden:

 

http://pastie.org/677992

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...