用Python打造你的第一款3D第一人称射击游戏

## 1. 为什么用Python做3D射击游戏?你可能想错了 很多朋友一听到“用Python做3D第一人称射击游戏”,第一反应可能是:“Python?那个写脚本、搞数据分析的语言?能做3D游戏?还是FPS?开玩笑吧!” 我刚开始也是这么想的。作为一个玩了十几年《反恐精英》、《使命召唤》的老玩家,同时又是个写了多年Python的程序员,我一直觉得这两件事是两条平行线,永远不会相交。游戏开发,尤其是3D游戏,那不该是C++、C#的天下吗?Unity、Unreal Engine这些大家伙,才是正途。 直到有一次,我想给一个编程入门课的学生们做个有趣的项目,让他们能直观地看到自己代码的“威力”。用Unity?门槛太高,光是安装配置和界面就能劝退一大半初学者。用纯2D的Pygame做个小游戏?又觉得不够酷,激发不了他们的兴趣。就在我纠结的时候,我忽然想:为什么不试试用Python挑战一下3D FPS的底线呢?不追求《战地》级别的画面,只做一个能跑、能看、能开枪打怪的“玩具”级别的3D游戏,行不行? 实测下来,**不仅行,而且出乎意料地有趣和具有启发性**。Python做3D游戏,核心优势不在于性能(这点我们必须承认),而在于**极低的入门门槛和快速的反馈循环**。你不需要理解复杂的图形学API(比如OpenGL或DirectX),不需要被庞大的游戏引擎编辑器吓到。你只需要一个Python解释器,几个轻量级的库,就能从零开始,亲手“捏”出一个属于你自己的3D世界。这个过程,就像用乐高积木搭建城堡,每一块砖(每一行代码)都是你自己放上去的,那种成就感和对底层机制的理解,是使用现成引擎无法比拟的。 所以,这篇文章不是教你做一个能上架Steam的商业游戏,而是带你进行一次**充满乐趣的编程探险**。目标读者就是像当年的我一样的Python初学者,或者对游戏开发好奇但被传统路径吓退的朋友。我们会用最直白的语言,从画出一个3D的方块开始,一步步让你的人物动起来,让视角跟随鼠标,最后扣动扳机,击中迎面飞来的怪物。相信我,当你看到自己写的代码让一个3D角色在屏幕上奔跑射击时,那种感觉,绝对比通关任何一个3A大作都来得爽快。 ## 2. 搭建你的3D游戏开发环境:别在第一步就放弃 万事开头难,但咱们把这个“难”降到最低。你不需要安装几个G的软件,也不需要配置复杂的环境变量。跟着我做,五分钟内让你进入状态。 ### 2.1 核心三件套:Python、Pygame和Panda3D 首先,确保你安装了Python。我推荐使用**Python 3.8或以上版本**,太老的版本可能会遇到库兼容性问题。去Python官网下载安装就行,记得勾选“Add Python to PATH”,这是避免后续各种“命令找不到”问题的关键。 接下来是重头戏:游戏库。原始文章提到了`sprites`模块,这很可能是一个教学用的自定义库。为了更通用、更贴近真实的3D开发,我强烈推荐一个组合:**Pygame + PyOpenGL**,或者一个更全能的选项:**Panda3D**。这里我主要介绍Panda3D路线,因为它对3D的支持更原生、文档更完善,且完全免费开源。 - **Pygame**:这是我们处理2D图像、声音、键盘鼠标输入的基础层。虽然它本身对3D支持很弱,但它的易用性无可替代,我们将用它来捕获输入和管理窗口。 - **Panda3D**:一个功能强大的3D游戏引擎,由迪士尼和卡内基梅隆大学共同开发。它用C++编写核心,但提供了完美的Python接口。**它的强大之处在于,你无需接触底层OpenGL,就能加载3D模型、设置灯光、摄像机,管理场景图**。 安装它们非常简单,打开你的命令行(CMD或终端),输入以下命令: ```bash pip install pygame pip install panda3d ``` 如果安装速度慢,可以在后面加上 `-i https://pypi.tuna.tsinghua.edu.cn/simple` 来使用国内镜像加速。 ### 2.2 验证安装与第一个“Hello, 3D World” 安装完成后,我们写一个最简单的程序来验证一切是否正常。创建一个新文件,比如叫 `my_first_3d.py`,输入以下代码: ```python import direct.directbase.DirectStart from panda3d.core import * # 加载一个自带的茶壶模型(经典3D测试模型) teapot = loader.loadModel("models/teapot") teapot.reparentTo(render) # 将茶壶放入渲染场景 teapot.setPos(0, 10, 0) # 设置位置 (x, y, z) # 设置摄像机位置 base.cam.setPos(0, -20, 5) base.cam.lookAt(teapot) # 开始主循环 run() ``` 保存后运行这个Python脚本。如果一切顺利,你应该会看到一个窗口,里面有一个灰色的3D茶壶在缓缓旋转(Panda3D默认会给场景一个旋转动画)。恭喜你!你的第一个3D程序已经跑起来了。如果报错,最常见的原因是Panda3D的模型路径问题,你可以尝试将 `"models/teapot"` 替换为 `"panda3d/models/box.egg"` 来加载一个更简单的方块模型。 这个简单的例子揭示了Panda3D工作的核心流程:**加载模型(Load) -> 放入场景(Reparent) -> 设置变换(Position/Rotation) -> 运行主循环(Run)**。我们后续所有复杂的游戏逻辑,都是在这个框架上添砖加瓦。 ## 3. 构建游戏世界的基石:地图、玩家与摄像机 现在茶壶会转了,但我们想要的是一个第一人称视角的游戏世界。这意味着我们需要一个可以行走的地面,一个代表玩家的视点(摄像机),以及让这个视点能受我们控制。 ### 3.1 创建地面和简单的围墙 在3D游戏中,地面通常就是一个巨大的、铺平的立方体(或者一个平面)。我们用Panda3D创建一个地面,并给它贴上简单的纹理,让它看起来不像一个光秃秃的灰色方块。 ```python from direct.showbase.ShowBase import ShowBase from panda3d.core import * class MyGame(ShowBase): def __init__(self): super().__init__() # 初始化Panda3D引擎 # 1. 创建地面 self.ground = loader.loadModel("models/box") self.ground.reparentTo(render) self.ground.setScale(50, 50, 0.5) # 把它压扁,变成一个厚地板 self.ground.setPos(0, 0, -1) # 放在Z轴-1的位置 # 我们可以加载一个草地纹理图片(需要你自己准备一个grass.jpg放在代码同级目录) ground_tex = loader.loadTexture("grass.jpg") self.ground.setTexture(ground_tex, 1) # 2. 创建几面墙,围成一个简单的房间 self.wall1 = loader.loadModel("models/box") self.wall1.reparentTo(render) self.wall1.setScale(20, 1, 5) self.wall1.setPos(0, 25, 2) # 远处的墙 wall_tex = loader.loadTexture("brick.jpg") # 砖墙纹理 self.wall1.setTexture(wall_tex, 1) # 类似的,可以再创建左、右、近处的墙,这里省略... ``` 通过调整`setScale`和`setPos`,你就能像搭积木一样构建出游戏场景的雏形。`setScale`的三个参数分别代表X(宽)、Y(长)、Z(高)方向的缩放。在3D坐标系中,通常X是左右,Y是前后,Z是上下。 ### 3.2 实现第一人称摄像机控制 这是FPS游戏的灵魂。在Panda3D中,我们不需要创建一个“玩家模型”,**摄像机(Camera)就是玩家的眼睛**。我们需要做两件事:让摄像机的位置能通过键盘(WASD)移动,让摄像机的朝向能通过鼠标控制。 Panda3D提供了一个非常方便的组件叫 `FirstPersonWalker`,但为了更透彻地理解原理,我们手动实现一个。 ```python class MyGame(ShowBase): def __init__(self): # ... 之前的初始化代码 ... # 初始化玩家变量 self.player_speed = 5.0 self.mouse_sensitivity = 0.2 self.heading = 0 # 左右旋转角度(偏航角Yaw) self.pitch = 0 # 上下旋转角度(俯仰角Pitch) # 禁用默认的鼠标控制,让我们自己来 self.disableMouse() # 隐藏鼠标光标 props = WindowProperties() props.setCursorHidden(True) self.win.requestProperties(props) # 设置任务管理器,在每一帧都调用我们的更新函数 self.taskMgr.add(self.update, "update") def update(self, task): dt = globalClock.getDt() # 获取上一帧到这一帧的时间差,保证移动速度与帧率无关 # --- 键盘控制移动 --- is_moving = False move_vector = Vec3(0, 0, 0) # 移动方向向量 if self.mouseWatcherNode.is_button_down(KeyboardButton.ascii_key('w')): move_vector.y += 1 # 向前 is_moving = True if self.mouseWatcherNode.is_button_down(KeyboardButton.ascii_key('s')): move_vector.y -= 1 # 向后 is_moving = True if self.mouseWatcherNode.is_button_down(KeyboardButton.ascii_key('a')): move_vector.x -= 1 # 向左 is_moving = True if self.mouseWatcherNode.is_button_down(KeyboardButton.ascii_key('d')): move_vector.x += 1 # 向右 is_moving = True if is_moving: # 将移动向量归一化(防止斜向移动更快),然后根据摄像机的朝向旋转这个向量 move_vector.normalize() move_vector *= self.player_speed * dt # 根据当前的偏航角(heading)旋转移动方向,使其与摄像机朝向对齐 move_vector.rotateXZ(self.heading) # 应用移动 self.camera.setPos(self.camera.getPos() + move_vector) # --- 鼠标控制视角 --- if self.mouseWatcherNode.hasMouse(): # 获取鼠标自上一帧以来的移动量 md = self.win.getPointer(0) x = md.getX() - self.win.getXSize() // 2 y = md.getY() - self.win.getYSize() // 2 if x != 0 or y != 0: # 根据鼠标移动更新旋转角度 self.heading -= x * self.mouse_sensitivity * dt self.pitch -= y * self.mouse_sensitivity * dt # 限制上下看的幅度,避免脖子拧断 self.pitch = max(min(self.pitch, 90), -90) # 应用旋转:先上下看(pitch),再左右转(heading) self.camera.setHpr(self.heading, self.pitch, 0) # 将鼠标指针重置到窗口中心,实现“无限移动” self.win.movePointer(0, self.win.getXSize() // 2, self.win.getYSize() // 2) return task.cont # 告诉任务管理器继续执行这个任务 ``` 这段代码是**第一人称控制的核心**。它做了以下几件事: 1. **键盘输入**:检测WASD键,计算出一个移动方向向量。 2. **帧时间独立**:使用 `globalClock.getDt()` 乘以速度,确保无论电脑快慢,移动速度是恒定的。 3. **鼠标输入**:获取鼠标相对窗口中心的偏移量,转换成摄像机的左右旋转(`heading`)和上下旋转(`pitch`)。 4. **视角变换**:通过 `setHpr`(Heading, Pitch, Roll)方法设置摄像机的朝向。 5. **鼠标重置**:将鼠标指针移回窗口中心,模拟FPS游戏中鼠标可以无限拖动视角的效果。 现在运行代码,你应该能使用WASD在一个简单的房间内移动,并用鼠标环顾四周了!一个3D FPS的雏形已经诞生。 ## 4. 注入灵魂:怪物、射击与碰撞检测 有了世界和移动能力,接下来就需要有互动的对象——怪物,以及和它们互动的方式——射击。 ### 4.1 创建并让怪物动起来 我们不会用复杂的怪物AI,先做一个沿着固定路径飞行的“蝙蝠”或者“无人机”。我们可以用Panda3D加载一个简单的模型(比如一个球体或一个自带的熊猫模型)作为怪物。 ```python def __init__(self): # ... 之前的初始化代码 ... # 加载怪物模型 self.enemy = loader.loadModel("models/panda-model") self.enemy.reparentTo(render) self.enemy.setScale(0.5, 0.5, 0.5) self.enemy.setPos(10, 10, 2) # 初始位置 self.enemy.setColor(1, 0, 0, 1) # 给它染成红色,显得有敌意 # 怪物属性 self.enemy_speed = 3.0 self.enemy_path_index = 0 # 定义怪物巡逻路径点 self.enemy_path = [Vec3(10, 10, 2), Vec3(-10, 10, 2), Vec3(-10, -10, 2), Vec3(10, -10, 2)] def update(self, task): dt = globalClock.getDt() # ... 之前的玩家控制代码 ... # --- 更新怪物行为 --- target_pos = self.enemy_path[self.enemy_path_index] current_pos = self.enemy.getPos() # 计算朝向目标点的方向 direction = target_pos - current_pos distance = direction.length() # 到目标点的距离 if distance > 0.1: # 如果还没到达目标点,就朝它移动 direction.normalize() self.enemy.setPos(current_pos + direction * self.enemy_speed * dt) # 让怪物面朝移动方向(可选) self.enemy.lookAt(target_pos) else: # 到达目标点,切换到下一个点 self.enemy_path_index = (self.enemy_path_index + 1) % len(self.enemy_path) return task.cont ``` 现在你的世界里就有一个红色的熊猫在四个点之间来回巡逻了。虽然行为简单,但它已经是一个合格的“靶子”了。 ### 4.2 实现射击机制:从射线检测到命中反馈 FPS游戏的射击,本质上是从摄像机中心发出一条看不见的射线(Ray),检测这条射线击中了场景中的哪个物体。Panda3D的碰撞系统让这个变得很简单。 ```python def __init__(self): # ... 之前的初始化代码 ... # 设置碰撞系统 from panda3d.core import CollisionTraverser, CollisionHandlerQueue, CollisionRay, CollisionNode self.cTrav = CollisionTraverser() # 碰撞遍历器 self.cHandler = CollisionHandlerQueue() # 碰撞处理器(队列) # 创建一条从摄像机发出的碰撞射线 self.ray = CollisionRay() self.rayNode = CollisionNode('mouseRay') self.rayNode.addSolid(self.ray) self.rayNP = self.camera.attachNewNode(self.rayNode) # 将射线节点附加到摄像机 self.rayNode.setFromCollideMask(BitMask32.bit(1)) # 设置从哪一层碰撞掩码发出 self.rayNode.setIntoCollideMask(BitMask32.allOff()) # 设置不与任何层碰撞(由被撞物体决定) # 为怪物设置碰撞体(一个包围球) enemy_col_node = CollisionNode('enemy') enemy_col_node.addSolid(CollisionSphere(0, 0, 0, 1.0)) # 半径为1的球体 enemy_col_node.setIntoCollideMask(BitMask32.bit(1)) # 设置怪物在第1层碰撞掩码 self.enemy_col_np = self.enemy.attachNewNode(enemy_col_node) # 将射线加入到碰撞遍历器中 self.cTrav.addCollider(self.rayNP, self.cHandler) # 射击相关 self.is_shooting = False self.mouse1 = MouseButton.one() self.accept('mouse1', self.start_shoot) # 按下鼠标左键 self.accept('mouse1-up', self.stop_shoot) # 松开鼠标左键 # 加载射击音效(需要准备一个fire.wav文件) self.fire_sound = loader.loadSfx("fire.wav") def start_shoot(self): self.is_shooting = True # 立即进行一次射击检测 self.do_shoot() def stop_shoot(self): self.is_shooting = False def do_shoot(self): # 播放音效 if self.fire_sound: self.fire_sound.play() # 更新射线起点为摄像机位置,方向为摄像机正前方 self.ray.setOrigin(self.camera.getPos()) self.ray.setDirection(self.camera.getQuat().getForward()) # 清空上一帧的碰撞结果,进行新的碰撞检测 self.cHandler.clearEntries() self.cTrav.traverse(render) if self.cHandler.getNumEntries() > 0: # 有碰撞发生!按距离排序,取第一个(最近的)碰撞点 self.cHandler.sortEntries() entry = self.cHandler.getEntry(0) hit_node = entry.getIntoNodePath() hit_pos = entry.getSurfacePoint(render) # 获取碰撞点的世界坐标 # 判断击中的是不是我们的怪物 if hit_node == self.enemy_col_np.node(): print("命中目标!") # 给怪物一个被击中的反馈,比如变色、播放死亡动画、消失 self.enemy.setColor(0.5, 0, 0, 1) # 变暗红色 # 可以在这里添加得分、怪物生命值减少等逻辑 ``` 这段代码实现了完整的射击逻辑: 1. **碰撞系统设置**:创建`CollisionRay`(射线)和`CollisionSphere`(怪物的碰撞球)。 2. **碰撞掩码**:这是一个过滤机制,确保射线只与我们关心的物体(设置了对应掩码的怪物)发生碰撞检测。 3. **实时检测**:在`do_shoot`函数中,我们将射线的起点和方向设置为当前摄像机的状态,然后调用`traverse`进行碰撞检测。 4. **命中处理**:从碰撞处理器中取出结果,判断击中了谁,并做出相应反应(如改变颜色、播放音效、减少血量)。 现在,运行游戏,移动,瞄准那个红色的熊猫,点击鼠标左键。如果你听到枪声,并且在控制台看到“命中目标!”,同时熊猫颜色变深,那么恭喜你,你的第一款Python 3D FPS游戏的核心玩法已经全部实现了! ## 5. 打磨与优化:让游戏更像那么回事儿 基础功能都有了,但现在的游戏看起来还很粗糙。我们可以花点时间,做一些简单的打磨,体验会提升好几个档次。 ### 5.1 添加准星和简单的UI 没有准星的FPS是没有灵魂的。我们可以用Panda3D的2D绘制功能或者直接加载一张十字准星图片叠加在屏幕中央。 ```python def __init__(self): # ... 之前的初始化代码 ... # 创建一个2D准星节点(位于屏幕最上层) from panda3d.core import CardMaker, TextNode cm = CardMaker('crosshair') cm.setFrame(-0.02, 0.02, -0.02, 0.02) # 一个非常小的方形 self.crosshair = aspect2d.attachNewNode(cm.generate()) self.crosshair.setTransparency(TransparencyAttrib.MAlpha) # 加载准星纹理(一个简单的十字PNG,背景透明) crosshair_tex = loader.loadTexture("crosshair.png") self.crosshair.setTexture(crosshair_tex, 1) self.crosshair.setColor(1, 1, 1, 0.8) # 白色,带一点透明度 ``` `aspect2d`是一个特殊的渲染节点,它里面的物体不受3D摄像机影响,永远固定在屏幕上。把准星放在这里就对了。 ### 5.2 优化性能与资源管理 当游戏内容变多时,性能可能会成为问题。这里有几个小技巧: - **模型细节**:在原型阶段,使用Panda3D自带的简单模型(`models/box`, `models/sphere`)。等逻辑完善后,再使用Blender等工具制作或下载更精美的模型替换。 - **纹理尺寸**:纹理图片不要过大,512x512对于很多物体已经足够。 - **碰撞体简化**:就像我们之前做的,用简单的`CollisionSphere`或`CollisionBox`来代替复杂的模型网格进行碰撞检测,这被称为“简化碰撞体”,能极大提升碰撞检测效率。 - **帧率控制**:Panda3D的`run()`函数默认会尽可能快地运行。如果你发现CPU/GPU占用率很高,可以在主循环中通过`taskMgr`的延迟来控制帧率上限,比如固定在60帧。 ```python def update(self, task): dt = globalClock.getDt() # ... 所有更新逻辑 ... # 如果希望固定帧率,可以在这里判断dt,但通常不需要,Panda3D自己会处理 return task.cont ``` ### 5.3 下一步可以尝试的扩展 到这个阶段,你已经拥有了一个可玩的原型。接下来,你可以根据自己的兴趣,选择不同的方向进行深化: - **更多怪物与AI**:给怪物添加更复杂的AI状态机(巡逻、追击、攻击、逃跑)。 - **武器系统**:实现换枪、不同的射速、伤害、弹道下坠(高级)。 - **关卡设计**:用代码或外部工具(如Panda3D的场景编辑器)设计更复杂的地图。 - **粒子效果**:为射击和爆炸添加粒子系统,让画面更炫酷。 - **网络功能**:使用Panda3D内置的网络库,尝试制作一个多人对战游戏的雏形(这是一个非常大的挑战,但非常值得尝试)。 踩过几次坑之后,我最大的体会是:用Python做3D游戏,最重要的不是追求极致的画面和性能,而是享受那种“从无到有”的创造过程和快速迭代的乐趣。每一个你实现的小功能,都会带来实实在在的成就感。这个项目可能永远不会变成商业产品,但它作为你学习游戏开发、深入理解3D图形编程的敲门砖,价值是无限的。当你以后再打开那些用大型引擎制作的游戏时,你看到的将不再只是华丽的画面,而是背后一套套你曾经亲手实现过的、或简单或复杂的系统。这种视角的转变,才是学习开发游戏带给我们的最大财富。好了,代码就在那里,世界已经搭建,拿起你的“键盘枪”,开始创造和战斗吧。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

