【Python游戏】双人简单对战游戏
以下是一个使用 Python 的 pygame 库实现的简单对战游戏示例,游戏中玩家可以控制两个角色进行对战,并且支持自定义图片(最好使用无底色的png图片)。

完整源码以及实现思路:
import pygame
import os# 初始化 Pygame
pygame.init()# 设置游戏窗口
WIDTH, HEIGHT = 800, 600
WIN = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("对战游戏")# 加载角色图片(假设图片存在于当前目录下)
try:PLAYER1_IMAGE = pygame.image.load(os.path.join('player1.png')).convert_alpha()PLAYER2_IMAGE = pygame.image.load(os.path.join('player2.png')).convert_alpha()PLAYER1_IMAGE = pygame.transform.scale(PLAYER1_IMAGE, (100, 100))PLAYER2_IMAGE = pygame.transform.scale(PLAYER2_IMAGE, (100, 100))BULLET_IMAGE = pygame.image.load(os.path.join('bullet.png')).convert_alpha()BULLET_IMAGE = pygame.transform.scale(BULLET_IMAGE, (50, 50))
except FileNotFoundError:print("未找到角色或子弹图片,请确保 player1.png、player2.png 和 bullet.png 在当前目录。")pygame.quit()exit()# 定义颜色
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)# 定义字体
FONT = pygame.font.SysFont('comicsans', 30)# 定义子弹类
class Bullet(pygame.sprite.Sprite):def __init__(self, x, y, direction):super().__init__()self.image = BULLET_IMAGEself.rect = self.image.get_rect()self.rect.x = xself.rect.y = yself.speed = 10self.direction = directiondef update(self):if self.direction == 1: # 向右self.rect.x += self.speedelse: # 向左self.rect.x -= self.speed# 如果子弹超出屏幕范围,将其从精灵组中移除if self.rect.x < 0 or self.rect.x > WIDTH:self.kill()# 定义角色类
class Player(pygame.sprite.Sprite):def __init__(self, x, y, image):super().__init__()self.image = imageself.rect = self.image.get_rect()self.rect.x = xself.rect.y = yself.speed = 5self.health = 100self.attacking = Falseself.attack_cooldown = 0self.bullets = pygame.sprite.Group()def move_left(self):if self.rect.x > 0:self.rect.x -= self.speeddef move_right(self):if self.rect.x < WIDTH - self.rect.width:self.rect.x += self.speeddef move_up(self):if self.rect.y > 0:self.rect.y -= self.speeddef move_down(self):if self.rect.y < HEIGHT - self.rect.height:self.rect.y += self.speeddef attack(self):if self.attack_cooldown == 0:self.attacking = Trueself.attack_cooldown = 20# 创建子弹并添加到精灵组if self.image == PLAYER1_IMAGE:bullet = Bullet(self.rect.right, self.rect.centery, 1)else:bullet = Bullet(self.rect.left - self.rect.width, self.rect.centery, -1)self.bullets.add(bullet)def take_damage(self, damage):self.health -= damageif self.health < 0:self.health = 0def update(self):if self.attack_cooldown > 0:self.attack_cooldown -= 1if self.attack_cooldown == 0:self.attacking = Falseself.bullets.update()# 创建角色实例
player1 = Player(100, 250, PLAYER1_IMAGE)
player2 = Player(600, 250, PLAYER2_IMAGE)# 创建精灵组
all_sprites = pygame.sprite.Group()
all_sprites.add(player1, player2)# 主游戏循环
clock = pygame.time.Clock()
running = True
while running:clock.tick(60)# 处理事件for event in pygame.event.get():if event.type == pygame.QUIT:running = Falseelif event.type == pygame.KEYDOWN:if event.key == pygame.K_a:player1.move_left()elif event.key == pygame.K_d:player1.move_right()elif event.key == pygame.K_w:player1.move_up()elif event.key == pygame.K_s:player1.move_down()elif event.key == pygame.K_SPACE:player1.attack()elif event.key == pygame.K_LEFT:player2.move_left()elif event.key == pygame.K_RIGHT:player2.move_right()elif event.key == pygame.K_UP:player2.move_up()elif event.key == pygame.K_DOWN:player2.move_down()elif event.key == pygame.K_RETURN:player2.attack()# 更新角色状态player1.update()player2.update()# 检测子弹与角色的碰撞for bullet in player1.bullets:if pygame.sprite.collide_rect(bullet, player2):player2.take_damage(10)bullet.kill()for bullet in player2.bullets:if pygame.sprite.collide_rect(bullet, player1):player1.take_damage(10)bullet.kill()# 绘制背景WIN.fill(WHITE)# 绘制血量条pygame.draw.rect(WIN, RED, (10, 10, 200, 20))pygame.draw.rect(WIN, GREEN, (10, 10, 2 * player1.health, 20))pygame.draw.rect(WIN, RED, (WIDTH - 210, 10, 200, 20))pygame.draw.rect(WIN, GREEN, (WIDTH - 210, 10, 2 * player2.health, 20))# 绘制血量数值player1_health_text = FONT.render(f"Player 1 Health: {player1.health}", 1, RED)player2_health_text = FONT.render(f"Player 2 Health: {player2.health}", 1, RED)WIN.blit(player1_health_text, (10, 40))WIN.blit(player2_health_text, (WIDTH - 210, 40))# 绘制角色和子弹all_sprites.draw(WIN)player1.bullets.draw(WIN)player2.bullets.draw(WIN)# 检查游戏结束if player1.health <= 0:winner_text = FONT.render("Player 2 Wins!", 1, RED)WIN.blit(winner_text, (WIDTH // 2 - winner_text.get_width() // 2, HEIGHT // 2 - winner_text.get_height() // 2))pygame.display.flip()pygame.time.delay(3000)running = Falseelif player2.health <= 0:winner_text = FONT.render("Player 1 Wins!", 1, RED)WIN.blit(winner_text, (WIDTH // 2 - winner_text.get_width() // 2, HEIGHT // 2 - winner_text.get_height() // 2))pygame.display.flip()pygame.time.delay(3000)running = False# 更新显示pygame.display.flip()# 退出 Pygame
pygame.quit()
代码说明:
1、子弹类 Bullet:
继承自 pygame.sprite.Sprite,包含子弹的位置、速度和方向等属性。
update 方法用于更新子弹的位置,当子弹超出屏幕范围时,将其从精灵组中移除。
2、角色类 Player:
添加了 bullets 属性,用于管理该角色发射的子弹精灵组。
在 attack 方法中,当角色攻击时,创建子弹对象并添加到 bullets 精灵组中。
update 方法中调用 self.bullets.update() 来更新子弹的状态。
3、主循环部分:
增加了检测子弹与角色碰撞的逻辑,当子弹击中对方角色时,对方角色扣血,子弹消失。
在绘制部分,除了绘制角色,还绘制了角色发射的子弹。
使用方法:
1、将代码保存为一个 Python 文件(例如 battle_game_with_bullets.py)。
准备三张图片,分别命名为 player1.png、player2.png 和 bullet.png,并将它们放在与代码文件相同的目录下。
2、运行代码,即可开始游戏。玩家 1 使用 A、D、W、S 键移动(记得开启大写),Space 键攻击;玩家 2 使用方向键移动,Enter 键攻击。攻击时会发射子弹,子弹击中对方角色可造成伤害。
可以自由补充扩展
相关文章:
【Python游戏】双人简单对战游戏
以下是一个使用 Python 的 pygame 库实现的简单对战游戏示例,游戏中玩家可以控制两个角色进行对战,并且支持自定义图片(最好使用无底色的png图片)。完整源码以及实现思路: import pygame import os# 初始化 Pygame pygame.init()# 设置游戏窗…...
Windows11切换回Windows10风格右键菜单
参考文章:Win11新版右键菜单用不惯?一键切换回Win10经典版!-CSDN博客 以管理员权限运行命令行cmd 切换为经典旧版右键菜单,执行 reg.exe add “HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServe…...
怎么学习调试ISP的参数
摄像头的 **Sensor 获取的 RAW 数据** 是未经处理的原始图像数据,通常需要经过 **ISP(Image Signal Processor,图像信号处理器)** 的处理,才能生成可用的图像或视频。ISP 的作用是对 RAW 数据进行一系列图像处理操作&a…...
“三次握手”与“四次挥手”:TCP传输控制协议连接过程
目录 什么是TCP协议 “三次握手”建立连接 “四次挥手”断开连接 “三次握手”和“四次挥手”的反思 总结 什么是TCP协议 想象一下,你和远方的朋友要进行一场电话交流,但这通电话不仅仅是随便聊聊,而是要传递一封重要的信件。为了确保这…...
OpenCV形态学操作
1.1. 形态学操作介绍 初识: 形态学操作是一种基于图像形状的处理方法,主要用于分析和处理图像中的几何结构。其核心是通过结构元素(卷积核)对图像进行扫描和操作,从而改变图像的形状和特征。例如: 腐蚀&…...
深入理解WebSocket接口:如何使用C++实现行情接口
在现代网络应用中,实时数据传输变得越来越重要。通过WebSocket,我们可以建立一个持久连接,让服务器和客户端之间进行双向通信。这种技术不仅可以提供更快的响应速度,还可以减少不必要的网络流量。本文将详细介绍如何使用C来实现We…...
汇能感知的光谱相机/模块产品有哪些?
CM020A 分辨率:1600H1200V 光谱范围:350~950nm 光谱分辨率:1nm 接口:USB2.0 帧率:16001200 (6帧) 输出格式:Raw 8bit FOV:D73.5H58.8V44.1 相机尺寸:505055mm VM02S10 分辨率…...
抓包工具是什么?
抓包工具是一种用于捕获和分析网络数据包的软件或硬件设备。它可以帮助用户监控网络通信过程,查看网络中传输的数据内容、协议类型、源地址、目的地址等信息。以下是关于抓包工具的一些详细解释: 1. 主要功能 捕获数据包:抓包工具能够实时捕…...
Kubernetes的Ingress 资源是什么?
在Kubernetes中,Ingress资源是一种用于管理集群外部对内部服务访问的API对象,主要用于将不同的外部请求路由到集群内的不同服务,以下是关于它的详细介绍: 定义与作用 Ingress资源定义了从集群外部到内部服务的HTTP和HTTPS路由规…...
【操作幂等和数据一致性】保障业务在MySQL和COS对象存储的一致
业务场景 发布信息,更新到数据库MySQLCOS操作,更新JSON文件 不过可能存在幂等性和数据一致性的问题。 // 批量存MySQL entityPublishService.saveOrUpdateBatch(entityPublishList); // 遍历批量存COS对象存储searchEntitys.forEach(req -> {//删除…...
DevOps自动化部署详解:从理念到实践
在软件开发日益快速迭代的今天,如何以高效、稳定且可重复的方式将代码变更从开发环境自动部署到生产环境成为企业竞争的重要因素。DevOps 正是在这一背景下应运而生,它打破开发、测试、运维之间的壁垒,通过自动化工具和流程,实现持…...
LeetCodehot 力扣热题100
class Solution { public:int max_sum INT_MIN; // 初始化为最小值,确保能够处理所有可能的路径和int maxPathSum(TreeNode* root) {dfs(root);return max_sum;}int dfs(TreeNode* root) {if (root nullptr) return 0; // 如果是空节点,返回0// 递归…...
解锁 AIoT 无限可能,乐鑫邀您共赴 Embedded World 2025
2025 年 3 月 11-13 日,全球规模最大的嵌入式展览会——Embedded World 2025 将在德国纽伦堡盛大开幕。作为物联网和嵌入式技术领域的领先企业,乐鑫信息科技 (688018.SH) 将展示在 AI LLM、HMI、双频 Wi-Fi 6、低功耗 MCU 和 Matter 等领域的最新技术及解…...
C# 背景 透明 抗锯齿 (效果完美)
主要是通过 P/Invoke 技术调用 Windows API 函数 gdi32.dll/user32.dll,同时定义了一些结构体来配合这些 API 函数的使用,常用于处理图形绘制、窗口显示等操作。 运行查看效果 局部放大,抗锯齿效果很不错,尾巴毛毛清晰可见。 using System; u…...
Debezium:实时数据捕获与同步的利器
一、什么是 Debezium Debezium 是一个开源的分布式平台,专门用于捕获数据库中的数据变更。它通过读取数据库的事务日志,能够以非侵入性的方式捕获数据库中发生的所有变化,并将这些变化转化为事件流,实时推送到像 Kafka 这样的消息…...
Word中接入大模型教程
前言 为什么要在word中接入大模型呢? 个人觉得最大的意义就是不用来回切换与复制粘贴了吧。 今天分享一下昨天实践的在word中接入大模型的教程。 在word中接入大模型最简单的方式就是使用vba。 vba代码要做的事,拆分一下就是: 获取用户…...
Centos修改ip
1 查看ip [rootlocalhost ~]# ip addr2 root账号修改ip [rootlocalhost ~]# su [rootlocalhost ~]# cd /etc/sysconfig/network-scripts/ [rootlocalhost network-scripts]# llvi编辑ifcfg-ens33 3 重启网卡 [rootlocalhost network-scripts]# systemctl restart network...
uni-app小程序开发 基础知识2
目标: 构建一个文章发表平台。 我们先来写一个静态框架。 以下是 首页初代码文章列表页代码: <template><view class"content"><!-- 轮播图 --><swiper class"swiper-container" autoplay"true"…...
第4章 4.1 Entity Framework Core概述
4.1.1 什么是ORM ORM (object tralstional mapping ,对象关系映射)中的“对象”指的就是C#中的对象,而“关系”是关系型数据库,“映射”指搭建数据库与C#对象之间的“桥梁”。 比如使用ORM ,可以通过创建C#对象的方式把数据插入数据库而不需…...
在 Spring Boot 中使用 `@Autowired` 和 `@Bean` 注解
文章目录 在 Spring Boot 中使用 Autowired 和 Bean 注解示例背景 1. 定义 Student 类2. 配置类:初始化 Bean3. 测试类:使用 Autowired 注解自动注入 Bean4. Spring Boot 的自动装配5. 总结 在 Spring Boot 中使用 Autowired 和 Bean 注解 在 Spring Bo…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...
论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving
地址:LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂,正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...
yaml读取写入常见错误 (‘cannot represent an object‘, 117)
错误一:yaml.representer.RepresenterError: (‘cannot represent an object’, 117) 出现这个问题一直没找到原因,后面把yaml.safe_dump直接替换成yaml.dump,确实能保存,但出现乱码: 放弃yaml.dump,又切…...
PH热榜 | 2025-06-08
1. Thiings 标语:一套超过1900个免费AI生成的3D图标集合 介绍:Thiings是一个不断扩展的免费AI生成3D图标库,目前已有超过1900个图标。你可以按照主题浏览,生成自己的图标,或者下载整个图标集。所有图标都可以在个人或…...
