簡體   English   中英

由於未知問題,乒乓球剛剛停在初始點

[英]The pong ball is just stopped in the initial point by unknown issue

我是 Pygame 的新手,正在做分配的作業。 我試圖通過python3制作一個名為Pong的程序。 球運動正常,但是在我在程序中寫了一些新的東西之后,球就停在了初始點。 我已經檢查了很多次我的代碼,但我找不到它有什么問題。 下面是我的代碼:

# Pong Version 2
# Display the ball and both paddles, with the ball bouncing from the window edges. 
# The ball bounce off the paddles. It go through the back of paddles. 
# The paddles do not move, but score is updated.
# The game ends when a score is 11 or until the player closes the window.

import pygame, random

def main():
   # initialize all pygame modules (some need initialization)
   pygame.init()
   # create a pygame display window
   pygame.display.set_mode((1000, 800))
   # set the title of the display window
   pygame.display.set_caption('Pong')
   # get the display surface
   w_surface = pygame.display.get_surface() 
   # create a game object
   game = Game(w_surface)
   #init text
   pygame.font.init()
   # start the main game loop by calling the play method on the game object
   game.play() 
   # quit pygame and clean up the pygame window
   pygame.quit() 

class Game:
   # An object in this class represents a complete game.

   def __init__(self, surface):
      # Initialize a Game.
      # - self is the Game to initialize
      # - surface is the display window surface object

      # === objects that are part of every game that we will discuss
      self.surface = surface
      self.bg_color = pygame.Color('black')

      self.FPS = 60
      self.game_Clock = pygame.time.Clock()
      self.close_clicked = False
      self.continue_game = True

      self.num_board1 = '0'
      self.num_board2 = '0'
      # === game specific objects

      #ball elements
      #(ball_color,ball_radius,ball_center,ball_velocity,surface)
      self.ball = Ball('white', 10, [500, 400], [10,20], self.surface)

      #rectangle elements
      #(rect_left_top,rect_width_height,rect_surface,rect_color)
      self.paddle1 = Rect((150,350),(10,100),self.surface,'white')
      self.paddle2 = Rect((840,350),(10,100),self.surface,'white')

      #board elements
      #(name,size,content,color,center,screen)
      #board size is (57,104)
      self.board1 = Board("",150,self.num_board1,(100,100,100),(10,10),self.surface)
      self.board2 = Board("",150,self.num_board2,(100,100,100),(933,10),self.surface)            

   def play(self):
      # Play the game until the player presses the close box.
      # - self is the Game that should be continued or not.
      while not self.close_clicked:  # until player clicks close box
         # play frame
         self.handle_events()
         self.draw()            
         if self.continue_game:
            self.update()
            self.decide_continue()
         self.game_Clock.tick(self.FPS) # run at most with FPS Frames Per Second 

   def handle_events(self):
      # Handle each user event by changing the game state appropriately.
      # - self is the Game whose events will be handled
      events = pygame.event.get()
      for event in events:
         if event.type == pygame.QUIT:
            self.close_clicked = True

   def draw(self):
      # Draw all game objects.
      # - self is the Game to draw      

      self.surface.fill(self.bg_color) # clear the display surface first
      # Draw game elements ball
      self.ball.draw()
      # Draw game elements paddles
      self.paddle1.draw()
      self.paddle2.draw()
      # Draw game elements boards
      self.board1.draw()
      self.board2.draw()      
      pygame.display.update() # make the updated surface appear on the display

   def update(self):
      # Update the game objects.
      # - self is the Game to update
      self.ball.move()

   def decide_continue(self):
      # Check and remember if the game should continue
      # - self is the Game to check
      pass
      if self.num_board1 or self.num_board2 == '11':
         self.continue_game = False

