2017-05-08 2 views
0

Ich versuche gerade, Pong in Pygame zu erstellen. Dies ist mein Code:Pygame-Code wird nicht ausgeführt (Fenster wird nicht geöffnet)

import sys, pygame 
from pygame.locals import * 


FPS = 60 

BLACK = (0, 0, 0) 
WHITE = (255, 255, 255) 

WINDOWWIDTH = 400 
WINDOWHEIGHT = 300 
LINETHICKNESS = 10 
PADDLESIZE = 50 
PADDLEOFFSET = 20 

def drawArena(): 
    DISPLAYSURF.fill((BLACK)) 
    pygame.draw.rect(DISPLAYSURF, WHITE, ((0,0),(WINDOWWIDTH,WINDOWHEIGHT)), LINETHICKNESS*2) 
    pygame.draw.line(DISPLAYSURF, WHITE, ((WINDOWWIDTH/2),0),((WINDOWWIDTH/2),WINDOWHEIGHT), (LINETHICKNESS/4)) 

def drawPaddle(paddle): 
    if paddle.bottom > (WINDOWHEIGHT - LINETHICKNESS): 
     paddle.bottom = WINDOWHEIGHT - LINETHICKNESS 
    elif paddle.top > LINETHICKNESS: 
     paddle.top = LINETHICKNESS 
    pygame.draw.rect(DISPLAYSURF, WHITE, paddle) 


def drawBall(ball): 
    pygame.draw.rect(DISPLAYSURF, WHITE, ball) 

def moveBall(ball, ballDirX, ballDirY): 
    ball.x += ballDirX 
    ball.y += ballDirY 
    return ball 

def checkWallCollision(ball, ballDirX, ballDirY): 
    if ball.top == (LINETHICKNESS) or ball.bottom == (WINDOWHEIGHT - LINETHICKNESS): 
     ballDirY = ballDirY * -1 
    if ball.left == (LINETHICKNESS) or ball.right == (WINDOWHEIGHT - LINETHICKNESS): 
     ballDirX = ballDirX * -1 
    return ballDirX, ballDirY 

def checkPaddleCollision(ball, ballDirX, paddle1, paddle2): 
    if ballDirX == -1 and paddle1.right == ball.left and paddle1.top < ball.top and paddle1.bottom > ball.bottom: 
     return -1 
    elif ballDirX == -1 and paddle2.left == ball.right and paddle2.top < ball.top and paddle2.bottom > ball.bottom: 
     return -1 
    else: 
     return 1 

def checkPointScored(paddle1, ball, score, ballDirX): 
    if ball.left == LINETHICKNESS: 
     return 0 
    elif ballDirX == -1 and paddle1.right == ball.left and paddle1.top < ball.top and paddle1.bottom > ball.bottom: 
     score += 1 
    elif ball.right == WINDOWWIDTH - LINETHICKNESS: 
     score += 5 
     return score 
    else: return score 

def aI(ball, ballDirX, paddle2): 
    if ballDirX == -1: 
     if paddle2.centery < (WINDOWHEIGHT/2): 
      paddle2.y += 1 
     elif paddle2.centery > (WINDOWHEIGHT/2): 
      paddle2.y -= 1 

    elif ballDirX == 1: 
     if paddle2.centery < ball.centery: 
      paddle2.y += 1 
     else: 
      paddle2.y -=1 
    return paddle2 

def displayScore(score): 
    resultSurf = BASICFONT.render('Score = %s' %(score), True, WHITE) 
    resultRect = resultSurf,get_rect() 
    resultRect.topleft = WINDOWWIDTH = 150, 25 
    DISPLAYSURF.blit(resultSurf, resultRect) 