Python内容推荐

CrustaceanCrusaders:使用python-ogre用python编写的3D射击游戏

CrustaceanCrusaders:使用python-ogre用python编写的3D射击游戏

甲壳纲十字军 甲壳动物十字军是一款3D射击游戏,它是使用python-ogre用python创建的,它是CS课程的最终项目。 描述 忍者vs机器人(玩家vs CPU) 忍者vs忍者(玩家vs玩家) 普通模式(试图达到目标) 挑战模式(死亡比赛) 屏幕截图 要求 Ubuntu的04.04 python 2.7 python-ogre 1.7(在阅读“良好”方式) pygame(须藤apt-get install python-pygame) src(来自GitHub存储库) 选择 一个单独的Ubuntu应用程序( ) 用法 跑步: $ python main.py (suppose the current directory is src folder) 选择 解压应用文件夹,然后双击甲壳动物十字军图标 执照 麻省理工学院执照 作者 龙虾刀战: 格伦·安德鲁·比兹利 耶利

Python-Blender的3D游戏引擎

Python-Blender的3D游戏引擎

Blender的3D游戏引擎

推荐一款python可以使用的游戏引擎.专为U3D打造的游戏服务器引擎

推荐一款python可以使用的游戏引擎.专为U3D打造的游戏服务器引擎

