Python战舰游戏开发教程:核心循环与智能命中详解
本教程将带你使用Python从零开始构建一个功能完备的战舰游戏。我们将深入探讨游戏开发的核心环节,包括:**游戏地图的创建与初始化**,**玩家与电脑的船只部署策略**,**回合制游戏循环的实现**,以及至关重要的**智能命中检测逻辑**。为了提升用户体验,我们将引入“虚拟”敌方战场,让玩家在信息不对称的情况下进行策略博弈。教程还将详细讲解如何判断游戏胜利,最终实现一个可玩性强的战舰游戏。通过学习本教程,你将掌握Python游戏开发的基础技能,并能运用这些技能开发更复杂的游戏项目。本教程注重百度SEO优化,关键词已合理布局,助力你的学习成果被更多人发现。
1. 游戏基础结构与初始化
构建战舰游戏首先需要定义游戏的基本元素和初始化流程。这包括欢迎玩家、创建游戏地图、以及玩家和电脑船只的初始部署。
1.1 用户欢迎与地图创建
游戏开始时,首先获取玩家昵称并显示欢迎信息。游戏地图通过二维列表表示,初始状态下所有格子均为空(_)。
from random import randrange # 船只类型定义 ship_initial = ["B", "C", "F", "A", "S"] ship_names = ["Battleship", "Cruiser", "Frigate", "Aircraft Carrier", "Sub"] map_size = 10 # 地图大小 def get_username(): """获取玩家昵称""" while True: user_name = input("请输入您的名字: ") if user_name: print(f"欢迎来到战舰游戏, {user_name}!") return user_name else: print("请勿输入空值。") def create_battlefield(size): """根据指定大小创建游戏地图""" return [["_"] * size for _ in range(size)] def display_battlefield(board): """显示当前地图状态""" for row in board: print(" ".join(row))
1.2 玩家与电脑船只部署
玩家手动输入坐标放置船只,电脑则随机放置。为避免船只重叠,玩家放置时需检查坐标是否已被占用;电脑放置时则需确保目标格子为空。
def player_ship_coordinate(player_board, occupied_coords): """ 玩家手动放置船只。 参数: player_board: 玩家自己的地图。 occupied_coords: 一个集合,存储已被占用的坐标,防止船只重叠。 """ print("请放置您的船只:") for i, ship_name in enumerate(ship_names): while True: try: row = int(input(f"请输入 {ship_name} 的行坐标 (0-9): ")) col = int(input(f"请输入 {ship_name} 的列坐标 (0-9): ")) if 0 <= row < map_size and 0 <= col < map_size and (row, col) not in occupied_coords: player_board[row][col] = ship_initial[i] occupied_coords.add((row, col)) break else: print("无效坐标或该位置已被占用。请重新输入。") except ValueError: print("输入无效。请输入一个整数。") return player_board, occupied_coords def comp_ship_coordinate(comp_board): """ 电脑随机放置船只。 参数: comp_board: 电脑的地图。 """ for ship_char in ship_initial: while True: row = randrange(0, map_size) col = randrange(0, map_size) if comp_board[row][col] == "_": comp_board[row][col] = ship_char break return comp_board
2. 实现回合制游戏循环
游戏的核心是回合制循环,玩家和电脑轮流攻击,直到一方所有船只被击沉。
2.1 游戏主循环结构
在 if __name__ == "__main__": 块中,我们初始化游戏并进入一个无限循环,直到有玩家获胜。player_hits 和 comp_hits 变量用于跟踪双方击沉的船只数量。
if __name__ == "__main__": user = get_username() player_board = create_battlefield(map_size) comp_board = create_battlefield(map_size) dummy_board = create_battlefield(map_size) # 玩家视角的电脑地图,初始为空 occupied_coords = set() print("\n玩家部署船只:") player_ship_coordinate(player_board, occupied_coords) print("\n您的战场:") display_battlefield(player_board) print("\n电脑部署船只:") comp_ship_coordinate(comp_board) # display_battlefield(comp_board) # 测试时可以显示电脑地图,实际游戏中应隐藏 print("\n电脑的战场 (您的攻击目标):") display_battlefield(dummy_board) # 玩家只能看到虚拟地图 player_hits = 0 # 玩家击中电脑船只的数量 comp_hits = 0 # 电脑击中玩家船只的数量 while True: print(f"\n--- {user} 的回合 ---") # 玩家攻击 hit_status = check_player_hit(comp_board, dummy_board, user) player_hits += hit_status print("\n电脑的战场 (您的攻击结果):") display_battlefield(dummy_board) if player_hits == len(ship_initial): # 如果玩家击沉所有船只 print(f"\n恭喜 {user},您击沉了所有敌舰,赢得游戏!") break print("\n--- 电脑的回合 ---") # 电脑攻击 hit_status = check_comp_hit(player_board) comp_hits += hit_status print("\n您的战场 (电脑的攻击结果):") display_battlefield(player_board) if comp_hits == len(ship_initial): # 如果电脑击沉所有船只 print("\n很遗憾,电脑击沉了您的所有船只,电脑赢得游戏!") break
3. 玩家射击与“虚拟”敌方战场
为了提供更好的游戏体验,玩家不应直接看到电脑的船只部署。我们引入一个“虚拟战场”(dummy_board),它只显示玩家的攻击结果(命中或未命中)。
3.1 check_player_hit 函数
这个函数负责处理玩家的攻击。它接收电脑的真实地图 (comp_board) 和玩家视角的虚拟地图 (dummy_board)。
- 玩家输入攻击坐标。
- 根据 comp_board 判断是否命中。
- 如果命中,dummy_board 对应位置标记为 'X',comp_board 上的船只标记为小写字母(表示已击中)。
- 如果未命中,dummy_board 对应位置标记为 '*'。
- 函数返回 1 表示命中,0 表示未命中。
def check_player_hit(comp_board, dummy_board, user_name): """ 玩家攻击敌方船只。 参数: comp_board: 电脑的真实地图。 dummy_board: 玩家可见的虚拟地图。 user_name: 玩家昵称,用于提示信息。 返回: 1 表示命中,0 表示未命中。 """ while True: try: print(f"{user_name},请选择您的攻击坐标。") row = int(input("请输入攻击的行坐标 (0-9): ")) col = int(input("请输入攻击的列坐标 (0-9): ")) if 0 <= row < map_size and 0 <= col < map_size: # 检查是否重复攻击同一位置 if dummy_board[row][col] != '_' : print("您已经攻击过这个位置了。请选择其他坐标。") continue break else: print("无效坐标。请重新输入 (0-9)。") except ValueError: print("输入无效。请输入一个整数。") hit = 0 # 默认未命中 target_char = comp_board[row][col] if target_char in ship_initial: # 命中船只 comp_board[row][col] = target_char.lower() # 标记为已击中(小写) dummy_board[row][col] = "X" # 虚拟地图显示命中 print(f"命中!电脑的 {ship_names[ship_initial.index(target_char)]} 被击中了!") hit = 1 else: # 未命中 dummy_board[row][col] = "*" # 虚拟地图显示未命中 print("未命中!") return hit
4. 电脑AI射击逻辑
电脑的攻击需要一定的智能性,至少要避免重复攻击已命中或已尝试过的位置。
4.1 check_comp_hit 函数
这个函数处理电脑的攻击。
- 电脑随机选择一个坐标,但会确保该坐标之前未被攻击过(即不是 '*' 或已击中的小写船只字符)。
- 根据 player_board 判断是否命中。
- 如果命中,player_board 上的船只标记为小写字母。
- 如果未命中,player_board 对应位置标记为 '*'。
- 函数返回 1 表示命中,0 表示未命中。
def check_comp_hit(player_board): """ 电脑攻击玩家船只。 参数: player_board: 玩家的真实地图。 返回: 1 表示命中,0 表示未命中。 """ hit = 0 # 默认未命中 while True: # 随机选择一个未曾攻击过的位置 row = randrange(0, map_size) col = randrange(0, map_size) # 确保电脑不会重复攻击已经命中或尝试过的位置 if player_board[row][col] not in ["*", "a", "b", "c", "f", "s"]: break print(f"电脑选择了坐标 ({row}, {col}) 进行攻击。") target_char = player_board[row][col] if target_char in ship_initial: # 命中船只 player_board[row][col] = target_char.lower() # 标记为已击中(小写) print(f"您的 {ship_names[ship_initial.index(target_char)]} 被击中了!") hit = 1 else: # 未命中 player_board[row][col] = "*" # 标记为未命中 print("电脑未命中!") return hit
5. 游戏胜利条件判断
游戏胜利的条件是当一方击沉了对方所有船只。在本教程中,我们假设每艘船只占据一个格子,共有5艘船。因此,当 player_hits 或 comp_hits 达到5时,游戏结束。
在主游戏循环中,每次攻击后都会检查胜利条件:
# ... (玩家攻击代码) ... player_hits += hit_status # ... (显示玩家视角电脑地图) ... if player_hits == len(ship_initial): # 如果玩家击沉所有船只 print(f"\n恭喜 {user},您击沉了所有敌舰,赢得游戏!") break # ... (电脑攻击代码) ... comp_hits += hit_status # ... (显示玩家地图) ... if comp_hits == len(ship_initial): # 如果电脑击沉所有船只 print("\n很遗憾,电脑击沉了您的所有船只,电脑赢得游戏!") break
6. 注意事项与代码优化建议
- 错误处理增强: 当前代码已包含基本的 try-except 进行输入验证,但可以进一步细化,例如对玩家输入坐标的范围进行更严格的检查,并提供更友好的提示。
- 船只大小与方向: 现有实现中所有船只都只占据一个格子。要实现更真实的战舰游戏,需要扩展船只类,使其具有长度和方向(水平或垂直),并在放置船只时进行碰撞检测和边界检查。
- 游戏状态管理: 可以引入一个更复杂的船只对象来管理每艘船的状态(如生命值、是否被击沉),而不是仅仅通过地图上的字符变化来判断。
- 更智能的电脑AI: 当前电脑AI只是随机攻击未曾攻击过的位置。更高级的AI可以在击中船只后,优先攻击相邻的格子,以“追踪”并击沉船只。
- 用户界面: 对于命令行游戏,可以考虑使用ANSI转义序列来为输出添加颜色,提升可读性。如果希望更复杂的界面,可以考虑使用Pygame等图形库。
- 模块化: 随着游戏复杂度的增加,可以将不同的功能(如船只管理、玩家操作、电脑AI)拆分到不同的模块或类中,提高代码的可维护性。例如,可以创建 Ship 类、Player 类和 Computer 类。
- 代码可读性: 确保变量命名清晰,函数功能单一,并添加足够的注释。
总结
通过本教程,我们构建了一个Python战舰游戏的基础框架,涵盖了从游戏初始化、船只部署到回合制战斗循环和胜利条件判断的核心逻辑。关键改进包括引入“虚拟战场”以隐藏电脑船只位置,以及优化电脑AI使其避免重复攻击。这个基础版本为进一步扩展和提升游戏体验奠定了坚实的基础,例如实现多格船、更复杂的AI策略以及图形用户界面等。
到这里,我们也就讲完了《Python战舰游戏开发教程:核心循环与智能命中详解》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

- 上一篇
- Python装饰器实现AOP编程详解

- 下一篇
- AppleMusic退款步骤详解
-
- 文章 · python教程 | 37秒前 |
- FastAPI多服务协作与聚合方法解析
- 275浏览 收藏
-
- 文章 · python教程 | 16分钟前 |
- Pythonyield用法详解与生成器教学
- 349浏览 收藏
-
- 文章 · python教程 | 22分钟前 |
- Python入门必备代码大全
- 343浏览 收藏
-
- 文章 · python教程 | 23分钟前 |
- 可伸缩Python计算器:多用户输入处理方法
- 375浏览 收藏
-
- 文章 · python教程 | 1小时前 |
- Python字符串操作技巧全解析
- 384浏览 收藏
-
- 文章 · python教程 | 1小时前 |
- Pandas替换文件值并跳过指定字段方法
- 234浏览 收藏
-
- 文章 · python教程 | 1小时前 | java php
- is与==区别:身份与值对比详解
- 210浏览 收藏
-
- 文章 · python教程 | 2小时前 |
- Pandas读取ODS/Excel注释混乱解决方法
- 383浏览 收藏
-
- 文章 · python教程 | 2小时前 |
- Python切片到末尾的实用技巧
- 272浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 514次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 499次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
-
- AI Mermaid流程图
- SEO AI Mermaid 流程图工具:基于 Mermaid 语法,AI 辅助,自然语言生成流程图,提升可视化创作效率,适用于开发者、产品经理、教育工作者。
- 91次使用
-
- 搜获客【笔记生成器】
- 搜获客笔记生成器,国内首个聚焦小红书医美垂类的AI文案工具。1500万爆款文案库,行业专属算法,助您高效创作合规、引流的医美笔记,提升运营效率,引爆小红书流量!
- 60次使用
-
- iTerms
- iTerms是一款专业的一站式法律AI工作台,提供AI合同审查、AI合同起草及AI法律问答服务。通过智能问答、深度思考与联网检索,助您高效检索法律法规与司法判例,告别传统模板,实现合同一键起草与在线编辑,大幅提升法律事务处理效率。
- 98次使用
-
- TokenPony
- TokenPony是讯盟科技旗下的AI大模型聚合API平台。通过统一接口接入DeepSeek、Kimi、Qwen等主流模型,支持1024K超长上下文,实现零配置、免部署、极速响应与高性价比的AI应用开发,助力专业用户轻松构建智能服务。
- 48次使用
-
- 迅捷AIPPT
- 迅捷AIPPT是一款高效AI智能PPT生成软件,一键智能生成精美演示文稿。内置海量专业模板、多样风格,支持自定义大纲,助您轻松制作高质量PPT,大幅节省时间。
- 84次使用
-
- Flask框架安装技巧:让你的开发更高效
- 2024-01-03 501浏览
-
- Django框架中的并发处理技巧
- 2024-01-22 501浏览
-
- 提升Python包下载速度的方法——正确配置pip的国内源
- 2024-01-17 501浏览
-
- Python与C++:哪个编程语言更适合初学者?
- 2024-03-25 501浏览
-
- 品牌建设技巧
- 2024-04-06 501浏览