def main(): 
    pygame.init() 
    global DISPLAYSURF 
    global BASICFONT, BASICFONTSIZE 
    BASICFONTSIZE = 20 
    BASICFONT = pygame.font.Font('freesansbold.ttf', BASICFONTSIZE) 

    FPSCLOCK = pygame.time.Clock() 
    DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH,WINDOWHEIGHT)) 
    pygame.display.set_caption('Pong') 

    ballX = WINDOWWIDTH/2 - LINETHICKNESS/2 
    ballY = WINDOWHEIGHT/2 - LINETHICKNESS/2 
    playerOnePosition = (WINDOWHEIGHT - PADDLESIZE) /2 
    playerTwoPosition = (WINDOWHEIGHT - PADDLESIZE) /2 
    score = 0 

    ballDirX = -1 
    ballDirY = -1 

    paddle1 = pygame.Rect(PADDLEOFFSET, playerOnePosition, LINETHICKNESS, PADDLESIZE) 
    paddle2 = pygame.Rect(WINDOWWIDTH - PADDLEOFFSET - LINETHICKNESS, playerTwoPosition, LINETHICKNESS, PADDLESIZE) 
    ball = pygame.Rect(ballX, ballY, LINETHICKNESS, LINETHICKNESS) 
    drawArena() 
    drawPaddle(paddle1) 
    drawPaddle(paddle2) 
    drawBall(ball) 

    while True: #main game loop 
     pygame.event.get() 
     pygame.event.pump() 
     for event in pygame.event.get(): 
      if event.type == QUIT: 
       pygame.quit() 
       sys.exit() 

     drawArena() 
     drawPaddle(paddle1) 
     drawPaddle(paddle2) 
     drawBall(ball) 

     pygame.display.update() 
     FPSCLOCK.tick(FPS) 

    if __name__=='__main__': 
     main() 

Mein Problem ist, wenn ich die Datei durch die Schale laufen die Ausgabe:

Python 3.6.0 |Continuum Analytics, Inc.| (default, Dec 23 2016, 11:57:41) on Windows (64 bits). 
This is the Pyzo interpreter with integrated event loop for TK. 
Type 'help' for help, type '?' for a list of *magic* commands. 
Running script: "H:\pong.py" 

jedoch das Fenster, das ich geschaffen wird nicht angezeigt, und es scheint, als ob es ist abgestürzt, sobald es geöffnet wurde oder etwas Ähnliches. Hilf mir, herauszufinden, was das ist, bitte!

+2

Unter der Annahme, dass der Code mit dem tatsächlichen Einzug gebucht wird, wird nichts tatsächlich ausgeführt wird - die letzten beiden Zeilen, die aufrufen sollte 'main()' sind eingerückt, so dass sie ein Teil der Haupt sind, anstatt auf die oberste Ebene. – jasonharper

Antwort

0

Der Code unten läuft OK, zeigt in der Befehlszeile die Ereignisse und ermöglicht es, Ereignisse zu verarbeiten und das Fenster zu schließen.

Neben dem bereits erwähnten Einrückungsproblem (siehe Kommentare) gab es ein Problem bei der Erfassung von Ereignissen (siehe out-commented Zeilen), so dass es nicht möglich war, die Ereignisse zu verarbeiten und das geöffnete Fenster zu schließen.

import sys, pygame 
from pygame.locals import * 

FPS = 60 

BLACK = (0, 0, 0) 
WHITE = (255, 255, 255) 

WINDOWWIDTH = 400 
WINDOWHEIGHT = 300 
LINETHICKNESS = 10 
PADDLESIZE = 50 
PADDLEOFFSET = 20 

def drawArena(): 
    DISPLAYSURF.fill((BLACK)) 
    pygame.draw.rect(DISPLAYSURF, WHITE, ((0,0),(WINDOWWIDTH,WINDOWHEIGHT)), LINETHICKNESS*2) 
    pygame.draw.line(DISPLAYSURF, WHITE, ((int(WINDOWWIDTH/2)),0),((int(WINDOWWIDTH/2)),WINDOWHEIGHT), (int(LINETHICKNESS/4))) 

def drawPaddle(paddle): 
    if paddle.bottom > (WINDOWHEIGHT - LINETHICKNESS): 
     paddle.bottom = WINDOWHEIGHT - LINETHICKNESS 
    elif paddle.top > LINETHICKNESS: 
     paddle.top = LINETHICKNESS 
    pygame.draw.rect(DISPLAYSURF, WHITE, paddle) 

