Stigah Skrevet 23. august 2009 Del Skrevet 23. august 2009 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
terjeelde Skrevet 23. august 2009 Del Skrevet 23. august 2009 Finnes det noen goto kommandoer i Python? Nei, heldigvis ikke. Lenke til kommentar
Stigah Skrevet 23. august 2009 Forfatter Del Skrevet 23. august 2009 Da må du fortelle meg hvorfor dette er en negativ ting Finnes det noen andre måter jeg kan gjøre dette på? Lenke til kommentar
terjeelde Skrevet 23. august 2009 Del Skrevet 23. august 2009 Da må du fortelle meg hvorfor dette er en negativ ting 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
Stigah Skrevet 23. august 2009 Forfatter Del Skrevet 23. august 2009 Tusen, tusen takk terjeelde (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 Mvh. Stigah. Lenke til kommentar
Stigah Skrevet 23. august 2009 Forfatter Del Skrevet 23. august 2009 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 Mvh. Stigah Lenke til kommentar
zotbar1234 Skrevet 23. august 2009 Del Skrevet 23. august 2009 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
Stigah Skrevet 23. august 2009 Forfatter Del Skrevet 23. august 2009 Tusen, tusen takk zotbar1234. Det var en veldig lærerik post 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 Jeg kommer nokk til å bruke disse kodene mye, så raskt jeg har lært meg hvordan Mvh. Stigah Lenke til kommentar
snippsat Skrevet 23. august 2009 Del Skrevet 23. august 2009 (endret) 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 23. august 2009 av SNIPPSAT Lenke til kommentar
Stigah Skrevet 23. august 2009 Forfatter Del Skrevet 23. august 2009 Tusen takk for det flotte eksempelet SNIPPSAT 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 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
snippsat Skrevet 23. august 2009 Del Skrevet 23. august 2009 (endret) 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 23. august 2009 av SNIPPSAT Lenke til kommentar
footnote Skrevet 31. oktober 2009 Del Skrevet 31. oktober 2009 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
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå