2017-05-08 14 views
0

現在、pygameでPongを再作成しようとしています。これは私のコードです:Pygameコードが実行されていません(ウィンドウは開きません)

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() 

私はシェルを介してファイルを実行すると私の問題は、出力がされます。しかし、私が作成したウィンドウが表示されない

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" 

とそれがあるかのように思えますそれが開かれたりすぐに崩壊したりした。これが何であるかを知るのを手伝ってください!

+2

あなたのコードは、実際のインデントに掲載されているとすると、何も実際に実行されていない - 'メイン呼び出す必要があり、最後の2行を()'、彼らがメインの一部であるように、インデントされている、というよりもトップレベル。 – jasonharper

答えて

0

以下のコードはOKです。コマンドラインにイベントを出力し、イベントを処理してウィンドウを閉じることができます。

既に言及されている(コメントを参照)インデントの問題のほかに、イベントをキャプチャする際に問題があったため(アウトのコメント行を参照)、イベントを処理してウィンドウを閉じることができませんでした。

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() 
関連する問題