C/C++的游戏引擎多如牛毛,今天推荐一款使用python语言的游戏引擎.专为U3D打造的游戏服务器引擎

a3p:A3P是使用Panda3D框架以Python编写的在线第三人称射击实时策略独立游戏

a3p:A3P是使用Panda3D框架以Python编写的在线第三人称射击实时策略独立游戏

A3P A3P是使用Panda3D框架以Python编写的在线第三人称射击实时策略独立游戏。 执照 A3P在MIT许可下可用。 可以在此存储库中的LICENSE文件中找到此许可证的副本。

Self_Havoc:通过使用Python和PyGame构建的基于3D第一人称视角的游戏

Self_Havoc:通过使用Python和PyGame构建的基于3D第一人称视角的游戏

自我破坏 通过使用Python和PyGame构建的基于3D第一人称视角的游戏。 该游戏使用光线追踪技术和Bresenham的Line算法在游戏中创建和实现3D设置。 精灵和独特的纹理也已用于游戏地图中。

用Python+PyGame实现的光线追踪第一人称3D游戏引擎

用Python+PyGame实现的光线追踪第一人称3D游戏引擎

这是一个基于Python和PyGame开发的第一人称3D游戏项目,核心采用光线追踪渲染技术,结合Bresenham直线算法完成视角投射与场景构建。项目包含完整的模块化结构:playerPOV.py处理玩家视角变换,RayCastingTechnique.py实现核心射线投射逻辑,map.py定义二维地图布局,objects.py和sprites.py分别管理可交互物体与精灵图资源,gameSettings.py统一配置参数,main.py为入口启动文件。所有纹理贴图存放于images目录,音效与主题音乐分置于music和theme子目录,sprites子目录还包含额外的精灵资源。代码注释清晰,结构贴近经典伪3D游戏(如Wolfenstein 3D)实现思路,适合学习光线投射原理、PyGame图形渲染及简单3D引擎架构。项目附带LICENSE和README.md,开源可直接运行,无需额外编译,依赖仅限Python 3.x和PyGame库。

