Понг в Pygame не считается счет - PullRequest
2 голосов
/ 11 марта 2020

Это то, что у меня есть, и я не хочу, чтобы код вводили вручную, как для школьного проекта. Я все еще работаю над столкновением, но я не уверен, почему отображаемый счет не обновляется. Я попытался настроить обновление партитуры как метод Dot, а затем внедрить этот метод в класс Game, а затем использовать метод update, чтобы попытаться обновить отображаемые баллы, чтобы показать новые баллы в случае попадания мяча в любой край.

# Pong version 2
# Program that displays two immovable paddles and a single ball that bounces around
# the displayed window
# Utilizes str, int, function, Game, Paddle, Ball, module, bool, tuple types
# Includes assingment, expression and import statements

import pygame
import random


def main():
   # initialize all pygame modules (some need initialization)
   pygame.init()
   window_height = 700
   window_length = 1000
   # create a pygame display window
   pygame.display.set_mode((window_length, window_height))
   # set the title of the display window
   pygame.display.set_caption('Pong 2')   
   # get the display surface
   w_surface = pygame.display.get_surface() 
   # create a game object
   game = Game(w_surface)
   # 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.clock = pygame.time.Clock()
      self.close_clicked = False
      self.continue_game = True
      self.distance_edge = 100

      # === game specific objects
      self.small_dot = Dot('white', 10, [450, 350], [3, 1], self.surface)
      self.player1 = Paddle(self.surface, -1, [self.distance_edge, self.surface.get_height()/2 - 40,10,80])
      self.player2 = Paddle(self.surface, -1, [self.surface.get_width() - self.distance_edge - 10, self.surface.get_height()/2 - 40,10,80])
      self.score1 = 0
      self.score2 = 0    


   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.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
      self.small_dot.draw()
      self.player1.draw()
      self.player2.draw()
      pygame.display.update() # make the updated surface appear on the display
      self.display_scores()
      pygame.display.update()

   def display_scores(self):
      # in white on the window's background.
      # - self is the Game to draw for.


      score_font = pygame.font.Font(None, 74)
      score_text = score_font.render(str(self.score1), 1, pygame.Color('white'))
      self.surface.blit(score_text, (0,0))
      score_text = score_font.render(str(self.score2), 1, pygame.Color('white'))
      self.surface.blit(score_text, (950,0))


   def update(self):
      # Update the game objects for the next frame.
      # - self is the Game to update

      self.small_dot.move()
      self.score1 = self.small_dot.score1_update(self.score1)
      self.score2 = self.small_dot.score2_update(self.score2)

class Paddle:

   def __init__(self, surface, colour, dimensions):

      self.surface = surface
      self.colour = colour
      self.dimensions = dimensions

   def draw(self):
      pygame.draw.rect(self.surface, self.colour, self.dimensions)


class Dot:
   # An object in this class represents a Dot that moves

   def __init__(self, dot_color, dot_radius, dot_center, dot_velocity, surface):
      # Initialize a Dot.
      # - self is the Dot to initialize
      # - color is the pygame.Color of the dot
      # - center is a list containing the x and y int
      #   coords of the center of the dot
      # - radius is the int pixel radius of the dot
      # - velocity is a list containing the x and y components
      # - surface is the window's pygame.Surface object

      self.color = pygame.Color(dot_color)
      self.radius = dot_radius
      self.center = dot_center
      self.velocity = dot_velocity
      self.surface = surface


   def move(self):
      # Change the location of the Dot by adding the corresponding 
      # speed values to the x and y coordinate of its center
      # - self is the Dot
      size = self.surface.get_size()

      for point in range(len(size)):
         self.center[point] = (self.center[point] + self.velocity[point])
         left_top_bounce = (self.center[point] - self.radius) < 0 
         right_bottom_bounce = (self.center[point] + self.radius) > size[point]
         if left_top_bounce or right_bottom_bounce:
            self.velocity[point] *= -1

   def draw(self):
      # Draw the dot on the surface
      # - self is the Dot

      pygame.draw.circle(self.surface, self.color, self.center, self.radius)   

   def score1_update(self, score1):

      size = self.surface.get_size()
      for point in range(len(size)):
         self.center[point] = (self.center[point] + self.velocity[point])      
         if self.center[point] >= 990:
            score1 += 1
      return score1

   def score2_update(self, score2):

      size = self.surface.get_size()
      for point in range(len(size)):
         self.center[point] = (self.center[point] + self.velocity[point])      
         if self.center[0] <= 6:
            score2 += 1
      return score2

   def collision(self):
      pass


main()

Ответы [ 2 ]

3 голосов
/ 11 марта 2020

Посмотрите на свой метод Game.update (). Прямо сейчас это выглядит так:

def update(self):
  # Update the game objects for the next frame.
  # - self is the Game to update

  self.small_dot.move()
  self.score1
  self.score2 

Эти две последние строки являются просто утверждениями. Вы не изменяете значения этих оценок, используя присваивание, сложение, вычитание или что-то еще.

Если бы я был вами, я бы подумал об использовании ваших методов Score1_update () и Score2_update () здесь. Конечно, поскольку оба эти метода начинаются с нуля, вам нужно обязательно добавить их результаты в оценки, а не просто назначать оценки результатам этих методов.

0 голосов
/ 11 марта 2020

Взгляните на score1_update() и score2_update(). Вы возвращаете значение, но в своей функции update() вы нигде его не сохраняете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...