2016-10-28 6 views
0

これを序文にすると、私はマイナーなものがコンピュータサイエンスです。私の主な焦点はコーディングではなく、ここで私がまだ見ていない大きなミスをしたかもしれません。私の現在の問題は、私がエラーを受け取ることです。初心者のPygame、スコアが更新されていない/変数が見つかりません

"Traceback (most recent call last): 
    File "/home/user/Downloads/PongV1.py", line 158, in <module> 
    main() 
    File "/home/user/Downloads/PongV1.py", line 13, in <module> 
    game.play() 
    File "/home/user/Downloads/PongV1.py", line 42, in <module> 
    self.update() 
    File "/home/user/Downloads/PongV1.py", line 77, in <module> 
    self.ball.move() 
    File "/home/user/Downloads/PongV1.py", line 136, in <module> 
    game.score2 = game.score2 + 1 
builtins.NameError: name 'game' is not defined 

私はこのゲームを実行しようとするたびに、私はそれが現在ダウンロード中であることを知っていますが、私は急いで一緒にVMマシンを入れてこれを実行しています。私が知る限り、私はスコア1 /スコア2変数をうまくうまく呼びました。

私がやっていることの目標は、ボールが壁に当ったときにコーナーのスコアを更新することです。現在、それはデフ移動部に位置しています

This is what my screen looks like when I try to run this program

を探してありがとうございました!

# pygame v2 

import pygame 
import uaio 
import math 
import time 
from pygame.locals import * 

# User-defined functions 
def main(): 
    surface = create_window() 
    game = Game(surface) 
    game.play() 
    pygame.quit() 

# Create window 
def create_window(): 
    pygame.init() 
    surface_size = (700,600) 
    title = 'Pong' 
    surface = pygame.display.set_mode(surface_size) 
    pygame.display.set_caption(title) 
    return surface 
# define class games 
class Game: 
    def __init__ (self, surface): 
     self.surface = surface #locations and surface colors of games 
     self.bg_color = pygame.Color('black') 
     self.pause_time = 0.01 
     self.close_clicked = False 
     self.continue_game = True 
     self.ball = Ball(pygame.Color('white'),[350,300],5,[6,2], surface) 
     self.paddle= Paddle(pygame.Color('white'),(100,300),100,100, surface) 
     self.score1 = 0 
     self.score2 = 0 

    def play(self): #playing the game while the game is not closed 
     self.draw() 
     while not self.close_clicked: 
      self.handle_event() 
      if self.continue_game: 
       self.update() 
       self.decide_continue 
      self.draw() 
      time.sleep(self.pause_time) 

def handle_event(self): #continuing the game 
    event = pygame.event.poll() 
    if event.type == QUIT: 
     self.close_clicked = True 

def draw(self): #drawing the balls and paddles 
    self.surface.fill(self.bg_color) 
    self.ball.draw() 
    self.paddle.draw() 
    self.draw_score() 
    pygame.display.update() 

def draw_score(self): 
    string = str(self.score1) 
    location = 0,0 
    size = 80 
    #fg_color = pygame.Color('white') 
    uaio.draw_string(string, self.surface,location,size) 

    string = str(self.score2) 
    location = 650,0 
    size = 80 
    #fg_color = pygame.Color('white') 
    uaio.draw_string(string, self.surface,location,size) 

def paddlecollide(self): 
    self.paddle.collide_right(x, y) 
    self.paddle.collidge_left(x, y)   

def update(self): #updating the movement of the ball 
    self.ball.move() 
    self.ball.collide(self.paddle) 


def decide_continue(self): # deciding to continue teh game 
    pass 

class Paddle: #defining paddle 

def __init__(self, color, left, width, height, surface): 
    #location of paddle etc 
    self.color = color 
    self.left = left 
    self.surface = surface 
    self.width = width 
    self.height = height 
    self.paddle1 = pygame.Rect(140,270,20,80) 
    self.paddle2 = pygame.Rect(540,270,20,80) 
    #return self.paddle1, self.paddle2 


def draw(self): 
    #drawing paddle 
    pygame.draw.rect(self.surface, self.color, self.paddle1) 
    pygame.draw.rect(self.surface, self.color, self.paddle2) 

def collide_left(self, x, y): 
    return self.paddle1.collidepoint(x, y) 

def collide_right(self, x, y): 
    return self.paddle2.collidepoint(x, y)  

class Ball: #defining ball 

def __init__(self, color, center, radius, velocity, surface): 
    #charactersitics of said ball 

    self.color = color 
    self.center = center 
    self.radius = radius 
    self.velocity = velocity 
    self.surface = surface 


def draw(self): 
    #drawing the ball 
    pygame.draw.circle(self.surface, self.color, self.center, self.radius) 

def move(self): 

    # how the ball moves as well as ist velocity 
    size = self.surface.get_size() 
    for coord in range(0, 2): 
     self.center[coord] = (self.center[coord] + self.velocity[coord]) 
     if self.center[coord] < self.radius: 
      self.velocity[coord] = -self.velocity[coord] 
      Game.score1 = Game.score1 + 1 
     if self.center[coord] + self.radius > size[coord]: 
      self.velocity[coord] = -self.velocity[coord] 
      Game.score2 = Game.score2 + 1 





def collide(self, paddles): 
    xcoord =0 
    if paddles.collide_left(self.center[0], self.center[1]): 
     self.velocity[xcoord] = -self.velocity[xcoord] 

    if paddles.collide_right(self.center[0], self.center[1]): 
     self.velocity[xcoord] = -self.velocity[xcoord]   

     #if x_velocity <= 0: 
     # collide = False 
     #  
     #else: collide = True 

メイン()

+0

Game.score2 = Game.score2 + 1はボールに座っていますが、Gameにはアクセスできません。Gameには変数がありません。 –

+0

ボールが親を見つけてスコアを増加させる方法についてはhttp://stackoverflow.com/questions/10791588/getting-container-parent-object-from-within-pythonを参照してください。 –

答えて

1

問題のある行が(自分の与えられたコード内)このいずれかになります。まず

  • Game.score2 = Game.score2 + 1 
    

    この行と間違って二つのことがあります存在しない変数を使用しようとしています。 Gameは、定義したクラスの名前です。新しいGameオブジェクトを作成し、使用する前に変数に割り当てる必要があります。私はあなたが持っていることが分かり、問題2に私を導きます...

  • 範囲。関数mainに変数gameを定義しました。ただし、この変数はローカルにのに作成されています。それは、それが定義された関数以外のどこにでもアクセスすることはできません(いくつかの例外を除いて)。私はより良い範囲を理解するためにthis stackoverflow答えを読むことをお勧めします。

score1およびscore2は両方ともGamesクラス内で定義される。 main関数(12行目)では、新しいGamesオブジェクトが作成され、変数gamesに割り当てられます。この変数はローカルであり、関数main内でのみアクセスできます。

今、2つのオプションがあります。最初のオプションは、Gamesクラスの変数score1score2を完全に削除し、それらをプログラムの本体で定義された別々の変数として持つことです。これは、彼らがどこでもアクセスすることができるようになる(もちろんあなたがgame.score1game.score2

第二の参照を変更しなければならない、と私の意見が望ましいオプションで、変数gameグローバル変数にするだろう。あなたのmain機能では、コードは次のようになります。

def main(): 
    surface = create_window() 
    global game 
    game = Game(surface) 
    game.play() 
    pygame.quit() 

すると、その横に、あなたが変数gameを使用するように、あなたのmain機能の外Gameクラスへの参照を、大文字に解除することを忘れないでください:

Game.score1 = Game.score1 + 1 

は、私は、私はこの明確に十分に説明願ってい

game.score1 = game.score1 + 1 

になります。スコープとクラスがPythonでどのように機能するかを読むことをお勧めします。

+0

心配しなくても、私の答えは少し役に立ちました。うまくいけばそれは理にかなっています。 – Inazuma

+0

Gotcha、ありがとう男!それは多くを助ける必要があります! –

関連する問題