class Ball:
   # An object in this class represents a ball that moves 
   def __init__(self, ball_color, ball_radius, ball_center, ball_velocity, surface):
      # Initialize a ball.
      # - self is the ball to initialize
      # - color is the pygame.Color of the ball
      # - center is a list containing the x and y int
      #   coords of the center of the ball
      # - radius is the int pixel radius of the ball
      # - velocity is a list containing the x and y components
      # - surface is the window's pygame.Surface object
      self.color = pygame.Color(ball_color)
      self.radius = ball_radius
      self.center = ball_center
      self.velocity = ball_velocity
      self.surface = surface

   def move(self):
      # Change the location of the ball by adding the corresponding 
      # speed values to the x and y coordinate of its center
      # - self is the ball
      size = self.surface.get_size() # size is a tuple (width,height)      
      for index in range(0,2):
         self.center[index] = self.center[index] + self.velocity[index]
         if self.center[index] < self.radius: # left or top
            self.velocity[index] = -self.velocity[index] # bounce the ball
         if self.center[index]+ self.radius > size[index]:# right of bottom
            self.velocity[index] = -self.velocity[index] # bounce the ball     

   def draw(self):
      # Draw the ball on the surface
      # - self is the ball
      pygame.draw.circle(self.surface, self.color, self.center, self.radius)


class Rect:
   def __init__(self,rect_left_top,rect_width_height,rect_surface,rect_color):
      #set elements
      # - rect_left_top is the distance from edge
      # - rect_width_height is width and height of the rectangle
      # - rect_surface is the surface of rectangle
      # - rect_color is color of the rectangle
      self.left_top = rect_left_top
      self.width_height = rect_width_height
      self.surface = rect_surface
      self.color = pygame.Color(rect_color)
      self.rect = (self.left_top,self.width_height)

   def draw(self): 
      # draw the rectangle
      pygame.draw.rect(self.surface,self.color,self.rect)  


class Board:
   def __init__(self,name,size,content,color,text_left_right,surface):
      # - name is the typeface of the text
      # - size is the size of the text
      # - content is the content fo the text 
      # - color is the color of text, it looks like (x,x,x), which is combined by three basic color)
      # - text_left_right is a the left and right distance from edge
      # - surface is a the display.set_mode, used to blit text
      self.name = name
      self.size = size
      self.content = content
      self.color = color
      self.text_left_right = text_left_right
      self.surface = surface

   def draw(self):
      #to show the text
      font = pygame.font.SysFont(self.name,self.size)
      text = font.render(self.content,True,self.color)
      self.surface.blit(text,self.text_left_right)

main()

decide_continue方法的問題。

當我從play方法中刪除對decide_continue的調用時,球開始移動:

   def play(self):
      # Play the game until the player presses the close box.
      # - self is the Game that should be continued or not.
      while not self.close_clicked:  # until player clicks close box
         # play frame
         self.handle_events()
         self.draw()
         if self.continue_game:
            self.update()

         self.game_Clock.tick(self.FPS) # run at most with FPS Frames Per Second

所以decide_continue方法的問題。 你應該審查它。

通過 Yurii 完成的測試(請參閱其他答案),因為您沒有提及在程序無法正常工作之前所做的更改。

decide_continue(self)有以下 if 子句:

if self.num_board1 or self.num_board2 == '11':

這意味着它評估self.num_board1是否等於True (即,不是False0 、空字符串等),這可能總是如此,或者它將self.num_board2字符串'11'進行比較。

重要說明:字符串'0' ,板的初始值,不會評估為False :它不是空字符串,也不是 integer 0

由於第一個條件,這個 if 語句實際上總是會評估為真。

你可能想要:

if self.num_board1 == '11' or self.num_board2 == '11':

或類似的東西。 您還應該考慮是否需要一個'11'字符串,或者這應該是一個數字(整數),因為您調用了變量num _board

此外,由於似乎沒有對num_board1/2進行任何操作,它的值可能永遠不會從初始值'0'改變,在這種情況下,此時它永遠不會等於'11'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM