[LÖST]Spel i Python

Här diskuteras programmering och utveckling
Användarvisningsbild
Antonx9
Inlägg: 33
Blev medlem: 12 jan 2010, 19:39
OS: Kubuntu
Ort: Mölndal

Re: Spel i Python

Inlägg av Antonx9 »

Rasmus skrev:Kan det vara pygame.display.set_caption som du menar med pygame.display.set.caption?
Ja. Tack! ^^
Men

Kod: Markera allt

while cave !="1" and cave ! = "2"
               ^
SyntaxError: invalid syntax
Jag får det här felmeddelandet efter skripten som du rättade. :O

Kod: Markera allt

File "./dodge.py", line 55, in <module>
    pygame.mixer.music.load("Pokeball.mid")
pygame.error: Couldn't read from 'Pokeball.mid'
Neeej~ Jag som trodde allt var klart! ;__;
Användarvisningsbild
Rasmus
Inlägg: 2291
Blev medlem: 07 sep 2006, 18:33
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS
Ort: Svalsta

Re: Spel i Python

Inlägg av Rasmus »

1. Det fattas mellanrum samt ett kolon på slutet, Dessutom fattas indragningar under.
Det blocken bör se ut något såhär

Kod: Markera allt

def chooseCave ():
    cave = ""
    while cave != "1" and cave != "2":
        print("Do you want to enter Cave 1 or 2?")
        cave = input ()
        return cave
2. Ligger Pokeball.mid i samma mapp som dodge.py?
Heter den verkligen Pokeball.mid och inte pokeball.mid eller liknande? (hej != Hej)

Det finns en bra nybörjarguide för python där du kan lära dig syntaxen lite bättre http://wiki.linuxportalen.se/index.php/Bli_ormtjusare

EDIT: Testade koden och hittade lite fler fel.
Först så har du använt input() istället för raw_input() vilket är lite dumt i det här sammanhanget.
Sen har du ett mellanrum mellan ett funktionsnamn och parenteserna.
Du har även stavat fel på randint.

Efter det tror jag koden funkade, även om man kan bli lite irriterad när man trycker y eller skriver yes och koden förväntar sig Y eller Yes. Fixa gärna det också ;)
Användarvisningsbild
Antonx9
Inlägg: 33
Blev medlem: 12 jan 2010, 19:39
OS: Kubuntu
Ort: Mölndal

Re: Spel i Python

Inlägg av Antonx9 »

Rasmus skrev:1. Det fattas mellanrum samt ett kolon på slutet, Dessutom fattas indragningar under.
Det blocken bör se ut något såhär

Kod: Markera allt

def chooseCave ():
    cave = ""
    while cave != "1" and cave != "2":
        print("Do you want to enter Cave 1 or 2?")
        cave = input ()
        return cave
2. Ligger Pokeball.mid i samma mapp som dodge.py?
Heter den verkligen Pokeball.mid och inte pokeball.mid eller liknande? (hej != Hej)

Det finns en bra nybörjarguide för python där du kan lära dig syntaxen lite bättre http://wiki.linuxportalen.se/index.php/Bli_ormtjusare

EDIT: Testade koden och hittade lite fler fel.
Först så har du använt input() istället för raw_input() vilket är lite dumt i det här sammanhanget.
Sen har du ett mellanrum mellan ett funktionsnamn och parenteserna.
Du har även stavat fel på randint.

Efter det tror jag koden funkade, även om man kan bli lite irriterad när man trycker y eller skriver yes och koden förväntar sig Y eller Yes. Fixa gärna det också ;)
Jag fixade det där med Pokeball. Som du sa så låg de inte i samma mapp.

Men jag kopierade din kod men fick felmeddelandet:

Kod: Markera allt

File "./zodiac.py", line 16
    while cave !="1" and cave ! = "2"
                              ^
SyntaxError: invalid syntax
Och, det andra spelet är 90% klart, tror jag...
Jag får inget felmeddelande, men det är bara en svart ruta när spelet startar. ;__; Kan ni hitta några fel i den här koden?

Kod: Markera allt

#!/usr/bin/env python
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("Pokeball Frenzy")
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("Pokeball.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 = (WINDOWWIDTH / 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()

Användarvisningsbild
Rasmus
Inlägg: 2291
Blev medlem: 07 sep 2006, 18:33
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS
Ort: Svalsta

Re: Spel i Python

Inlägg av Rasmus »

1. Kolla igen, du verkar ha probelm med mellanrummen ;)

