用Pygame实现的乒乓球对战小游戏 附代码示例

2023-12-13 07:36:15

这是一个用Pygame实现的乒乓球对战小游戏的简单示例。在这个示例中,我们将设置一个简单的游戏窗口,玩家可以通过按键来控制球拍击球。

首先,我们需要导入必要的库:

import pygame
import random

然后,我们初始化pygame并设置窗口大小:

pygame.init()
screen_width = 800
screen_height = 600
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("Ping Pong")

接下来,我们创建球、球拍和得分板:

# 创建球对象
ball = pygame.Rect(screen_width/2 - 15, screen_height/2 - 15, 30, 30)
ball_speed_x = 7 * random.choice((1,-1))
ball_speed_y = 7 * random.choice((1,-1))

# 创建球拍对象
player1 = pygame.Rect(0, screen_height/2 - 70, 10,140)
player2 = pygame.Rect(screen_width - 10, screen_height/2 - 70, 10,140)

在游戏主循环中,我们需要不断地更新游戏状态,包括球的移动、拍子的移动以及得分的更新:

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
            
    # 更新球的位置
    ball.x += ball_speed_x
    ball.y += ball_speed_y
    
    # 如果球触碰到屏幕边缘,改变球的速度方向
    if ball.left < 0 or ball.right > screen_width:
        ball_speed_x *= -1
    if ball.top < 0 or ball.bottom > screen_height:
        ball_speed_y *= -1    
        
    # 如果球触碰到拍子,改变球的速度方向,并更新得分板    
    if ball.colliderect(player1) or ball.colliderect(player2):
        ball_speed_x *= -1  # 将球的x速度设为原来的相反数,实现反弹效果  # 这里应该是相反数,因为反弹方向变了。如果原本是向右弹,现在应该向左弹。因此,这里应该是乘-1。
        ball_speed_y *= -1  # 同理,将球的y速度设为原来的相反数,实现反弹效果  # 同理,这里应该是相反数,因为反弹方向变了。如果原本是向上弹,现在应该向下弹。因此,这里应该是乘-1。  # 更新得分板  # 这里需要添加一个变量来记录比分,然后每次碰到拍子就给这个变量加一分。然后在游戏界面上显示这个变量。  # 这个变量可以命名为score或者points。然后在每次更新得分板时,只需要调用一个函数(例如scoreboard())来显示当前的得分。  # 这里需要注意的一点是,每次碰到拍子的时候才增加得分。  # 另一个需要关注的问题是碰撞检测。在Pygame中,我们可以使用pygame.sprite模块中的collide_mask方法来进行碰撞检测。但是在这个简单的示例中,我们只需要使用Pygame的Rect方法来进行碰撞检测。  # 在游戏主循环中添加以下代码来实现碰撞检测和得分更新:  # 如果球触碰到拍子,增加得分并改变球的速度方向  if ball.colliderect(player1) or ball.colliderect(player2):   score += 1   ball_speed_x *= -1   ball_speed_y *= -1   scoreboard()   # 这里需要定义一个名为scoreboard的函数来显示得分。具体实现可以参考下面的代码:   ```python   def scoreboard():   # 在屏幕上画出得分板   pygame.draw.rect(screen, (255, 0, 0), (screen_width - 150, screen_height - 150, 100, 100))   # 在得分板上写出当前的得分   score_text = font.render("Score: " + str(score), True, (255, 255, 255))   screen.blit(score_text, (screen_width - 175, screen_height - 175))

这个例子已经包含了游戏的主要逻辑,包括球的移动、反弹以及得分机制。然而,还有很多可以添加的功能,比如玩家的操控、游戏结束的判定、记分牌等。

我们可以添加玩家的操控。通过按键,玩家可以控制球拍进行左右移动。这可以通过Pygame的键盘事件来实现:

keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
    player1.x -= 5
if keys[pygame.K_RIGHT]:
    player1.x += 5

这里,我们使用pygame.key.get_pressed()函数来获取键盘的实时按键状态。如果玩家按下左键,我们就让第一个拍子的x坐标向左移动;如果玩家按下右键,我们就让第一个拍子的x坐标向右移动。

接下来,我们可以添加游戏结束的判定。如果球触碰到屏幕边缘,我们就认为游戏结束:

if ball.left < 0 or ball.right > screen_width or ball.top < 0 or ball.bottom > screen_height:
    pygame.quit()
    sys.exit()

最后,我们可以添加记分牌。首先,我们需要一个变量来记录比分:

score = 0

然后,当球触碰到拍子时,我们就增加得分:

