Sida 1 av 3
[LÖST]Spel i Python
Postat: 05 dec 2010, 14:51
av Antonx9
Min storebror önskade sig några spel som jag hade programmerat i python. (Jag tycker då att det är för mycket att vänta sig från en 12-åring... >_<)
Så jag gjorde två spel, som jag är 99% säker på att det inte finns några fel på.
Så jag skulle köra .py-filerna i terminalen... men då fick jag felmeddelandet:
Kod: Markera allt
python: can't open file './Zodiac': [Errno 2] No such file or directory
Jag är säker på att filen har exakt det namnet. Jag gick in på internet för att söka efter samma felmeddelande, men inget hjälpte.
Så har någo nsvaret på frågan?
Tack i förväg.
Re: Spel i Python
Postat: 05 dec 2010, 16:51
av Rasmus
Stora/små bokstäver?
Annars skulle det vara lättare att svara med en bättre beskrivning.
Exakt vad försöker du göra och hur ser koden ut?
Re: Spel i Python
Postat: 05 dec 2010, 16:59
av pun
Jag skulle starkt misstänka att filen inte är körbar.
Bara att högerklicka på den och bocka i att den ska vara det under rättighetsfliken.
Re: Spel i Python
Postat: 05 dec 2010, 17:05
av Antonx9
Kod: Markera allt
import pygame, random, sys
from pygame.locals import *
WINDOWWIDTH = 600
WINDOWHEIGHT = 600
TEXTCOLOR = (255, 0, 0)
BACKGROUNDCOLOR = (255, 255, 255)
FPS = 40
BADDIEMINSIZE = 10
BADDIEMAXSIZE = 40
BADDIEMINSPEED = 1
BADDIEMAZSPEED = 8
ADDNEWBADDIERATE = 6
PLAYERMOVERATE = 5
def terminate ():
pygame.quit()
sys.exit()
def waitForPlayerToPressKey():
while True:
for event in pygame.event.get():
if event.type == QUIT:
terminate()
if event.type == KEYDOWN:
if event.key == K_ESCAPE: # pressing escape quits
terminate ()
return
def playerHasHitBaddie (playerRect, baddies):
for b in baddies:
if playerRect.colliderect(b["rect"]):
return True
return False
def drawText (text, font, surface, x, y):
textobj = font.render(text, 1 TEXTCOLOR)
textrect = textobj.get_rect()
textrect.topleft = (x, y)
surface.blit(textobj, textrect)
# set up pygame, the window, and the mouse cursor
pygame.init()
mainClock = pygame.time.Clock()
windowSurface = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))
pygame.display.set.caption("Pokéball")
pygame.mouse.set_visible(False)
# set up fonts
font = pygame.font.SysFont (None, 48)
# set up sounds
gameOverSound = pygame.mixer.Sound("Pika.wav")
pygame.mixer.music.load("Pokéball.mp3")
# set up images
playerImage = pygame.image.load("pikachu.png")
playerRect = playerImage.get_rect()
baddieImage = pygame.image.load("baddie.jpeg")
# show the "Start" screen
drawText("Dodger", font, windowSurface, (WINDOWWIDTH / 3), (WINDOWHEIGHT / 3))
drawText("Press a key to start.", font, windowSurface, (WINDOWWIDTH / 3) - 30, (WINDOWHEIGHT / 3) + 50)
pygame.display.update()
waitForPlayerToPressKey()
topScore = 0
while True:
# set up the start of the game
baddies = []
score = 0
playerRect.topleft = (WÍNDOWWIDTH / 2, WINDOWHEIGHT - 50)
moveLeft = moveRight = moveUp = moveDown = False
reverseCheat = slowCheat = False
baddieAddCounter = 0
pygame.mixer.music.play(-1, 0.0)
while True: # the game loop runs while the game part is playing
score += 1 # increase score
for event in pygame.event.get():
if event.type == QUIT:
terminate()
if event.type == KEYDOWN:
if event.key == ord("z"):
reverseCheat = True
if event.key == ord("x"):
slowCheat = True
if event.key == K_LEFT or event.key == ord("a"):
moveRight = False
moveLeft = True
if event.key == K_RIGHT or event.key == ord('d'):
moveLeft = False
moveRight = True
if event.key == K_UP or event.key == ord('w'):
moveDown = False
moveUp = True
if event.key == K_DOWN or event.key == ord('s'):
moveUp = False
moveDown = True
if event.type == KEYUP:
if event.key == ord('z'):
reverseCheat = False
score = 0
if event.key == ord('x'):
slowCheat = False
score = 0
if event.key == K_ESCAPE:
terminate()
if event.key == K_LEFT or event.key == ord('a'):
moveLeft = False
if event.key == K_RIGHT or event.key == ord('d'):
moveRight = False
if event.key == K_UP or event.key == ord('w'):
moveUp = False
if event.key == K_DOWN or event.key == ord('s'):
moveDown = False
if event.type == MOUSEMOTION:
# If the mouse moves, move the player where the cursor is.
playerRect.move_ip(event.pos[0] - playerRect.centerx, event.pos[1] - playerRect.centery)
# Add new baddies at the top of the screen, if needed.
if not reverseCheat and not slowCheat:
baddieAddCounter += 1
if baddieAddCounter == ADDNEWBADDIERATE:
baddieAddCounter = 0
baddieSize = random.randint(BADDIEMINSIZE, BADDIEMAXSIZE)
newBaddie = {'rect': pygame.Rect(random.randint(0, WINDOWWIDTH-baddieSize), 0 - baddieSize, baddieSize, baddieSize),
'speed': random.randint(BADDIEMINSPEED, BADDIEMAXSPEED),
'surface':pygame.transform.scale(baddieImage, (baddieSize, baddieSize)),
}
baddies.append(newBaddie)
# Move the player around.
if moveLeft and playerRect.left > 0:
playerRect.move_ip(-1 * PLAYERMOVERATE, 0)
if moveRight and playerRect.right < WINDOWWIDTH:
playerRect.move_ip(PLAYERMOVERATE, 0)
if moveUp and playerRect.top > 0:
playerRect.move_ip(0, -1 * PLAYERMOVERATE)
if moveDown and playerRect.bottom < WINDOWHEIGHT:
playerRect.move_ip(0, PLAYERMOVERATE)
# Move the mouse cursor to match the player.
pygame.mouse.set_pos(playerRect.centerx, playerRect.centery)
# Move the baddies down.
for b in baddies:
if not reverseCheat and not slowCheat:
b['rect'].move_ip(0, b['speed'])
elif reverseCheat:
b['rect'].move_ip(0, -5)
elif slowCheat:
b['rect'].move_ip(0, 1)
# Delete baddies that have fallen past the bottom.
for b in baddies[:]:
if b['rect'].top > WINDOWHEIGHT:
baddies.remove(b)
# Draw the game world on the window.
windowSurface.fill(BACKGROUNDCOLOR)
# Draw the score and top score.
drawText('Score: %s' % (score), font, windowSurface, 10, 0)
drawText('Top Score: %s' % (topScore), font, windowSurface, 10, 40)
# Draw the player's rectangle
windowSurface.blit(playerImage, playerRect)
# Draw each baddie
for b in baddies:
windowSurface.blit(b['surface'], b['rect'])
pygame.display.update()
# Check if any of the baddies have hit the player.
if playerHasHitBaddie(playerRect, baddies):
if score > topScore:
topScore = score # set new top score
break
mainClock.tick(FPS)
# Stop the game and show the "Game Over" screen.
pygame.mixer.music.stop()
gameOverSound.play()
drawText('GAME OVER', font, windowSurface, (WINDOWWIDTH / 3), (WINDOWHEIGHT / 3))
drawText('Press a key to play again.', font, windowSurface, (WINDOWWIDTH / 3) - 80, (WINDOWHEIGHT / 3) + 50)
pygame.display.update()
waitForPlayerToPressKey()
gameOverSound.stop()
Är koden för det ena spelet.
Re: Spel i Python
Postat: 05 dec 2010, 17:17
av CryingFreeman
I källkoden ovan saknar jag den klassiska raden
så den bör du lägga till på första raden i filen.
Är Zodiac namnet på filen du nyss klistrat in här?
Jag är inte helt hundra på om det spelar någon roll, men prova att döpa om den till
zodiac.py med
i katalogen där filen ligger. Sen kör du den med
Re: Spel i Python
Postat: 05 dec 2010, 18:05
av Antonx9
CryingFreeman skrev:I källkoden ovan saknar jag den klassiska raden
så den bör du lägga till på första raden i filen.
Är Zodiac namnet på filen du nyss klistrat in här?
Jag är inte helt hundra på om det spelar någon roll, men prova att döpa om den till
zodiac.py med
i katalogen där filen ligger. Sen kör du den med
Ok, tack. Ska ändra på första raden senare, när jag har tid.
Verkar inte fungera med att byta namnet. :/
Re: Spel i Python
Postat: 05 dec 2010, 18:25
av CryingFreeman
Antonx9 skrev:
Ok, tack. Ska ändra på första raden senare, när jag har tid.
Verkar inte fungera med att byta namnet. :/
Näe, lägger du inte till
i toppen på filen så förstår inte Python att det är en fil som är skriven för att köras med Python.
Om du skriver in det på första raden i filen, kan du sedan göra den körbar antingen genom att göra som pun tipsar om ovan, eller genom att skriva
i terminalfönstret vilket sätter flaggan för att filen zodiac.py ska anses vara en e
xekverbar (körbar) fil.
Sen kan du köra den genom att skriva
under förutsättning att du står i den katalog där filen finns förstås.