Engendro3D:Python 3D游戏引擎

Engendro3D:Python 3D游戏引擎

Engendro 3D:trade_mark: 适用于Python的OpenGL 3D游戏引擎。 版本0.7 MIT许可证。 工作正在进行中。 渲染示例 视频 要求: 2.7或3.4+ pip install pysdl2 pip install git+https://github.com/jr-garcia/Glaze.git pip install numpy pip install git+https://github.com/jr-garcia/cyCGkit_minimal.git pip install pillow pip install freetype-py pip install

cpp-Panda3D一个游戏引擎一个3D渲染框架和Python与C程序游戏开发

cpp-Panda3D一个游戏引擎一个3D渲染框架和Python与C程序游戏开发

Panda3D - 一个游戏引擎,一个3D渲染框架和Python与C 程序游戏开发

StarWreck-A-Python-Space-Game:这是我使用Ursina引擎python开发的程序生成游戏的基线。 它使用固定的摄像头,并且注定是Space Invaders的3D版本。 该文件无论如何仍在进行中,不应视为最终产品,但我仍然为此感到自豪

StarWreck-A-Python-Space-Game:这是我使用Ursina引擎python开发的程序生成游戏的基线。 它使用固定的摄像头,并且注定是Space Invaders的3D版本。 该文件无论如何仍在进行中,不应视为最终产品,但我仍然为此感到自豪

