RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1607500
Accepted
Danish
Danish
Asked:2025-02-23 18:45:33 +0000 UTC2025-02-23 18:45:33 +0000 UTC 2025-02-23 18:45:33 +0000 UTC

我怎样才能制作一个计数器,以便当我进球时,结果就会显示在记分牌上?

  • 772

我怎样才能得分,以便当我进球时,记分牌上就会增加一分?

import pygame
from pygame import image


pygame.init()
# Константы
SCREEN_WIDTH, SCREEN_HEIGHT = 600, 800
FPS = 30
BLUE_WIDTH, BLUE_HEIGHT = 50, 50
PUCK_WIDTH, PUCK_HEIGHT = 35, 35
# Цвета
WHITE = (255, 255, 255)
GRAY = (50, 50, 50)
GREEN = (0, 200, 0)
BROWN = (139, 69, 19)
BLUE = (0, 0, 255)
ZONE_WIDTH = 400
ZONE_HEIGHT = 600

GATE_WIDTH, GATE_HEIGHT = 100, 10

# Настройка экрана
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("Air Hockey")
clock = pygame.time.Clock()
background = pygame.transform.scale(pygame.image.load("assets\\background.png"), (ZONE_WIDTH, ZONE_HEIGHT))
bluepad = pygame.transform.scale(pygame.image.load("assets\\bluepad.png"), (BLUE_WIDTH, BLUE_HEIGHT))
puck = pygame.transform.scale(pygame.image.load("assets\\puck.png"), (PUCK_WIDTH, PUCK_HEIGHT))
redpad = pygame.transform.scale(pygame.image.load("assets\\redpad.png"), (SCREEN_WIDTH, SCREEN_HEIGHT))
pos = pygame.mouse.get_pos()

STICK_RADIUS = 5
BALL_RADIUS = 10
bluepad_speed_y = 10
ball_speed_x = 2
ball_speed_y = 2
LOWER, UPPER = "lower", "upper"
HOME, AWAY = "Player 1", "Player 2"
START_SCORE = {HOME: 0, AWAY: 0}


class Ball():
    def __init__(self, x, y, radius):
        self.dx = 0
        self.dy = 0
        self.friction = 0.95
        self.rect = pygame.Rect(x, y, radius*2, radius*2)

    def draw(self):
        screen.blit(puck, self.rect.center)

    def update(self):
        # Добавляем инерцию
        self.dx *= self.friction
        self.dy *= self.friction
        self.rect.x += self.dx
        self.rect.y += self.dy

    def check_zone_collision(self, zone):
        if not self.rect.top > zone.rect.top:
            self.rect.top = zone.rect.top
            self.dy = -self.dy
        elif not self.rect.bottom < zone.rect.bottom:
            self.rect.bottom = zone.rect.bottom
            self.dy = -self.dy

        if not self.rect.left > zone.rect.left:
            self.rect.left = zone.rect.left
            self.dx = -self.dx
        elif not self.rect.right < zone.rect.right:
            self.rect.right = zone.rect.right
            self.dx = -self.dx


class Gate():
    def __init__(self, x, y):
        self.x = x
        self.y =  y
        self.rect = pygame.Rect(x,y,GATE_WIDTH, GATE_HEIGHT)

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


class Stick():
    def __init__(self, x, y, radius):
        self.dragging = False
        self.dx = 0
        self.dy = 0
        self.friction = 0.95
        self.rect = pygame.Rect(x, y, radius*2, radius*2)

    def draw(self):
        pygame.draw.circle(screen, BROWN, self.rect.center, self.rect.width // 2)
        screen.blit(bluepad, self.rect.center)

    def update(self):
        if not self.dragging:
            # Добавляем инерцию
            self.dx *= self.friction
            self.dy *= self.friction
            self.rect.x += self.dx
            self.rect.y += self.dy

    def check_zone_collision(self, zone):
        if not self.rect.top > zone.rect.top:
            self.rect.top = zone.rect.top
            self.dy = -self.dy
        elif not self.rect.bottom < zone.rect.bottom:
            self.rect.bottom = zone.rect.bottom
            self.dy = -self.dy

        if not self.rect.left > zone.rect.left:
            self.rect.left = zone.rect.left
            self.dx = -self.dx
        elif not self.rect.right < zone.rect.right:
            self.rect.right = zone.rect.right
            self.dx = -self.dx

class Bot():
    def __init__(self, x, y, radius):
        self.dragging = False
        self.dx = 0
        self.dy = 0
        self.friction = 0.95
        self.redpad = pygame.transform.scale(pygame.image.load("assets\\redpad.png"), (BLUE_WIDTH, BLUE_HEIGHT))
        self.rect = pygame.Rect(x, y, radius*2, radius*2)

    def draw(self):
        screen.blit(self.redpad, self.rect.center)
        pygame.draw.circle(screen, GREEN, self.rect.center, self.rect.width // 2)

    def move_bot(self):
        if ball.rect.center > self.rect.center and ball.rect.centerx > 450:
            self.dy += 1
        if ball.rect.center < self.rect.center and ball.rect.centerx > 450:
            self.dy -= 1

    def update(self):
        if not self.dragging:
            # Добавляем инерцию
            self.dx *= self.friction
            self.dy *= self.friction
            self.rect.x += self.dx
            self.rect.y += self.dy

    def check_zone_collision(self, zone):
        if not self.rect.top > zone.rect.top:
            self.rect.top = zone.rect.top
            self.dy = -self.dy
        elif not self.rect.bottom < zone.rect.bottom:
            self.rect.bottom = zone.rect.bottom
            self.dy = -self.dy

        if not self.rect.left > zone.rect.left:
            self.rect.left = zone.rect.left
            self.dx = -self.dx
        elif not self.rect.right < zone.rect.right:
            self.rect.right = zone.rect.right
            self.dx = -self.dx


class Zone():
    def __init__(self, x, y, width, height):
        self.rect = pygame.Rect(x, y, width, height)

    def draw(self):
        screen.blit(background, self.rect)


stick = Stick(250, 500, STICK_RADIUS)
ball = Ball(275, 380, BALL_RADIUS)
zone = Zone(100, 100, ZONE_WIDTH, ZONE_HEIGHT)
bot = Bot(250, 250, STICK_RADIUS)
gate_enemy = Gate(250, 100)
gate_my = Gate(250, ZONE_HEIGHT+100)

# Основной цикл игры
running = True
game_status = 'game'
bluepad_speed_y = 0
font_score = pygame.font.Font(None, 20)
while running:
    screen.fill(BLUE)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.MOUSEBUTTONDOWN:
            if event.button == 1 and stick.rect.collidepoint(event.pos):
                stick.dragging = True
                bluepad_speed_y -= 1
                if game_status == 'menu':
                    game_status = 'game'
                    score = [0, 0]
        elif event.type == pygame.MOUSEBUTTONUP:
            stick.dragging = False
            bluepad_speed_y += 1
        elif event.type == pygame.MOUSEMOTION:
            if stick.dragging:
                dx, dy = event.rel
                stick.rect.x += dx
                stick.rect.y += dy
                stick.dx = dx
                stick.dy = dy

    zone.draw()

    gate_my.draw()
    gate_enemy.draw()

    stick.update()
    stick.draw()
    stick.check_zone_collision(zone)

    ball.update()
    ball.draw()
    ball.check_zone_collision(zone)

    bot.draw()
    bot.move_bot()

    if gate_enemy.rect.colliderect(ball.rect):
        running = False
    if gate_my.rect.colliderect(ball.rect):
        running = False

    if ball.rect.colliderect(stick.rect):
        ball.dx = stick.dx
        ball.dy = stick.dy
        stick.dx = -stick.dx
        stick.dy = -stick.dy
    keys = pygame.key.get_pressed()

    font_score.render(f"Score{score}", True, WHITE)

    message_score = font_score.render(f"Score {score}", True, WHITE)
    message_rect = message_score.get_rect(center=(290, SCREEN_HEIGHT - 50))
    screen.blit(message_score, message_rect)

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

pygame.quit()
python
  • 1 1 个回答
  • 60 Views

1 个回答

  • Voted
  1. Best Answer
    S. Nick
    2025-02-24T02:59:03Z2025-02-24T02:59:03Z

    尝试这样的操作:

    import pygame
    from pygame import image
    
    pygame.init()
    # Константы
    SCREEN_WIDTH, SCREEN_HEIGHT = 600, 800
    FPS = 30
    BLUE_WIDTH, BLUE_HEIGHT = 50, 50
    PUCK_WIDTH, PUCK_HEIGHT = 35, 35
    # Цвета
    WHITE = (255, 255, 255)
    GRAY = (50, 50, 50)
    GREEN = (0, 200, 0)
    BROWN = (139, 69, 19)
    BLUE = (0, 0, 255)
    ZONE_WIDTH = 400
    ZONE_HEIGHT = 600
    
    GATE_WIDTH, GATE_HEIGHT = 100, 10
    
    # Настройка экрана
    screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
    pygame.display.set_caption("Air Hockey")
    clock = pygame.time.Clock()
    background = pygame.transform.scale(
        pygame.image.load("background.png"), (ZONE_WIDTH, ZONE_HEIGHT))
    bluepad = pygame.transform.scale(
        pygame.image.load("Ok.png"), (BLUE_WIDTH, BLUE_HEIGHT))
    puck = pygame.transform.scale(
        pygame.image.load("ball.png"), (PUCK_WIDTH, PUCK_HEIGHT))
    redpad = pygame.transform.scale(
        pygame.image.load("about.png"), (SCREEN_WIDTH, SCREEN_HEIGHT))
    pos = pygame.mouse.get_pos()
    
    STICK_RADIUS = 5
    BALL_RADIUS = 10
    bluepad_speed_y = 10
    ball_speed_x = 2
    ball_speed_y = 2
    LOWER, UPPER = "lower", "upper"
    HOME, AWAY = "Player 1", "Player 2"
    START_SCORE = {HOME: 0, AWAY: 0}
    
    score = [0, 0]                                                  # +++
    
    
    class Ball():
        def __init__(self, x, y, radius):
            self.dx = 0
            self.dy = 0
            self.friction = 0.95
            self.rect = pygame.Rect(x, y, radius*2, radius*2)
    
        def draw(self):
            screen.blit(puck, self.rect.center)
    
        def update(self):
            # Добавляем инерцию
            self.dx *= self.friction
            self.dy *= self.friction
            self.rect.x += self.dx
            self.rect.y += self.dy
    
        def check_zone_collision(self, zone):
            if not self.rect.top > zone.rect.top:
                self.rect.top = zone.rect.top
                self.dy = -self.dy
            elif not self.rect.bottom < zone.rect.bottom:
                self.rect.bottom = zone.rect.bottom
                self.dy = -self.dy
    
            if not self.rect.left > zone.rect.left:
                self.rect.left = zone.rect.left
                self.dx = -self.dx
            elif not self.rect.right < zone.rect.right:
                self.rect.right = zone.rect.right
                self.dx = -self.dx
    
    
    class Gate():
        def __init__(self, x, y):
            self.x = x
            self.y = y
            self.rect = pygame.Rect(x,y,GATE_WIDTH, GATE_HEIGHT)
    
        def draw(self):
            pygame.draw.rect(screen, BROWN, self.rect)
    
    
    class Stick():
        def __init__(self, x, y, radius):
            self.dragging = False
            self.dx = 0
            self.dy = 0
            self.friction = 0.95
            self.rect = pygame.Rect(x, y, radius*2, radius*2)
    
        def draw(self):
            pygame.draw.circle(screen, BROWN, self.rect.center, self.rect.width // 2)
            screen.blit(bluepad, self.rect.center)
    
        def update(self):
            if not self.dragging:
                # Добавляем инерцию
                self.dx *= self.friction
                self.dy *= self.friction
                self.rect.x += self.dx
                self.rect.y += self.dy
    
        def check_zone_collision(self, zone):
            if not self.rect.top > zone.rect.top:
                self.rect.top = zone.rect.top
                self.dy = -self.dy
            elif not self.rect.bottom < zone.rect.bottom:
                self.rect.bottom = zone.rect.bottom
                self.dy = -self.dy
    
            if not self.rect.left > zone.rect.left:
                self.rect.left = zone.rect.left
                self.dx = -self.dx
            elif not self.rect.right < zone.rect.right:
                self.rect.right = zone.rect.right
                self.dx = -self.dx
    
    
    class Bot():
        def __init__(self, x, y, radius):
            self.dragging = False
            self.dx = 0
            self.dy = 0
            self.friction = 0.95
            self.redpad = pygame.transform.scale(
                pygame.image.load("im.png"), (BLUE_WIDTH, BLUE_HEIGHT))
            self.rect = pygame.Rect(x, y, radius * 2, radius * 2)
    
        def draw(self):
            screen.blit(self.redpad, self.rect.center)
            pygame.draw.circle(screen, GREEN, 
                self.rect.center, self.rect.width // 2)
    
        def move_bot(self):
            if ball.rect.center > self.rect.center and ball.rect.centerx > 450:
                self.dy += 1
            if ball.rect.center < self.rect.center and ball.rect.centerx > 450:
                self.dy -= 1
    
        def update(self):
            if not self.dragging:
                # Добавляем инерцию
                self.dx *= self.friction
                self.dy *= self.friction
                self.rect.x += self.dx
                self.rect.y += self.dy
    
        def check_zone_collision(self, zone):
            if not self.rect.top > zone.rect.top:
                self.rect.top = zone.rect.top
                self.dy = -self.dy
            elif not self.rect.bottom < zone.rect.bottom:
                self.rect.bottom = zone.rect.bottom
                self.dy = -self.dy
    
            if not self.rect.left > zone.rect.left:
                self.rect.left = zone.rect.left
                self.dx = -self.dx
            elif not self.rect.right < zone.rect.right:
                self.rect.right = zone.rect.right
                self.dx = -self.dx
    
    
    class Zone():
        def __init__(self, x, y, width, height):
            self.rect = pygame.Rect(x, y, width, height)
    
        def draw(self):
            screen.blit(background, self.rect)
    
    
    stick = Stick(250, 500, STICK_RADIUS)
    ball = Ball(275, 380, BALL_RADIUS)
    zone = Zone(100, 100, ZONE_WIDTH, ZONE_HEIGHT)
    bot = Bot(250, 250, STICK_RADIUS)
    gate_enemy = Gate(250, 100)
    gate_my = Gate(250, ZONE_HEIGHT+100)
    
    # Основной цикл игры
    running = True
    game_status = 'game'
    bluepad_speed_y = 0
    font_score = pygame.font.Font(None, 40)
    
    while running:
        screen.fill(BLUE)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            if event.type == pygame.MOUSEBUTTONDOWN:
                if event.button == 1 and stick.rect.collidepoint(event.pos):
                    stick.dragging = True
                    bluepad_speed_y -= 1
                    if game_status == 'menu':
                        game_status = 'game'
                        score = [0, 0]
            elif event.type == pygame.MOUSEBUTTONUP:
                stick.dragging = False
                bluepad_speed_y += 1
            elif event.type == pygame.MOUSEMOTION:
                if stick.dragging:
                    dx, dy = event.rel
                    stick.rect.x += dx
                    stick.rect.y += dy
                    stick.dx = dx
                    stick.dy = dy
    
        zone.draw()
    
        gate_my.draw()
        gate_enemy.draw()
    
        stick.update()
        stick.draw()
        stick.check_zone_collision(zone)
    
        ball.update()
        ball.draw()
        ball.check_zone_collision(zone)
    
        bot.draw()
        bot.move_bot()
    
    # +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
        if gate_enemy.rect.colliderect(ball.rect):
            score[0] += 1
            ball.rect = pygame.Rect(275, 380, BALL_RADIUS*2, BALL_RADIUS*2)     
    #        running = False
            if score[0] == 10:
                running = False
                print(f'\nКонец игры, забито 10 голов')
    # +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        if gate_my.rect.colliderect(ball.rect):
            running = False
            # ...
    
        if ball.rect.colliderect(stick.rect):
            ball.dx = stick.dx
            ball.dy = stick.dy
            stick.dx = -stick.dx
            stick.dy = -stick.dy
            
        keys = pygame.key.get_pressed()
    
        font_score.render(f"Счет {score}", True, WHITE)
        message_score = font_score.render(f"Счет ---> {score[0]} : {score[1]}", True, WHITE)
    #    message_rect = message_score.get_rect(center=(290, SCREEN_HEIGHT - 50))
        message_rect = message_score.get_rect(center=(100, 60))     # +
    
        screen.blit(message_score, message_rect)
        pygame.display.flip()
        clock.tick(FPS)
    
    pygame.quit()
    

    在此处输入图片描述

    在此处输入图片描述

    • 1

相关问题

  • 是否可以以某种方式自定义 QTabWidget?

  • telebot.anihelper.ApiException 错误

  • Python。检查一个数字是否是 3 的幂。输出 无

  • 解析多个响应

  • 交换两个数组的元素,以便它们的新内容也反转

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5