2. Jag orkar tyvärr inte sätta mig in i koden nu men testa att lägga in lite text i början innan du gör nått annat och se om du får upp den.
Användarvisningsbild
Antonx9
Inlägg: 33
Blev medlem: 12 jan 2010, 19:39
OS: Kubuntu
Ort: Mölndal

Re: Spel i Python

Inlägg av Antonx9 »

Antonx9 skrev:
Rasmus skrev:1. Kolla igen, du verkar ha probelm med mellanrummen ;)

2. Jag orkar tyvärr inte sätta mig in i koden nu men testa att lägga in lite text i början innan du gör nått annat och se om du får upp den.
Heh... fel igen... :P Jag blir helt galen! @_@

Jag orkar inte hitta ett fel som jag inte ens förstår vad som är fel på, så jag får väl vänta... CryingFreeman kanske kommer in. :3
Alleinsora
Inlägg: 378
Blev medlem: 24 maj 2007, 01:53
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS
Ort: Kalmar/Luleå
Kontakt:

Re: Spel i Python

Inlägg av Alleinsora »

Har kört din kod lite stegvis (inte testat bilder och ljud). Det första jag lägger märke till är detta:

Kod: Markera allt

while True:
    # set up the start of the game
    # Lite kod, men ingen väg ut

while True: # the game loop runs while the game part is playing
    ## mer kod
Den första loopen kommer aldrig att ta slut och du kommer alltså aldrig in i "Main loop" Sett till vad den gör så vore det förmodligen lämpligt att göra om den till en funktion som du förslagsvis döper till "initiera" eller något liknande.

Dock får jag upp den röda texten på min svarta ruta när jag testkör så det låter som att det är något skumt med inläsningen av bilder och ljud. Men du borde ju fått ett felmeddelande då. Men testa det jag nämnde först och se om det blir bättre.
Hur jag än gör så slutar det alltid med E17 på netbooken....
Användarvisningsbild
Antonx9
Inlägg: 33
Blev medlem: 12 jan 2010, 19:39
OS: Kubuntu
Ort: Mölndal

Re: Spel i Python

Inlägg av Antonx9 »

Alleinsora skrev:Har kört din kod lite stegvis (inte testat bilder och ljud). Det första jag lägger märke till är detta:

Kod: Markera allt

while True:
    # set up the start of the game
    # Lite kod, men ingen väg ut

while True: # the game loop runs while the game part is playing
    ## mer kod
Den första loopen kommer aldrig att ta slut och du kommer alltså aldrig in i "Main loop" Sett till vad den gör så vore det förmodligen lämpligt att göra om den till en funktion som du förslagsvis döper till "initiera" eller något liknande.

Dock får jag upp den röda texten på min svarta ruta när jag testkör så det låter som att det är något skumt med inläsningen av bilder och ljud. Men du borde ju fått ett felmeddelande då. Men testa det jag nämnde först och se om det blir bättre.
Aha! ... så hur ska jag ändra på koden...? xP
Alleinsora
Inlägg: 378
Blev medlem: 24 maj 2007, 01:53
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS
Ort: Kalmar/Luleå
Kontakt:

Re: Spel i Python

Inlägg av Alleinsora »

Lättast är att helt sonika ta bort det första while True; demonstrerar:

Kod: Markera allt

while True:
    # set up the start of the game
    baddies = []
    score = 0
    playerRect.topleft = (WINDOWWIDTH / 2, WINDOWHEIGHT - 50)
    moveLeft = moveRight = moveUp = moveDown = False
    reverseCheat = slowCheat = False
    baddieAddCounter = 0
    pygame.mixer.music.play(-1, 0.0)
blir istället

Kod: Markera allt

# set up the start of the game
baddies = []
score = 0
playerRect.topleft = (WINDOWWIDTH / 2, WINDOWHEIGHT - 50)
moveLeft = moveRight = moveUp = moveDown = False
reverseCheat = slowCheat = False
baddieAddCounter = 0
pygame.mixer.music.play(-1, 0.0)
Passade på att kolla lite till i koden, tror att du behöver plocka ut koden från rad 272 och neråt in till kanten. Som det är nu ingår det i Main-loopen. (från “# Stop the game and show the "Game Over" screen.”)

Precis hemkommen från konsert så det kan hända att jag missar något...
Hur jag än gör så slutar det alltid med E17 på netbooken....
Användarvisningsbild
Antonx9
Inlägg: 33
Blev medlem: 12 jan 2010, 19:39
OS: Kubuntu
Ort: Mölndal

Re: Spel i Python

Inlägg av Antonx9 »

Fast det blir fel när jag tar bort While True...;

Kod: Markera allt

  File "./dodge.py", line 71
    baddies = []
    ^
IndentationError: unexpected indent
Och vad ska jag ta bort på den andra raden du nämnde? :3
Användarvisningsbild
barzam
Inlägg: 504
Blev medlem: 14 feb 2009, 09:36
OS: Arch Linux
Ort: Stockholm

Re: Spel i Python

Inlägg av barzam »

Hittade just den här boken när jag slötittade lite på scribd, täntke jag skulle posta den eftersom den är lite relevant ändå :)

http://inventwithpython.com/index.html
Användarvisningsbild
Antonx9
Inlägg: 33
Blev medlem: 12 jan 2010, 19:39
OS: Kubuntu
Ort: Mölndal

Re: Spel i Python

Inlägg av Antonx9 »

barzam skrev:Hittade just den här boken när jag slötittade lite på scribd, täntke jag skulle posta den eftersom den är lite relevant ändå :)

http://inventwithpython.com/index.html
*skratt* ;D
Det är såklart INTE just den boken jag använde som grund... ::)
Alleinsora
Inlägg: 378
Blev medlem: 24 maj 2007, 01:53
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS
Ort: Kalmar/Luleå
Kontakt:

Re: Spel i Python

Inlägg av Alleinsora »

Antonx9 skrev:Fast det blir fel när jag tar bort While True...;

Kod: Markera allt

  File "./dodge.py", line 71
    baddies = []
    ^
IndentationError: unexpected indent
Och vad ska jag ta bort på den andra raden du nämnde? :3
Du glömde ta bort indenteringen. Som du ser i kodstyckena ovan så flyttas hela blocket med kod in till kanten när jag tar bort loopen. Samma sak bör du göra på allt nedanför rad 272. Om du använder Gedit för din kodning gör du detta lättast genom att markera alla berörda rader och trycka [shift]+[tab] tills rad 272 står vid kanten.
Hur jag än gör så slutar det alltid med E17 på netbooken....
Användarvisningsbild
Antonx9
Inlägg: 33
Blev medlem: 12 jan 2010, 19:39
OS: Kubuntu
Ort: Mölndal

Re: Spel i Python

Inlägg av Antonx9 »

Alleinsora skrev:
Antonx9 skrev:Fast det blir fel när jag tar bort While True...;

Kod: Markera allt

  File "./dodge.py", line 71
    baddies = []
    ^
IndentationError: unexpected indent
Och vad ska jag ta bort på den andra raden du nämnde? :3
Du glömde ta bort indenteringen. Som du ser i kodstyckena ovan så flyttas hela blocket med kod in till kanten när jag tar bort loopen. Samma sak bör du göra på allt nedanför rad 272. Om du använder Gedit för din kodning gör du detta lättast genom att markera alla berörda rader och trycka [shift]+[tab] tills rad 272 står vid kanten.
Aaah! Tack! :)
Men det är fortfarande bara en svart skärm... T_T
Jag tror att du sa att du fick upp lite röd text på skärmen? Tar det en stund för den att ladda eller?
Användarvisningsbild
Antonx9
Inlägg: 33
Blev medlem: 12 jan 2010, 19:39
OS: Kubuntu
Ort: Mölndal

Re: Spel i Python

Inlägg av Antonx9 »

Antonx9 skrev: Men det är fortfarande bara en svart skärm... T_T
Jag tror att du sa att du fick upp lite röd text på skärmen? Tar det en stund för den att ladda eller?
Har fortfarande det problemet...

Och när jag körde det andra spelet; 'zodiac.py', så fixade jag lite saker, och spelet fungerade i början. Men när man kom till stället där man skulle välja grotta fastnade det;

Kod: Markera allt

  File "./zodiac.py", line 46, in <module>
    caveNumber = chooseCave()
  File "./zodiac.py", line 21, in chooseCave
    cave = input()
  File "<string>", line 1
    cave 2
   ^
SyntaxError: unexpected EOF while parsing

Det meddelandet fick jag efter en stund. T_T
Alleinsora
Inlägg: 378
Blev medlem: 24 maj 2007, 01:53
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS
Ort: Kalmar/Luleå
Kontakt:

Re: Spel i Python

Inlägg av Alleinsora »

Antonx9 skrev: Men det är fortfarande bara en svart skärm... T_T
Jag tror att du sa att du fick upp lite röd text på skärmen? Tar det en stund för den att ladda eller?
Det tar kanske en sekund för mig att komma till det läget som skärmdumpen jag bifogar visar. Resten av programmet har jag inte testat. Men generellt känns det som att det är indenteringen som spökar. Försök kolla igenom vad som tillhör vad, jag har tyvärr inte riktigt tid att sätta mig in i koden innan nyår och då är det ju lite sent.
Bilagor
scrot.png
scrot.png (9.17 KiB) Visad 2470 gånger
Hur jag än gör så slutar det alltid med E17 på netbooken....
Användarvisningsbild
Antonx9
Inlägg: 33
Blev medlem: 12 jan 2010, 19:39
OS: Kubuntu
Ort: Mölndal

Re: Spel i Python

Inlägg av Antonx9 »

Alleinsora skrev:
Antonx9 skrev: Men det är fortfarande bara en svart skärm... T_T
Jag tror att du sa att du fick upp lite röd text på skärmen? Tar det en stund för den att ladda eller?
Det tar kanske en sekund för mig att komma till det läget som skärmdumpen jag bifogar visar. Resten av programmet har jag inte testat. Men generellt känns det som att det är indenteringen som spökar. Försök kolla igenom vad som tillhör vad, jag har tyvärr inte riktigt tid att sätta mig in i koden innan nyår och då är det ju lite sent.
;__;

Konstigt att det inte dyker upp för mig...
Intentering? :O
Alleinsora
Inlägg: 378
Blev medlem: 24 maj 2007, 01:53
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS
Ort: Kalmar/Luleå
Kontakt:

Re: Spel i Python

Inlägg av Alleinsora »

Antonx9 skrev: Intentering? :O
Indenteringen är de mellanslag som styr vad som tillhör loopar och satser. På sätt och vis motsvaras de av '{' i C. Där tillhör ju allt mellan '{' och '}' samma block. I python är det allt som har samma avstånd till kanten som hör ihop.
Hur jag än gör så slutar det alltid med E17 på netbooken....
Användarvisningsbild
CryingFreeman
Inlägg: 2817
Blev medlem: 29 aug 2007, 22:32
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS
Ort: Östersund

Re: Spel i Python

Inlägg av CryingFreeman »

Antonx9 skrev:
*skratt* ;D
Det är såklart INTE just den boken jag använde som grund... ::)
Utanför ämnet: Ironi är en av de sakerna som ibland inte framgår klart och tydligt i forumtext. ;) Jag trodde att du var allvarlig...

Om du tittar i början av den boken så ser du att den använder sig av python 3.x vilket kan förklara en del av felen.

Dessutom har du ett underbart felsökningshjälpmedel på http://inventwithpython.com/diff/ där du kan kolla precis de övningarna mot din egen kod.

Om du vill installera python 3.x kan du köra kommandot

Kod: Markera allt

sudo apt-get install python3
Jag tror att det kan existera vid sidan av python 2.x, men jag är inte 100% säker.
Registrera dig på våra lokala epostlistor
Användarvisningsbild
Antonx9
Inlägg: 33
Blev medlem: 12 jan 2010, 19:39
OS: Kubuntu
Ort: Mölndal

Re: Spel i Python

Inlägg av Antonx9 »

CryingFreeman skrev:
Antonx9 skrev:
*skratt* ;D
Det är såklart INTE just den boken jag använde som grund... ::)
Utanför ämnet: Ironi är en av de sakerna som ibland inte framgår klart och tydligt i forumtext. ;) Jag trodde att du var allvarlig...

Om du tittar i början av den boken så ser du att den använder sig av python 3.x vilket kan förklara en del av felen.

Dessutom har du ett underbart felsökningshjälpmedel på http://inventwithpython.com/diff/ där du kan kolla precis de övningarna mot din egen kod.

Om du vill installera python 3.x kan du köra kommandot

Kod: Markera allt

sudo apt-get install python3
Jag tror att det kan existera vid sidan av python 2.x, men jag är inte 100% säker.
XD

Tack. Ska pröva det... när jag bootar om till Linux nästa gång... orkar inte starta om datorn nu. :P
Användarvisningsbild
Antonx9
Inlägg: 33
Blev medlem: 12 jan 2010, 19:39
OS: Kubuntu
Ort: Mölndal

Re: Spel i Python

Inlägg av Antonx9 »

Ska vi se nu... det var ingen stor skillnad med Python 3 installerad, och det var ett bra verktyg det där med jämförelsen. Men de enda "felen" jag hittade när jag jämförde var att jag hade andra färger eller " i stället för '.
Skriv svar

Återgå till "Programmering och webbdesign"