StarWreck-A-Python-Space-Game:这是我使用Ursina引擎python开发的程序生成游戏的基线。 它使用固定的摄像头,并且注定是Space Invaders的3D版本。 该文件无论如何仍在进行中,不应视为最终产品,但我仍然为此感到自豪

python项目开发实战_大型3D枪战类冒险游戏(Panda3D)_编程案例实例课程教程.pdf

python项目开发实战_大型3D枪战类冒险游戏(Panda3D)_编程案例实例课程教程.pdf

python项目开发实战_大型3D枪战类冒险游戏(Panda3D)_编程案例实例课程教程.pdf

Python-一个可视化游戏动画的python工具

Python-一个可视化游戏动画的python工具

一个可视化游戏动画的python工具

game-dogfight:空战游戏,使用HARFANG 3D在Python 3中创建

game-dogfight:空战游戏,使用HARFANG 3D在Python 3中创建

混战(空战游戏) 空战游戏,使用在Python 3中创建。 游戏特色: 海洋着色器 Skydome着色器 体积云 人工智能驱动的对手 源代码和图形资产可用于学习目的。 但是,您可以随意派生此存储库,扩展游戏或发布基于该存储库的任何内容。 如何进行混战 获取 获取HARFANG 3D 从下载它,然后按照 或者,在命令行中使用PIP键入“ pip install harfang ” 克隆/下载此存储库 运行main.py 学分 编码:埃里克·克宁(Eric Kernin) 图形:Jean-Marie Lamarche和Bruno Lequitte 屏幕截图

利用Python绘制3D玫瑰花

利用Python绘制3D玫瑰花

Python具有强大的图像显示功能,借助它绘制自定义颜色的3D玫瑰花图像

Bounce_Game:使用 Pysoy python 游戏开发模块的 3D Bounce Game

Bounce_Game:使用 Pysoy python 游戏开发模块的 3D Bounce Game

Bounce_Game 一个基本的 3D 弹跳游戏,使用 pysoy 为谷歌代码提案之夏创建演示游戏。 使用箭头键和空格键来移动球。

Proyecto_Graficos_2021_tij2048:图形项目,使用Panda 3D播放python制作的社交主题的老游戏

Proyecto_Graficos_2021_tij2048:图形项目,使用Panda 3D播放python制作的社交主题的老游戏

