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

这是一个用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_xball.y += ball_speed_y# 如果球触碰到屏幕边缘,改变球的速度方向if ball.left < 0 or ball.right > screen_width:ball_speed_x *= -1if 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 -= 5if keys[pygame.K_RIGHT]:player1.x += 5ball.x += ball_speed_xball.y += ball_speed_yif 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实现乒乓球对战小游戏的完整示例代码。在这个示例中,我们实现了球的移动、反弹以及得分机制,同时添加了玩家的操控、游戏结束的判定以及记分牌等功能。你可以根据自己的需要修改和完善这个示例代码,比如增加新的游戏元素、优化游戏的界面和音效等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/216070.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jenkins 添加node节点

安装SSH插件 Jenkins- 插件管理- 可选插件- 搜索SSH Agent 配置启用SSH Server Jenkins- 系统管理 - 全局安全配置&#xff0c; 把 SSH Server 设置为启用(默认是禁用) 新增节点 第一种方式&#xff08;SSH密钥连接&#xff09;&#xff1a; 1.Jenkins主机生成SSH密钥 [rootk…

Spring支持哪几种事务管理类型,Spring 的事务实现方式和实现原理是?

1.Spring事务简介 事务作用&#xff1a;在数据层保障一系列的数据库操作同成功同失败 Spring事务作用&#xff1a;在数据层或业务层保障一系列的数据库操作同成功同失败 为何需要在业务层处理事务&#xff1f;&#xff1a;有些操作在数据层无法保证同成功同失败&#xff0c;…

Python简单网抑云数据采集 JS逆向

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 环境使用: Python 3.10 Pycharm 模块使用: requests -> pip install requests execjs -> pip install execjs 爬虫实现基本思路流程: 一. 数据来源分析: 明确需求: 明确采集的网站以及数据内容 网址: https://mu…

【Spark精讲】Spark任务运行流程

Spark任务执行流程 部署模式是根据Drvier和Executor的运行位置的不同划分的。client模式提交任务与Driver进程在同一个节点上&#xff0c;而cluster模式提交任务与Driver进程不在同一个节点。 Client模式 Clinet模式是在spark-submit提交任务的节点上运行Driver进程。 执行流…

《码农的噩梦与修电脑的奇幻之旅》

故事从一个充满梦想的码农学习计算机编程开始。他对编写程序充满了热情&#xff0c;认为自己就像是一位能够编织魔法的巫师&#xff0c;能够创造出炫酷的虚拟世界。 然而&#xff0c;这个充满幻想的故事在码农入门的第一天就遭遇了突如其来的挫折。电脑故障了&#xff01;所有…

数据结构 | 二叉树交换左右子树

二叉树交换左右子树的三种实现方式_交换二叉树的左右子树-CSDN博客

全网最新最全的基于Tensorflow和PyTorch深度学习环境安装教程: Tensorflow 2.10.1 加 CUDA 11.8 加 CUDNN8.8.1加PyTorch2.0.0

本文编写日期是&#xff1a;2023年4月. Python开发环境是Anaconda 3.10版本&#xff0c;具体Anaconda的安装这里就不赘述了&#xff0c;基础来的。建议先完整看完本文再试&#xff0c;特别是最后安装过程经验分享&#xff0c;可以抑制安装过程中一些奇怪的念头&#xff0c;减少…

mongodb之mongoTemplate基本操作

mongoTemplate基本操作 前提&#xff1a;已安装好mongodb服务 架构&#xff1a;springbootmongodb 1.引入依赖&#xff08;二选一&#xff09; // maven添加依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot…

气动工具市场分析:预计2029年将达到725亿元

从广义上讲&#xff0c;气动工具主要是利用压缩空气带动气动马达而对外输出动能工作的一种工具&#xff0c;根据其基本工作方式可分为&#xff1a;1)旋转式(偏心可动叶片式)&#xff1b;2)往复式(容积活塞式)一般气动工具主要由动力输出部分、作业形式转化部分、进排气路部分、…

排序与算法--冒泡排序

1.原理 比较两个相邻的元素&#xff0c;将较大的值交换到右边 2.举例&#xff1a;2 8 7 5 9 4 3 第一趟&#xff1a; 第一次&#xff1a;比较第一个和第二个&#xff1a;2 8 &#xff0c;不需要交换 第二次&#xff1a;比较 8 7&#xff0c;将8和7进行交换&#xff1a;2 7 …

【Python】webp图片转jpg

webp这种图片格式&#xff0c;是谷歌公司专门针对谷歌浏览器发布的一种全新的图片格式。相对于传统的jpg和png格式&#xff0c;webp格式的优势非常明显&#xff0c;更小的体积和肉眼无法区别出来的压缩损耗。但是对于很多人来说&#xff0c;下载下来之后使用不太方便&#xff0…

HT1621B新版本字段式驱动显示芯片替代PC1621K

PC1621K是一个32*4的LCD驱动器&#xff0c;可软体程控使其适用于多样化的LCD应用线路&#xff0c;仅用到3至4条讯号线便可控制LCD驱动器&#xff0c;除此之外也可介由指令使其进入省电模式 特色&#xff1a; 工作电压&#xff1a;2.4-5.2V 内建256KHz RC oscillator可外接 …

keil生成bin文件(通用型)

有些时候需要在keil里面生成bin文件&#xff0c;但找到的各种方式五花八门&#xff0c;特别是要填写文件路径等没有通用性&#xff0c;搞个不同的工程就得改下&#xff0c;找到这个跟路径无关的代码&#xff0c;进行记录下。 首先还是点开keil的设置&#xff1a; 按照上面的图…

from pycocotools.coco import COCO报错

需要注意的是&#xff0c;自己的系统是windows还是linux的系统&#xff1a; windows系统的安装&#xff1a; pip install pycocotools-windows linux的系统安装&#xff1a; pip install pycocotools 别用错了命令哦&#xff01;

html创建电子邮件链接

refer: 可以在a标签里使用&#xff1a; <a href"mailto:nameemail.com">Email</a>

【数据结构】平衡树引入

数据结构-平衡树 前置知识 二叉树二叉树的中序遍历 问题 维护一个数据结构&#xff0c;支持插入元素、删除元素、查询元素的排名、查询排名对应的元素、查询元素的前驱、查询元素的后继等。 BST&#xff08;二叉搜索树&#xff09; 作为一个基本无效&#xff08;很容易卡掉…

【大模型】800万纯AI战士年末大集结,硬核干货与音乐美食12月28日准时开炫

文章目录 WAVE SUMMIT五载十届&#xff0c;AI开发者热血正当时酷炫前沿、星河共聚&#xff01;大模型技术生态发展正当时 回望2023年&#xff0c;大语言模型或许将是科技史上最浓墨重彩的一笔。从技术、产业到生态&#xff0c;大语言模型在突飞猛进中加速重构万物。随着理解、生…

解决Sortable拖动el-table表头时,由于选择列造成的拖拽顺序错乱的bug

原因 由于我的表头是由数组循环遍历生成的&#xff0c;而选择列不在数组内&#xff0c;只能在循环外定义el-table-column&#xff0c;造成拖动时索引错乱错误代码 <el-tableheader-dragend"headerDragend"id"out-table":data"state.sliceTable&quo…

[Linux] ps命令详解

ps命令 ps命令用于显示当前系统中的进程状态信息。以下是ps命令的一些常见参数及其作用&#xff1a; ps命令的基本形式&#xff1a; ps这将显示当前用户自己的运行中的进程的快照。 参数选项&#xff1a; -a: 显示所有进程&#xff0c;包括其他用户的进程。 -u: 显示与用户相…

Tomcat9运行 tomcat9w.exe 提示“指定服务未安装”

Tomcat9运行 tomcat9w.exe 提示“指定服务未安装” 问题描述解决方案 问题描述 Tomcat启动项目时&#xff0c;命令窗口显示内存不足&#xff0c;网上查到博客提到需要 运行 tomcat9w.exe 修改内存设置&#xff0c;运行 tomcat9w.exe 时提示如下。 解决方案 配置环境变量CAT…