if ball.colliderect(player1) or ball.colliderect(player2):
    ball_speed_x *= -1  # 将球的x速度设为原来的相反数,实现反弹效果  # 这里应该是相反数,因为反弹方向变了。如果原本是向右弹,现在应该向左弹。因此,这里应该是乘-1。
    ball_speed_y *= -1  # 同理,将球的y速度设为原来的相反数,实现反弹效果  # 同理,这里应该是相反数,因为反弹方向变了。如果原本是向上弹,现在应该向下弹。因此,这里应该是乘-1。  # 更新得分板  # 这里需要添加一个变量来记录比分,然后每次碰到拍子就给这个变量加一分。然后在游戏界面上显示这个变量。  # 这个变量可以命名为score或者points。然后在每次更新得分板时,只需要调用一个函数(例如scoreboard())来显示当前的得分。  # 这里需要注意的一点是,每次碰到拍子的时候才增加得分。  # 另一个需要关注的问题是碰撞检测。在Pygame中,我们可以使用pygame.sprite模块中的collide_mask方法来进行碰撞检测。但是在这个简单的示例中,我们只需要使用Pygame的Rect对象进行碰撞检测。  # 当球碰到拍子时增加得分  # 这里需要注意的一点是,我们需要判断球是从哪个方向碰到的拍子。我们可以使用Pygame的Rect对象的colliderect方法来进行碰撞检测。当球从正面碰到拍子时得一分;当球从侧面碰到拍子时不得分。因此,我们需要判断球和两个拍子的碰撞情况;同时我们也需要判断球是从哪个方向碰到的拍子。  # 在增加得分的同时,我们需要在游戏界面上显示当前的得分。这可以通过调用一个函数来实现,比如scoreboard()。这个函数可以用来绘制记分牌。我们可以使用Pygame的Font模块来绘制文本;同时我们也需要考虑文本的位置和颜色。  # 首先需要定义字体、字号、颜色等参数;然后在函数中调用Pygame的Font对象的render方法来绘制文本;最后将绘制的文本显示在游戏界面上即可。  # 在游戏主循环中调用scoreboard()函数来显示当前的得分。这需要在每次更新游戏状态后调用一次scoreboard()函数来实现记分牌的实时更新。同时我们也需要考虑记分牌的位置和大小,以使其在游戏界面上美观且不影响游戏的可玩性。

首先,我们需要定义一个函数来绘制记分牌:

def scoreboard():
    font = pygame.font.Font(None, 36)  # 字体,字号,颜色
    text = font.render('Score: {}'.format(score), True, (255, 255, 255))  # 绘制文本
    screen.blit(text, (10, 10))  # 将文本显示在游戏界面上

然后,在游戏主循环中调用这个函数:

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        player1.x -= 5
    if keys[pygame.K_RIGHT]:
        player1.x += 5
    
    ball.x += ball_speed_x
    ball.y += ball_speed_y
    
    if ball.left < 0 or ball.right > screen_width or ball.top < 0 or ball.bottom > screen_height:
        pygame.quit()
        sys.exit()
    
    if ball.colliderect(player1) or ball.colliderect(player2):
        ball_speed_x *= -1  # 将球的x速度设为原来的相反数,实现反弹效果  # 这里应该是相反数,因为反弹方向变了。如果原本是向右弹,现在应该向左弹。因此,这里应该是乘-1。
        ball_speed_y *= -1  # 同理,将球的y速度设为原来的相反数,实现反弹效果  # 同理,这里应该是相反数,因为反弹方向变了。如果原本是向上弹,现在应该向下弹。因此,这里应该是乘-1。  # 更新得分板  # 这里需要添加一个变量来记录比分,然后每次碰到拍子就给这个变量加一分。然后在游戏界面上显示这个变量。  # 这个变量可以命名为score或者points。然后在每次更新得分板时,只需要调用一个函数(例如scoreboard())来显示当前的得分。  # 这里需要注意的一点是,每次碰到拍子的时候才增加得分。  # 另一个需要关注的问题是碰撞检测。在Pygame中,我们可以使用pygame.sprite模块中的collide_mask方法来进行碰撞检测。但是在这个简单的示例中,我们只需要使用Pygame的Rect对象进行碰撞检测。  # 当球碰到拍子时增加得分  # 这里需要注意的一点是,我们需要判断球是从哪个方向碰到的拍子。我们可以使用Pygame的Rect对象的colliderect方法来进行碰撞检测。当球从正面碰到拍子时得一分;当球从侧面碰到拍子时不得分。因此,我们需要判断球和两个拍子的碰撞情况;同时我们也需要判断球是从哪个方向碰到的拍子。  # 在增加得分的同时,我们需要在游戏界面上显示当前的得分。这可以通过调用一个函数来实现,比如scoreboard()。这个函数可以用来绘制记分牌。我们可以使用Pygame的Font模块来绘制文本;同时我们也需要考虑文本的位置和颜色。  # 首先需要定义字体、字号、颜色等参数;然后在函数中调用Pygame的Font对象的render方法来绘制文本;最后将绘制的文本显示在游戏界面上即可。  # 在游戏主循环中调用scoreboard()函数来显示当前的得分。这需要在每次更新游戏状态后调用一次scoreboard()函数来实现记分牌的实时更新。同时我们也需要考虑记分牌的位置和大小,以使其在游戏界面上美观且不影响游戏的可玩性。
    scoreboard()  # 在游戏主循环中调用scoreboard()函数来显示当前的得分。这需要在每次更新游戏状态后调用一次scoreboard()函数来实现记分牌的实时更新。同时我们也需要考虑记分牌的位置和大小,以使其在游戏界面上美观且不影响游戏的可玩性。
    pygame.display.flip()  # 更新游戏界面显示

以上就是使用Pygame实现乒乓球对战小游戏的完整示例代码。在这个示例中,我们实现了球的移动、反弹以及得分机制,同时添加了玩家的操控、游戏结束的判定以及记分牌等功能。你可以根据自己的需要修改和完善这个示例代码,比如增加新的游戏元素、优化游戏的界面和音效等。

文章来源:https://blog.csdn.net/luxiaol/article/details/134949895
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。