得分未更新Pong PyGame [英] Score Not Updating Pong Pygame

查看:18
本文介绍了得分未更新Pong PyGame的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我不确定为什么分数没有更新。当任一玩家得分时,调试器打印0。以下是我的得分变量。

player_score = 0
opponent_score = 0
basic_font = pygame.font.Font('freesansbold.ttf', 32)

And the variables for rendering the score:

player_text = basic_font.render(f'{player_score}', False, light_grey)
screen.blit(player_text, (660, 470))

opponent_text = basic_font.render(f'{opponent_score}', False, light_grey)
screen.blit(opponent_text, (600, 470))

和我的更新方法。

    def update(self, left_paddle, right_paddle, player_score, opponent_score):
    self.rect.x += self.vx
    self.rect.y += self.vy

    if self.rect.top <= 0 or self.rect.bottom >= screen_height:
        self.vy *= -1

    if self.rect.left <= 0:
        self.ball_start()
        player_score += 1

    if self.rect.right >= screen_width:
        self.ball_start()
        opponent_score += 1

    if self.rect.colliderect(left_paddle) or self.rect.colliderect(right_paddle):
        self.vx *= -1

def ball_start(self):
    self.rect.center = (screen_width / 2, screen_height / 2)
    self.vy *= random.choice((1, -1))
    self.vx *= random.choice((1, -1))

然后调用更新方法:

BAL.UPDATE(Left_Paddle,Right_Paddle,PERAYER_SCORE,ACTRATER_SCORE)

以下是该项目的代码。您的帮助我们将不胜感激。

import logging
import pygame, sys
from inputs import handle_input
import random


class Paddle:
    def __init__(self):
        self.rect = pygame.Rect(10, screen_height / 2 - 70, 10, 140)

        self.speed = 10

    def draw(self, screen):
        pygame.draw.rect(screen, light_grey, self.rect)

    def move_up(self):
        self.rect.y -= self.speed
        self._keep_in_bounds()

    def move_down(self):
        self.rect.y += self.speed
        self._keep_in_bounds()

    def _keep_in_bounds(self):
        if self.rect.top <= 0:
            self.rect.top = 0

        if self.rect.bottom >= screen_height:
            self.rect.bottom = screen_height


class Ball:
    def __init__(self, x, y, width, height):
        self.rect = pygame.Rect(x, y, width, height)
        self.speed = 7
        self.vx = self.speed * random.choice((1, -1))
        self.vy = self.speed * random.choice((1, -1))

    def draw(self, screen):
        pygame.draw.ellipse(screen, light_grey, self.rect)

    def update(self, left_paddle, right_paddle, player_score, opponent_score):

        self.rect.x += self.vx
        self.rect.y += self.vy

        if self.rect.top <= 0 or self.rect.bottom >= screen_height:
            self.vy *= -1

        if self.rect.left <= 0:
            self.ball_start()
            player_score += 1

        if self.rect.right >= screen_width:
            self.ball_start()
            opponent_score += 1

        if self.rect.colliderect(left_paddle) or self.rect.colliderect(right_paddle):
            self.vx *= -1

    def ball_start(self):
        self.rect.center = (screen_width / 2, screen_height / 2)
        # print(self.rect.center)
        self.vy *= random.choice((1, -1))
        self.vx *= random.choice((1, -1))


# General setup
pygame.init()
clock = pygame.time.Clock()

# Main Window
screen_width = 1280
screen_height = 800
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption('Pong')

# Colors
light_grey = (200, 200, 200)
bg_color = pygame.Color('grey12')

# Game Rectangles
ball = Ball(screen_width / 2 - 15, screen_height / 2 - 15, 30, 30)
left_paddle = Paddle()
right_paddle = Paddle()
right_paddle.rect.x = screen_width - right_paddle.rect.width

player_score = 0
opponent_score = 0
basic_font = pygame.font.Font('freesansbold.ttf', 32)

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

    # Game logic
    handle_input(left_paddle, right_paddle)
    screen.fill(bg_color)
    pygame.draw.aaline(screen, light_grey, (screen_width / 2, 0), (screen_width / 2, screen_height))
    ball.draw(screen)
    left_paddle.draw(screen)
    right_paddle.draw(screen)
    ball.update(left_paddle, right_paddle, player_score, opponent_score)

    player_text = basic_font.render(f'{player_score}', False, light_grey)
    screen.blit(player_text, (660, 470))

    opponent_text = basic_font.render(f'{opponent_score}', False, light_grey)
    screen.blit(opponent_text, (600, 470))

    pygame.display.flip()
    clock.tick(60)

推荐答案

您的更新不会反映在全局变量中,因为您根本没有更新它们。您正在更新它们的本地副本,该副本是通过将它们传递给Ball.update函数而获得的。

试试:

def update(self, left_paddle, right_paddle):
    global player_score, opponent_score

    ...

    if self.rect.left <= 0:
        self.ball_start()
        player_score += 1

    if self.rect.right >= screen_width:
        self.ball_start()
        opponent_score += 1

    ...
    # function ends here
我认为最好的方法是创建一个Player类,并且只跟踪其中的分数,然后将这个Player类的实例传递给update函数。然后,稍后从这些实例中检索分数。

这篇关于得分未更新Pong PyGame的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