Re: Spel i Python
Postat: 05 dec 2010, 20:45
av Antonx9
Det funkar nu! Tack! ^^
Fast ett problem återstår... jag får felmeddelandet
Kod: Markera allt
baddies = []
^
IndentationError: expected an indented block
Och samma felmeddelande på ett annat spel. Undrar bara vad det betyder.

Re: Spel i Python
Postat: 05 dec 2010, 21:00
av CryingFreeman
Python är rätt kinkigt med i vilken "nivå" kodraderna finns. Problemet skulle jag tro är här:
Kod: Markera allt
while True:
# set up the start of the game
baddies = []
score = 0
playerRect.topleft = (WÍNDOWWIDTH / 2, WINDOWHEIGHT - 50)
moveLeft = moveRight = moveUp = moveDown = False
reverseCheat = slowCheat = False
baddieAddCounter = 0
pygame.mixer.music.play(-1, 0.0)
while True: # the game loop runs while the game part is playing
Eftersom
while True: initierar ett loop-block, måste du indentera (dvs. urskilja blocket från resten av programmet med hjälp av ett antal mellanslag). Såhär:
Kod: Markera allt
while True:
# set up the start of the game
baddies = []
score = 0
playerRect.topleft = (WÍNDOWWIDTH / 2, WINDOWHEIGHT - 50)
moveLeft = moveRight = moveUp = moveDown = False
reverseCheat = slowCheat = False
baddieAddCounter = 0
pygame.mixer.music.play(-1, 0.0)
while True: # the game loop runs while the game part is playing
Jag har inte analyserat koden i övrigt, så jag vet inte om det löser problemet helt, men det är en början i alla fall.