Project_Graficos_2021_tij2048 图形项目,使用Panda 3D播放python制作的社交主题的老游戏

第一人称射击类源码

第一人称射击类源码

设计类游戏的源码设计档案,学习代码设计,学习开发技术

Shooter:在线第一人称射击游戏

Shooter:在线第一人称射击游戏

Shooter:在线第一人称射击游戏

3D射击游戏,模拟CS游戏(代码 程序)

3D射击游戏,模拟CS游戏(代码 程序)

不错演示代码,可以运行在VB环境下,喜欢的朋友可以看看的,谢谢了

Gh0stenstein:基于 pygame.com 代码的 2.5D 第一人称射击

Gh0stenstein:基于 pygame.com 代码的 2.5D 第一人称射击

戈斯坦斯坦 基于 pygame.com 代码的 2.5D 第一人称射击要求:不能在 Python 3 上运行。相反,安装 Python 2.7 和匹配的 32 位 pygame 下载。 2015 年 4 月 3 日 - 添加了一个跟随用户的怪物(来自 Doom 的 Pinky)。 不会发生战斗。 萍琪就像一只迷路的小狗一样跟在身边。 享受

BountyHunter:第一人称射击

BountyHunter:第一人称射击

BountyHunter:第一人称射击

最新推荐最新推荐

recommend-type

