Это то, что у меня есть, и я не хочу, чтобы код вводили вручную, как для школьного проекта. Я все еще работаю над столкновением, но я не уверен, почему отображаемый счет не обновляется. Я попытался настроить обновление партитуры как метод 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()