Re: Spel i Python
Postat: 05 dec 2010, 21:04
av Antonx9
Du är verkligen en stor hjälp! ^^
Min bror får nog sin julklapp innan jag blir helt less på python. xD
Det här då?
Kod: Markera allt
if event.key == K_UP or event.key == ord('w'):
^
IndentationError: unindent does not match any outer indentation level
EDIT: Fast 'print' har väl inget med loops att göra... eller?
Kod: Markera allt
print("You are in the sacred lands of YinYang.")
^
IndentationError: expected an indented block
Re: Spel i Python
Postat: 05 dec 2010, 21:15
av CryingFreeman
Antonx9 skrev:Du är verkligen en stor hjälp! ^^
Min bror får nog sin julklapp innan jag blir helt less på python. xD
Det här då?
Kod: Markera allt
if event.key == K_UP or event.key == ord('w'):
^
IndentationError: unindent does not match any outer indentation level

Kolla på de andra
if event.key-raderna (specifikt de tre översta). Låt de andra ligga i linje med dem. Detsamma gäller
moveRight och de andra. De ska också ligga på samma nivå som i de tre första if-satserna.
Re: Spel i Python
Postat: 05 dec 2010, 21:18
av Antonx9
CryingFreeman skrev:Antonx9 skrev:Du är verkligen en stor hjälp! ^^
Min bror får nog sin julklapp innan jag blir helt less på python. xD
Det här då?
Kod: Markera allt
if event.key == K_UP or event.key == ord('w'):
^
IndentationError: unindent does not match any outer indentation level

Kolla på de andra
if event.key-raderna (specifikt de tre översta). Låt de andra ligga i linje med dem. Detsamma gäller
moveRight och de andra. De ska också ligga på samma nivå som i de tre första if-satserna.
ÅÅÅH! Du är verkligen till stor hjälp! Nu återstår bara en sak, tror jag, för ett fönster dyker upp... fast det försvinner sen... >_>
Kod: Markera allt
File "./dodge.py", line 47, in <module>
pygame.display.set.caption("Pokeball Frenzy")
AttributeError: 'module' object has no attribute 'set'
Och om du kan kolla på min edit av min förra post. :3 Tack!
Re: Spel i Python
Postat: 05 dec 2010, 21:30
av CryingFreeman
Om vi tar detta som exempel:
Kod: Markera allt
if apa == True: <---- Början på villkorssatsen (om apa = sant, utför detta)
print "Apa!"
a = a + b <--- slut på villkorssatsen
print "Blaha"
Jämför det med
Kod: Markera allt
if apa == True: <---- Början på villkorssatsen (om apa = sant, utför detta)
print "Apa!" <--- slut på villkorssatsen
a = a + b
print "Blaha"
I första fallet är
a = a + b en del av det som ska utföras om
apa = True. Om apa = True skrivs alltså "Apa!" ut på skärmen, sen utförs a = a + b. Sen avslutas villkorssatsen.
I andra fallet utvärderas det om
apa = True, sen skrivs "Apa!" ut på skärmen, sen avslutas villkorssatsen.
i fall nummer två utförs alltså
a = a + b oavsett om
apa = True eller inte
Hajaru?
Re: Spel i Python
Postat: 05 dec 2010, 21:34
av Antonx9
Umm... kanske 30% av det där... sorry...