def drawBall(ball): 
    pygame.draw.rect(DISPLAYSURF, WHITE, ball) 

def moveBall(ball, ballDirX, ballDirY): 
    ball.x += ballDirX 
    ball.y += ballDirY 
    return ball 

def checkWallCollision(ball, ballDirX, ballDirY): 
    if ball.top == (LINETHICKNESS) or ball.bottom == (WINDOWHEIGHT - LINETHICKNESS): 
     ballDirY = ballDirY * -1 
    if ball.left == (LINETHICKNESS) or ball.right == (WINDOWHEIGHT - LINETHICKNESS): 
     ballDirX = ballDirX * -1 
    return ballDirX, ballDirY 

def checkPaddleCollision(ball, ballDirX, paddle1, paddle2): 
    if ballDirX == -1 and paddle1.right == ball.left and paddle1.top < ball.top and paddle1.bottom > ball.bottom: 
     return -1 
    elif ballDirX == -1 and paddle2.left == ball.right and paddle2.top < ball.top and paddle2.bottom > ball.bottom: 
     return -1 
    else: 
     return 1 

def checkPointScored(paddle1, ball, score, ballDirX): 
    if ball.left == LINETHICKNESS: 
     return 0 
    elif ballDirX == -1 and paddle1.right == ball.left and paddle1.top < ball.top and paddle1.bottom > ball.bottom: 
     score += 1 
    elif ball.right == WINDOWWIDTH - LINETHICKNESS: 
     score += 5 
     return score 
    else: return score 

def aI(ball, ballDirX, paddle2): 
    if ballDirX == -1: 
     if paddle2.centery < (WINDOWHEIGHT/2): 
      paddle2.y += 1 
     elif paddle2.centery > (WINDOWHEIGHT/2): 
      paddle2.y -= 1 

    elif ballDirX == 1: 
     if paddle2.centery < ball.centery: 
      paddle2.y += 1 
     else: 
      paddle2.y -=1 
    return paddle2 

def displayScore(score): 
    resultSurf = BASICFONT.render('Score = %s' %(score), True, WHITE) 
    resultRect = resultSurf,get_rect() 
    resultRect.topleft = WINDOWWIDTH = 150, 25 
    DISPLAYSURF.blit(resultSurf, resultRect) 

def main(): 
    pygame.init() 
    global DISPLAYSURF 
    global BASICFONT, BASICFONTSIZE 
    BASICFONTSIZE = 20 
    BASICFONT = pygame.font.Font('freesansbold.ttf', BASICFONTSIZE) 

    FPSCLOCK = pygame.time.Clock() 
    DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH,WINDOWHEIGHT)) 
    pygame.display.set_caption('Pong') 

    ballX = WINDOWWIDTH/2 - LINETHICKNESS/2 
    ballY = WINDOWHEIGHT/2 - LINETHICKNESS/2 
    playerOnePosition = (WINDOWHEIGHT - PADDLESIZE) /2 
    playerTwoPosition = (WINDOWHEIGHT - PADDLESIZE) /2 
    score = 0 

    ballDirX = -1 
    ballDirY = -1 

    paddle1 = pygame.Rect(PADDLEOFFSET, playerOnePosition, LINETHICKNESS, PADDLESIZE) 
    paddle2 = pygame.Rect(WINDOWWIDTH - PADDLEOFFSET - LINETHICKNESS, playerTwoPosition, LINETHICKNESS, PADDLESIZE) 
    ball = pygame.Rect(ballX, ballY, LINETHICKNESS, LINETHICKNESS) 
    drawArena() 
    drawPaddle(paddle1) 
    drawPaddle(paddle2) 
    drawBall(ball) 

    while True: #main game loop 
     # pygame.event.get() 
     # pygame.event.pump() 

     for event in pygame.event.get(): 
      print("event", event) 
      if event.type == QUIT: 
       pygame.quit() 
       sys.exit() 

     drawArena() 
     drawPaddle(paddle1) 
     drawPaddle(paddle2) 
     drawBall(ball) 

     pygame.display.update() 
     FPSCLOCK.tick(FPS) 

if __name__=='__main__': 
    main() 
Verwandte Themen