2016-07-21 14 views
-3

Ich habe dieses ausweichende Aliens-Spiel und es funktioniert nicht. Ich kann den Front-Start-Bildschirm öffnen, aber dann, wenn ich Enter drücke, um zu starten, stürzt es ab und friert ein. Ich habe versucht, es von python.exe anstelle von nur IDLE auszuführen, aber in diesem Fall erscheint es einfach und schließt dann ganz rechts. In den ersten paar Malen, in denen ich versucht habe, es zu starten, sind ein paar Fehler aufgetaucht, aber jetzt gibt es keine Fehler, die anzeigen, was falsch ist. Es reagiert nur nicht mehr. Was mache ich hier falsch?Pygame stürzt ab, wenn ich es öffne

import pygame, random, sys 
from pygame.locals import * 


def startGame(): 
    if event.type == K_ENTER: 
     if event.key == K_ESCAPE: 
      sys.exit() 
     return 

def playerCollision(): 
    for a in aliens: 
     if playerRect.colliderect(b['rect']): 
      return True 
    return False 

pygame.init() 

screen = pygame.display.set_mode((750,750)) 
clock = pygame.time.Clock() 
pygame.display.set_caption('Dodge the Aliens') 

font = pygame.font.SysFont(None, 55) 

playerImage = pygame.image.load('') 
playerRect = playerImage.get_rect() 
alienImage = pygame.image.load('') 

drawText('Dodge the Aliens!', font, screen, (750/3), (750/3)) 
drawText('Press ENTER to start.', font, screen, (750/3) - 45, (750/3) + 65) 
pygame.display.update() 

topScore = 0 
while True: 
    aliens = [] 
    score = 0 
    playerRect.topleft = (750 /2, 750 - 50) 
    alienAdd = 0 
    while True: 
     score += 1 
     pressed = pygame.key.get_pressed() 
     if pressed[pygame.K_LEFT]: x -=3 
     if pressed[pygame.K_RIGHT]: x += 3 
     if pressed[pygame.K_ESCAPE]: sys.exit() 
    alienAdd += 1 

    if alienAdd == addedaliens: 
     aliendAdd = 0 
     alienSize = random.randint(10, 40) 
     newAlien = {'rect': pygame.Rect(random.randint(0, 750 - alienSize), 0 -alienSize, alienSize, alienSize), 'speed': random.randint(1, 8), 'surface':pygame.transform.scale(alienImage, (alienSize, alienSize)), } 
     aliens.append(newAlien) 
    for a in aliens[:]: 
     if a['rect'].top > 750: 
      aliens.remove(a) 
    screen.fill(0,0,0) 
    drawText('Score %s' % (score), font, screen, 10, 0) 
    screen.blit(playerImage, playerRect) 
    for a in aliens: 
     screen.blit(b['surface'], b['rect']) 
    pygame.display.update() 


    if playerCollision(playerRect, aliens): 
     if score > topScore: 
      topScore = score 
     break 

    clock.tick(60) 

    drawText('Game Over!', font, screen, (750/3), (750/3)) 
    drawText('Press ENTER To Play Again.', font, screen, (750/3) - 80, (750/3) + 50) 
    pygame.display.update() 
    startGame() 

Hier ist mein neuer Code, nachdem es einige Import pygame, gelegentlich, sys von pygame.locals Modifizieren importieren * alienimg = pygame.image.load ('C: \ Python27 \ alien.png') playerimg = pygame.image.load (‚C: \ Python27 \ spaceship.png‘)

def playerCollision(): # a function for when the player hits an alien 
    for a in aliens: 
     if playerRect.colliderect(b['rect']): 
      return True 
    return False 

def screenText(text, font, screen, x, y): #text display function 
    textobj = font.render(text, 1, (255, 255, 255)) 
    textrect = textobj.get_rect() 
    textrect.topleft = (x,y) 
    screen.blit(textobj, textrect) 

def main(): #this is the main function that starts the game 

    pygame.init() 
    screen = pygame.display.set_mode((750,750)) 
    clock = pygame.time.Clock() 

    pygame.display.set_caption('Dodge the Aliens') 
    font = pygame.font.SysFont("monospace", 55) 


    pressed = pygame.key.get_pressed() 

    aliens = [] 
    score = 0 
    alienAdd = 0 
    addedaliens = 0 

    while True: #our while loop that actually runs the game 



     for event in pygame.event.get(): #key controls 
      if event.type == KEYDOWN and event.key == pygame.K_ESCAPE: 
       sys.exit() 
      elif event.type == KEYDOWN and event.key == pygame.K_LEFT: 
       playerRect.x -= 3 

      elif event.type == KEYDOWN and event.key == pygame.K_RIGHT: 
       playerRect.x += 3 


      playerImage = pygame.image.load('C:\\Python27\\spaceship.png').convert() # the player images 
     playerRect = playerImage.get_rect() 
     playerRect.topleft = (750 /2, 750 - 50) 
     alienImage = pygame.image.load('C:\\Python27\\alien.png').convert() #alien images 

     alienAdd += 1 

     pygame.display.update() 

     if alienAdd == addedaliens: # randomly adding aliens of different sizes and speeds 
      aliendAdd = 0 
      alienSize = random.randint(10, 40) 
      newAlien = {'rect': pygame.Rect(random.randint(0, 750 - alienSize), 0 -alienSize, alienSize, alienSize), 'speed': random.randint(1, 8), 'surface':pygame.transform.scale(alienImage, (alienSize, alienSize)), } 
      aliens.append(newAlien) 
     for a in aliens[:]: 
      if a['rect'].top > 750: 
       aliens.remove(a) #removes the aliens when they get to the bottom of the screen 

     screen.blit(screen, (0,0)) 
     screenText('Score %s' % (score), font, screen, 10, 0) 
     screen.blit(playerImage, playerRect) 
     for a in aliens: 
      screen.blit(b['surface'], b['rect']) 
     pygame.display.flip() 


     if playerCollision(playerRect, aliens): 
      if score > topScore: 
       topScore = score 
      break 


     clock.tick(60) 

     screenText('Game Over!', font, screen, (750/6), (750/6)) 
     screenText('Press ENTER To Play Again.', font, screen, (750/6) - 80, (750/6) + 50) 
     pygame.display.update() 

main() 

Antwort

0

ich noch einige Probleme mit Ihrem Code sehen und ich denke, Sie versuchen, für die sehr zu viel auf einmal zu tun Anfang. Versuche es so einfach wie möglich zu halten. Versuchen Sie, ein Display zu erstellen und ein Bild zu zeichnen:

import pygame 

pygame.init() 

display = pygame.display.set_mode((750, 750)) 
img = pygame.image.load("""C:\\Game Dev\\alien.png""") 
display.blit(img, (0, 0)) 
pygame.display.flip() 

Sie müssen den IMG-Pfad natürlich anpassen. Wenn Sie das ausführen, sollten Sie entweder einen expliziten Fehler erhalten (den Sie dann in einem anderen Thread posten sollten) oder Ihren img auf dem Bildschirm sehen. ABER das Programm wird nicht reagieren, da es keine Ereignisbehandlung und keine Hauptschleife gibt.

Um dies zu vermeiden, können Sie eine Hauptschleife wie vorstellen:

import sys 
import pygame 

pygame.init() 

RESOLUTION = (750, 750) 
FPS = 60 

display = pygame.display.set_mode(RESOLUTION) 
clock = pygame.time.Clock() 
img = pygame.image.load("""C:\\Game Dev\\alien.png""") 

while True: # <--- game loop 

    # check quit program 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      pygame.quit() 
      sys.exit() 
    # clear the screen 
    display.fill((0, 0, 0)) 
    # draw the image 
    display.blit(img, (0, 0)) 
    # update the screen 
    pygame.display.flip() 
    # tick the clock 
    clock.tick(FPS) 

Diese in einem Programm führen soll, die denselben img immer angezeigt wird, und es kann richtig mit der Maus verlassen werden. Aber es ist immer noch wie ein Skript, und wenn jemand das importiert, würde es sofort ausgeführt werden, was wir nicht wollen. Also lassen Sie uns das in Ordnung bringen, wie gut und wickeln sie alle in einer Hauptfunktion wie folgt auf:

import sys 
import pygame 

#defining some constants 
RESOLUTION = (750, 750) 
FPS = 60 

def main(): # <--- program starts here 

    # setting things up 
    pygame.init() 
    display = pygame.display.set_mode(RESOLUTION) 
    clock = pygame.time.Clock() 
    img = pygame.image.load("""C:\\Game Dev\\alien.png""") 

    while True: # <--- game loop 

     # check quit program 
     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
       pygame.quit() 
       sys.exit() 
     # clear the screen 
     display.fill((0, 0, 0)) 
     # draw the image 
     display.blit(img, (0, 0)) 
     # update the screen 
     pygame.display.flip() 
     # tick the clock 
     clock.tick(FPS) 

if __name__ == "__main__": 
    main() 

Die ‚wenn Name ==‚Haupt‘:‘ sorgt dafür, dass das Programm nicht ausgeführt, wenn es importiert wird .

Ich hoffe, das hilft. Und denken Sie daran: Versuchen Sie nicht zu viel auf einmal. Machen Sie kleine Schritte nacheinander und versuchen Sie, die Kontrolle über Ihr Programm zu behalten. Bei Bedarf können Sie sogar nach jeder einzelnen Codezeile eine Druckanweisung einfügen, um Sie genau zu informieren, was Ihr Programm in welcher Reihenfolge macht.

+0

Kann ich Ihnen bitte ein Beispiel für Ihren Vorschlag für @ndoll nennen? –

+0

natürlich - gib mir ein min oder zwei ... – DonPolettone

+0

Danke. Ich bin noch nicht der Beste bei Python, aber ich versuche es zu lernen. Also nur um zu klären, sollte die While-Schleife innerhalb meiner Hauptfunktion sein? – ndoll

Verwandte Themen