金融科技基于Java+Vue的信贷材料结构化审核系统设计:中小银行尽调要点抽取与风险识别应用 项目介绍 基于java+vue的中小银行信贷材料结构化审核与尽调要点抽取系统设计与实现(含模型描述及部

内容概要:本文介绍了一个基于Java与Vue的中小银行信贷材料结构化审核与尽调要点抽取系统的设计与实现。系统通过OCR识别、版面解析、关键字段抽取、实体归一化、规则引擎和风险评分等技术,将非结构化的信贷材料(如营业执照、审计报告、银行流水、合同等)转化为可查询、可校验的结构化数据,实现材料自动分类、字段提取、完整性检查、跨文档一致性比对及风险线索识别。系统涵盖文件接入、文档识别、字段抽取、规则校验、风险评分与前端交互六大层次,提升了信贷审核效率、统一了审查标准、增强了风险预警能力,并建立了可追溯的数据资产体系。文中还提供了企业名称清洗、统一社会信用代码校验、金额抽取、材料完整性校验、名称相似度计算和风险评分等核心功能的模型描述与Java代码示例。; 适合人群:具备Java和Vue开发基础,从事金融科技、信贷系统开发或智能文档处理相关工作的研发人员,尤其是关注OCR、NLP与规则引擎在金融风控中应用的工程师和技术负责人。; 使用场景及目标:① 实现中小银行信贷材料的自动化结构化处理与智能审核;② 提升信贷审批效率,降低人工核验成本;③ 统一尽调标准,增强风险识别与预警能力;④ 构建可追溯、可审计的信贷数据资产,支持贷后管理与监管合规。; 阅读建议:此资源以实际项目为导向,结合业务需求与技术实现,建议开发者结合代码示例深入理解各模块设计逻辑,重点关注实体归一化、规则引擎配置与前后端协同机制,并可在类似场景中复用核心算法与架构设计。
recommend-type

鼎拨神器,宽带批量拨号,拨号助手,拨号软件,拨号脚本,拨号神器

鼎拨神器 4.02 软件描述 ====================== 一、软件简介 鼎拨神器是一款面向拨号场景的桌面工具软件,提供账号批量拨号、拨号状态管理、日志留痕等功能,适用于需要频繁切换拨号账号的使用场景。软件界面简洁、操作直观,账号配置与管理一体化,开箱即用。 二、核心功能 1. 账号拨号:支持多账号配置,账号与密码以"空格或 Tab 键"分隔,可从表格(一列账号、一列密码)直接复制粘贴导入,批量管理、快速切换。 2. 动态等待:拨号成功后支持 1-60 秒动态等待时长,可有效规避连续拨号过快导致的失败,提升拨号成功率。 3. 流量选项:内置流量模式选项(4.0 版本新增),按需选择,灵活适配不同拨号需求。 4. 日志留痕: - dial_log.xls:最近一次拨号记录; - dial_log_日期.txt:全部拨号记录,按天归档,方便追溯与统计。 5. 图标美化:4.02 版本窗口左上角与任务栏统一应用专属图标,界面更规范。 三、版本更新记录 - 版本 4.02:修复了一些已知问题,优化窗口图标显示。 四、目录结构说明 - 鼎拨神器.exe:主程序,双击启动。 - Launcher_ForExe.exe:拨号调度启动器。 - Program 文件夹:软件内部文件,请勿删除。 - Program\dial.exe:核心拨号组件。 - accounts.txt:账号密码配置文件(账号与密码间用一个空格或 Tab 键隔开)。如不慎删除,请以"accounts.txt"命名自建文件即可恢复使用。 - rz 文件夹:日志文件夹,自动生成拨号记录。 建议每次拨号时将最后一个账号设为自己固有的账号,避免前面所有账号拨号不成功。 详细条款请参阅软件包内《软件使用授权及免责声明》。
recommend-type

YOLO26算法高空作业攀爬目标检测+训练好的模型+2228张数据集+pyqt可视化界面.zip

详情可查看下方数据集可视化效果。 【数据集概况】 · 检测类别(中文):[其他(Violence), 攀爬(climb)] · 训练集:2056 张 · 验证集:111 张 · 测试集:61 张 · 总计:2228 张 该数据集聚焦于高空作业场景中人员攀爬行为的精准识别,涵盖室内攀岩墙、户外梯子、屋顶维修、儿童游乐设施等多种真实环境。通过多角度、多光照条件下的图像采集,全面覆盖了不同高度、姿态和设备类型下的攀爬活动,为安全监控与风险预警系统提供了高质量的视觉基础,具有显著的行业应用价值。... 【训练曲线与评估图】 【模型训练配置】 参数 | 值 模型 | yolo26n 训练轮数 | 100 epochs 输入尺寸 | 640x640 批次大小 | 24 优化器 | auto 初始学习率 | 0.01 训练设备 【关键指标汇总】 训练了 87 个 epoch,最终轮指标: 指标 | 数值 mAP50 | **0.9141** mAP50-95 | 0.6503 Precision | 0.8867 Recall | 0.8620 train/box_loss | 0.8021 train/cls_loss | 0.4599 val/box_loss | 1.1432 val/cls_loss | 0.6798 【训练过程分析】 87 轮训练后 mAP50 达到 0.9141,模型收敛良好。Loss 曲线前段快速下降,后段趋于平稳,val_loss 无反弹,没有明显过拟合。但 mAP50-95 为 0.6503,和 mAP50 差距 0.26,定位精度仍有优化空间。 【模型性能评估】 Precision 0.8867、Recall 0.8620,精度高于召回,存在一定漏检。多类检测中,不同类别性能可能有差异,需关注难例类别的表现。 【预测效果展示】 验证集预测效果较好...
recommend-type

Python3浅拷贝与深拷贝差异

赋值操作只是新增变量指针,指向同一块内存,互相影响。浅拷贝copy:顶层对象独立,内部嵌套可变对象共享内存,修改嵌套数据互相影响。深拷贝deepcopy:所有层级对象全部独立,完全互不影响。不可变对象(字符串、元组)深浅拷贝效果一致,无内存差异。业务场景:单层数据用浅拷贝节省性能,多层嵌套字典、列表必须用深拷贝,规避数据联动修改。浅拷贝速度远高于深拷贝,优先按需选用。 lanqiu.zhongjiantest.com gxfxzz.cn www.gxfxzz.cn m.gxfxzz.cn jrsnba.gxfxzz.cn
recommend-type

codex-auth-helper(CSS)

「codex-auth-helper(CSS)」是开源项目(CSS)。项目简介:Codex登陆助手:安全地在本地导出您的已登录 ChatGPT 会话配置,生成符合 Codex 规范的 auth.json 本地备份文件。源码完整,下载解压即可查看使用,适合学习参考、课程设计与二次开发。
recommend-type

学生成绩管理系统C++课程设计与实践

资源摘要信息:"学生成绩信息管理系统-C++(1).doc" 1. 系统需求分析与设计 在进行学生成绩信息管理系统开发前,首先需要进行系统需求分析,这是确定系统开发目标与范围的过程。需求分析应包括数据需求和功能需求两个方面。 - 数据需求分析: - 学生成绩信息:需要收集学生的姓名、学号、课程成绩等数据。 - 数据类型和长度:明确每个数据项的数据类型(如字符串、整型等)和长度,例如学号可能是字符串类型且长度为一定值。 - 描述:详细描述每个数据项的意义,以确保系统能够准确处理。 - 功能需求分析: - 列出功能列表:用户界面应提供清晰的操作指引,列出所有可用功能。 - 查询学生成绩:系统应能通过学号或姓名查询学生的成绩信息。 - 增加学生成绩信息:允许用户添加未保存的学生成绩信息。 - 删除学生成绩信息:能够通过学号或姓名删除已经保存的成绩信息。 - 修改学生成绩信息:通过学号或姓名修改已有的成绩记录。 - 退出程序:提供安全退出程序的选项,并确保所有修改都已保存。 2. 系统设计 系统设计阶段主要完成内存数据结构设计、数据文件设计、代码设计、输入输出设计、用户界面设计和处理过程设计。 - 内存数据结构设计: - 使用链表结构组织内存中的数据,便于动态增删查改操作。 - 数据文件设计: - 选择文本文件存储数据,便于查看和编辑。 - 代码设计: - 根据功能需求,编写相应的函数和模块。 - 输入输出设计: - 设计简洁明了的输入输出提示信息和操作流程。 - 用户界面设计: - 用户界面应为字符界面,方便在命令行环境下使用。 - 处理过程设计: - 设计数据处理流程,确保每个操作都有明确的处理逻辑。 3. 系统实现与测试 实现阶段需要根据设计阶段的成果编写程序代码,并进行系统测试。 - 程序编写: - 完成系统设计中所有功能的程序代码编写。 - 系统测试: - 设计测试用例,通过测试用例上机测试系统。 - 记录测试方法和测试结果,确保系统稳定可靠。 4. 设计报告撰写 最后,根据系统开发的各个阶段,撰写详细的设计报告。 - 系统描述:包括问题说明、数据需求和功能需求。 - 系统设计:详细记录内存数据结构设计、数据文件设计、代码设计、输入/输出设计、用户界面设计、处理过程设计。 - 系统测试:包括测试用例描述、测试方法和测试结果。 - 设计特点、不足、收获和体会:反思整个开发过程,总结经验和教训。 时间安排: - 第19周(7月12日至7月16日)完成项目。 - 7月9日8:00到计算机学院实验中心(三楼)提交程序和课程设计报告。 指导教师和系主任(或责任教师)需要在文档上签名确认。 系统需求分析: - 使用表格记录系统需求分析的结果,包括数据项、数据类型、数据长度和描述。 - 分析数据项如学生成绩信息、状态器、链表节点等,确定其属性和行为。 以上就是文档中提到的学生成绩信息管理系统开发的关键知识点。开发此类系统需要熟练掌握C++编程基础,了解面向对象的程序设计思想,以及熟悉文件操作和链表等数据结构的应用。此外,良好的软件开发流程意识、测试意识和文档撰写能力也是必不可少的。
recommend-type

别再手动拖拽了!用Lumerical脚本批量创建FDTD仿真结构(附完整代码)

# 告别低效建模:Lumerical脚本自动化实战指南 在光子学仿真领域,时间就是科研生命线。当同行还在GUI界面里反复点击菜单时,你已经用脚本批量生成了20组参数化结构——这不是未来场景,而是每位FDTD用户都应该掌握的基础生产力革命。本文将彻底改变你与Lumerical的交互方式,从手动拖拽的农耕时代,跃迁到自动化建模的工业文明。 ## 1. 为何脚本建模是必然选择 2019年Nature Photonics的一项研究显示,科研工作者在仿真工具上平均浪费37%的时间在重复性操作上。对于需要参数扫描的纳米光学结构设计,这个数字可能更高。手动创建10个不同尺寸的纳米柱阵列意味着: -
recommend-type

Java邮件解析任务中,如何安全高效地提取HTML邮件内容并避免硬编码、资源泄漏和类型转换异常?

<think>我们被要求优化一段Java代码,该代码用于处理邮件(特别是来自特定发件人的构建通知邮件)。代码的主要问题包括: 1. 重复获取邮件内容:在检查MIME类型后,多次调用`msg[i].getContent()`,这可能导致性能问题或流关闭异常。 2. 类型转换问题:直接将邮件内容转换为`Multipart`而不进行类型检查,可能引发`ClassCastException`。 3. 代码结构问题:逻辑嵌套过深,可读性差,且存在重复代码(如插入邮件详情的操作在两个地方都有)。 4. 硬编码和魔法值:例如在解析HTML表格时使用了硬编码的索引(如list3.get(10)),这容易因邮件
recommend-type

RH公司应收账款管理优化策略研究

资源摘要信息:"本文针对RH公司的应收账款管理问题进行了深入研究,并提出了改进策略。文章首先分析了应收账款在企业管理中的重要性,指出其对于提高企业竞争力、扩大销售和充分利用生产能力的作用。然后,以RH公司为例,探讨了公司应收账款管理的现状,并识别出合同管理、客户信用调查等方面的不足。在此基础上,文章提出了一系列改善措施,包括完善信用政策、改进业务流程、加强信用调查和提高账款回收力度。特别强调了建立专门的应收账款回收部门和流程的重要性,并建议在实际应用过程中进行持续优化。同时,文章也意识到企业面临复杂多变的内外部环境,因此提出的策略需要根据具体情况调整和优化。 针对财务管理领域的专业学生和从业者,本文提供了一个关于应收账款管理问题的案例研究,具有实际指导意义。文章还探讨了信用管理和征信体系在应收账款管理中的作用,强调了它们对于提升企业信用风险控制和市场竞争能力的重要性。通过对比国内外企业在应收账款管理上的差异,文章总结了适合中国企业实际环境的应收账款管理方法和策略。" 根据提供的文件内容,以下是详细的知识点: 1. 应收账款管理的重要性:应收账款作为企业的一项重要资产,其有效管理关系到企业的现金流、财务健康以及市场竞争力。不良的应收账款管理会导致资金链断裂、坏账损失增加等问题,严重影响企业的正常运营和长远发展。 2. 应收账款的信用风险:在信用交易日益频繁的商业环境中,企业必须对客户信用进行评估,以便采取合理的信用政策,降低信用风险。 3. 合同管理的薄弱环节:合同是应收账款管理的法律基础,严格的合同管理能够保障企业权益,减少因合同问题导致的应收账款风险。 4. 客户信用调查:了解客户的信用状况对于预测和控制应收账款风险至关重要。企业需要建立有效的客户信用调查机制,识别和筛选信用良好的客户。 5. 应收账款回收策略:企业应建立有效的账款回收机制,包括定期的账款跟进、逾期账款的催收等。同时,建立专门的应收账款回收部门可以提升回收效率。 6. 应收账款管理流程优化:通过改进企业内部管理流程,如简化审批流程、提高工作效率等措施,能够提升应收账款的管理效率。 7. 应收账款管理策略的调整和优化:由于企业的内外部环境复杂多变,因此制定的管理策略需要根据实际情况进行动态调整和持续优化。 8. 信用管理和征信体系的作用:建立和完善企业内部信用管理体系和征信体系,有助于企业更好地控制信用风险,并在市场竞争中占据有利地位。 9. 对比国内外应收账款管理实践:通过研究国内外企业在应收账款管理上的不同做法和经验,可以借鉴先进的管理理念和方法,提升国内企业的应收账款管理水平。 综上所述,本文深入探讨了应收账款管理的多个方面,为RH公司乃至其他同类型企业提供了应收账款管理的改进方向和策略,对于财务管理专业的教育和实践都具有重要的参考价值。
recommend-type

新手别慌!用BingPi-M2开发板带你5分钟搞懂Tina Linux SDK目录结构

# 新手别慌!用BingPi-M2开发板带你5分钟搞懂Tina Linux SDK目录结构 第一次拿到BingPi-M2开发板时,面对Tina Linux SDK里密密麻麻的文件夹,我完全不知道从哪下手。就像走进一个陌生的大仓库,每个货架上都堆满了工具和零件,却找不到操作手册。这种困惑持续了整整两天,直到我意识到——理解目录结构比死记硬背每个文件更重要。 ## 1. 为什么SDK目录结构如此重要 想象你正在组装一台复杂的模型飞机。如果所有零件都混在一个箱子里,你需要花大量时间寻找每个螺丝和面板。但如果有分门别类的隔层,标注着"机身部件"、"电子设备"、"紧固件",组装效率会成倍提升。Ti