Men jag förstår inte det där med loopen...
Antonx9 skrev:Du är verkligen en stor hjälp! ^^
Min bror får nog sin julklapp innan jag blir helt less på python. xD
Det här då?
EDIT: Fast 'print' har väl inget med loops att göra... eller?
Kod: Markera allt
print("You are in the sacred lands of YinYang.")
^
IndentationError: expected an indented block
Kod: Markera allt
File "./dodge.py", line 47, in <module>
pygame.display.set.caption("Pokeball Frenzy")
AttributeError: 'module' object has no attribute 'set'
Jag fattar verkligen inte det sista. T_T
Re: Spel i Python
Postat: 05 dec 2010, 21:48
av CryingFreeman
Näe, print har inget med loopar att göra. Men en print-sats kan vara en
del av en loop.
För att göra en villkorssats eller en loop i python måste du använda space eller tab för att avgränsa villkorssatsen eller loopen från resten av programmet.
Jag rekommenderar lite läsning.
http://wiki.linuxportalen.se/index.php/ ... med_Python
Vi börjar med en Loop
Kod: Markera allt
sålänge deltagare är fler än två
gör detta
och detta
och detta
och till och med detta
men inte detta för nu är loopen slut
Här avgränsar man vad som ska göras i loopen med fyra mellanslag innan raden börjar. Om jag lägger in en rad utan fyra mellanslag, som jag gjort där det står "men inte detta för nu är loopen slut", då tolkar python det som att detta inte är en del av loopen.
Villkorssats
Kod: Markera allt
Om tangentnedtryckning är likamed R
Skriv ut R på skärmen
Skicka mig bakåt i tiden
Om tangentnedtryckning är likamed F
Skriv ut F på skärmen
Skicka mig framåt i tiden
Annars
Skriv ut "Jag trivs bättre här!"
Fortsätt programmet
Här utvärderas tangentnedtryckningar. Om jag trycker R händer en sak, om jag trycker F händer en annan och om jag inte gör något så skrivs "Jag trivs bättre här!" ut. Sen fortsätter programmet.
Sen kan man ha villkor inuti en loop, och det är då det blir lite knivigt med mellanslagen.
Kod: Markera allt
sålänge deltagare är fler än två
gör detta
och detta
och detta
och till och med detta
Om tangentnedtryckning är likamed R
Skriv ut R på skärmen <---- Notera den ytterligare nivån här
Skicka mig bakåt i tiden
Om tangentnedtryckning är likamed F
Skriv ut F på skärmen
Skicka mig framåt i tiden
Annars
Skriv ut "Jag trivs bättre här!"
Fortsätt programmet
men inte detta för nu är loopen slut
Re: Spel i Python
Postat: 05 dec 2010, 21:51
av Antonx9
Aha! Jag ska testa... men vet du något om den sista koden jag postade?
EDIT: Åååh! Jag dör snart! xD Det här kommer jag aldrig att göra igen... tror jag...
Koden för spelet:
Kod: Markera allt
#!/usr/bin/env python
name = raw_input("Please enter your name: ")
print "Welcome!"
import random
import time
def displayIntro():
print("You are in the sacred lands of YinYang.")
print("The Holy Zodiac Stone, that you're looking for is hidden, deep in")
print("the Maze of Hamon.")
print("You see two ways leading into the maze.")
print()
def chooseCave ()
cave = ""
while cave !="1" and cave != "2"
print("Do you want to enter Cave 1 or 2?")
cave = input ()
return cave
def checkCave (chosenCave):
print("You enter the cave slowly...")
time.sleep(2)
print("It's dark and you cannot see anything...")
time.sleep(2)
print("Suddenly, a trap opens underneath you. You fall into the pit and...")
print()
time.sleep(2)
friendlyCave = random.radint (1, 2)
if chosenCave == str (friendlyCave):
print("you see the little Zodiac Stone glimmering on an altar.")
else:
print("you fall down in the hot lava.")
playAgain = "Yes"
while playAgain == "Yes" or playAgain == "Y":
displayIntro()
caveNumber = chooseCave()
checkCave (caveNumber)
print("Do you want to play again? (Yes or No))"
playAgain = input()
Kan du hitta några fel?
Re: Spel i Python
Postat: 05 dec 2010, 22:45
av Rasmus
Hur var det med indragningarna?
Kod: Markera allt
#!/usr/bin/env python
import random
import time
name = raw_input("Please enter your name: ")
print "Welcome!"
def displayIntro():
print("You are in the sacred lands of YinYang.")
print("The Holy Zodiac Stone, that you're looking for is hidden, deep in")
print("the Maze of Hamon.")
print("You see two ways leading into the maze.")
print()
def chooseCave ():
cave = ""
while cave !="1" and cave != "2"
print("Do you want to enter Cave 1 or 2?")
cave = input ()
return cave
def checkCave (chosenCave):
print("You enter the cave slowly...")
time.sleep(2)
print("It's dark and you cannot see anything...")
time.sleep(2)
print("Suddenly, a trap opens underneath you. You fall into the pit and...")
print()
time.sleep(2)
friendlyCave = random.radint (1, 2)
if chosenCave == str (friendlyCave):
print("you see the little Zodiac Stone glimmering on an altar.")
else:
print("you fall down in the hot lava.")
playAgain = "Yes"
while playAgain == "Yes" or playAgain == "Y":
displayIntro()
caveNumber = chooseCave()
checkCave (caveNumber)
print("Do you want to play again? (Yes or No))"
playAgain = input()
Dessutom hade du glömt kolon efter def chooseCave ()
Man brukar även lägga includes högst upp i koden.
Sen undrar jag om det verkligen ska vara mellanslag efter funktionsnamn, men det var längesedan jag knackade Python så jag är inte 100.
Re: Spel i Python
Postat: 05 dec 2010, 22:56
av CryingFreeman
Rasmus skrev:
Sen undrar jag om det verkligen ska vara mellanslag efter funktionsnamn, men det var längesedan jag knackade Python så jag är inte 100.
Nope.
ska vara
och så vidare.
Re: Spel i Python
Postat: 05 dec 2010, 23:21
av Antonx9
OK. Ska testa imorgon.

Tack! ^^
Men vet ni något om:
Antonx9 skrev:
Kod: Markera allt
File "./dodge.py", line 47, in <module>
pygame.display.set.caption("Pokeball Frenzy")
AttributeError: 'module' object has no attribute 'set'
Jag fattar verkligen inte det sista. T_T[/quote]
?
Re: Spel i Python
Postat: 05 dec 2010, 23:46
av Rasmus
Kan det vara pygame.display.set_caption som du menar med pygame.display.set.caption?