0

0

使用Python开发战舰游戏:实现玩家与电脑之间的对战循环

碧海醫心

碧海醫心

发布时间:2025-08-29 20:07:01

|

534人浏览过

|

来源于php中文网

原创

 使用Python开发战舰游戏:实现玩家与电脑之间的对战循环

本文档旨在指导初学者使用Python编程语言开发一款简单的战舰游戏。重点讲解如何实现玩家与电脑之间的对战循环,并提供可运行的代码示例。通过学习本文,你将掌握游戏开发的基本逻辑,并能够在此基础上扩展游戏功能。 ### 游戏核心逻辑 战舰游戏的核心在于模拟玩家和电脑轮流攻击对方的战舰,直到一方的战舰全部被击沉。为了实现这个逻辑,我们需要: 1. **创建游戏地图:** 使用二维列表来表示游戏地图,每个元素代表一个单元格,可以为空、战舰或被击中的状态。 2. **放置战舰:** 玩家手动或电脑随机在地图上放置战舰。 3. **实现攻击逻辑:** 玩家和电脑轮流输入坐标,判断是否击中对方的战舰。 4. **判断胜负:** 检查一方的战舰是否全部被击沉,如果全部被击沉,则另一方获胜。 5. **对战循环:** 循环执行攻击逻辑,直到一方获胜。 ### 代码实现 以下代码基于提供的问题和答案,并进行了改进和优化,以实现完整的对战循环。 ```python 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(map_size): """ 创建指定大小的战场地图 """ return [["_"] * map_size for _ in range(map_size)] def display_battlefield(board): """ 显示当前战场地图的状态 """ for row in board: print(" ".join(row)) def player_ship_coordinate(player_board, occupied): """ 玩家手动放置战舰 """ ship_placement = {"B": "战列舰", "C": "巡洋舰", "F": "护卫舰", "A": "航空母舰", "S": "潜艇"} for ship, ship_name in ship_placement.items(): while True: try: row = int(input(f"请输入{ship_name}的行坐标: ")) col = int(input(f"请输入{ship_name}的列坐标: ")) if 0 win(board): """ 检查是否所有战舰都被击沉 """ for row in board: for cell in row: if cell in ship_initial: return False return True 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 = set() print("玩家的回合:放置战舰") player_board, occupied = player_ship_coordinate(player_board, occupied) print("玩家的战舰部署完毕:") display_battlefield(player_board) print("\n电脑的回合:放置战舰") comp_board = comp_ship_coordinate(comp_board) # display_battlefield(comp_board) # 隐藏电脑的战舰部署 player_turn = True while True: if player_turn: print("\n玩家的回合:攻击") display_battlefield(dummy_board) # 显示玩家的攻击地图 hit, ship = check_player_hit(comp_board, dummy_board, user) if check_win(comp_board): print(f"{user} 获胜! 恭喜!") break else: print("\n电脑的回合:攻击") hit, ship = check_comp_hit(player_board) if check_win(player_board): print("电脑获胜! 游戏结束.") break player_turn = not player_turn # 切换回合

代码解释

  • create_battlefield(map_size): 创建一个 map_size x map_size 的二维列表,表示游戏地图。初始状态所有单元格都为空 ("_")。
  • display_battlefield(board): 将游戏地图打印到控制台。
  • player_ship_coordinate(player_board, occupied): 允许玩家手动输入坐标来放置战舰。 occupied 集合用于记录已经被占用的坐标,避免战舰重叠。
  • comp_ship_coordinate(comp_board): 电脑随机在地图上放置战舰。
  • check_player_hit(comp_board, dummy_board, user): 玩家输入坐标攻击电脑。如果击中,将电脑地图和玩家的攻击地图 (dummy_board) 上的相应单元格标记为 "X";如果未击中,则标记为 "M"。
  • check_comp_hit(player_board): 电脑随机选择坐标攻击玩家。逻辑与 check_player_hit 类似。
  • check_win(board): 检查地图上是否还有未被击沉的战舰。如果所有战舰都被击沉,则返回 True,表示游戏结束。
  • 主循环: while True 循环控制游戏流程,玩家和电脑轮流攻击,直到一方获胜。

运行结果示例

欢迎来到战舰游戏 test!
玩家的回合:放置战舰
请输入战列舰的行坐标: 0
请输入战列舰的列坐标: 0
请输入巡洋舰的行坐标: 1
请输入巡洋舰的列坐标: 1
请输入护卫舰的行坐标: 2
请输入护卫舰的列坐标: 2
请输入航空母舰的行坐标: 3
请输入航空母舰的列坐标: 3
请输入潜艇的行坐标: 4
请输入潜艇的列坐标: 4
玩家的战舰部署完毕:
B _ _ _ _ _ _ _ _ _
_ C _ _ _ _ _ _ _ _
_ _ F _ _ _ _ _ _ _
_ _ _ A _ _ _ _ _ _
_ _ _ _ S _ _ _ _ _
_ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _

电脑的回合:放置战舰

玩家的回合:攻击
_ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _
test的回合
请输入要攻击的行坐标: 0
请输入要攻击的列坐标: 0
击中!

玩家的回合:攻击
X _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _
test的回合
请输入要攻击的行坐标: 1
请输入要攻击的列坐标: 1
击中!

玩家的回合:攻击
X _ _ _ _ _ _ _ _ _
_ X _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _
test的回合
请输入要攻击的行坐标: 2
请输入要攻击的列坐标: 2
击中!

玩家的回合:攻击
X _ _ _ _ _ _ _ _ _
_ X _ _ _ _ _ _ _ _
_ _ X _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _
test的回合
请输入要攻击的行坐标: 3
请输入要攻击的列坐标: 3
击中!

玩家的回合:攻击
X _ _ _ _ _ _ _ _ _
_ X _ _ _ _ _ _ _ _
_ _ X _ _ _ _ _ _ _
_ _ _ X _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _
test的回合
请输入要攻击的行坐标: 4
请输入要攻击的列坐标: 4
击中!
test 获胜! 恭喜!

注意事项

  • 错误处理: 代码中包含基本的错误处理,例如检查输入是否为整数,坐标是否越界。可以根据需要添加更完善的错误处理机制。
  • 代码可读性 代码中添加了注释,解释了每个函数的作用。良好的代码风格和注释对于代码的可维护性非常重要。
  • 游戏平衡性: 电脑的 AI 非常简单,只是随机选择坐标攻击。可以根据需要改进电脑的 AI,使其更具挑战性。
  • 游戏功能扩展: 可以扩展游戏功能,例如:
    • 允许玩家选择战舰的长度和方向。
    • 添加不同的战舰类型,每种战舰有不同的攻击力。
    • 实现多人在线对战。
    • 增加音效和动画效果。

总结

通过本文,你学习了如何使用 python 开发一个简单的战舰游戏,并了解了游戏开发的基本流程。希望本文能够帮助你入门游戏开发,并激发你创造更多有趣的游戏。

OFFER快
OFFER快

首个全流程托管的 AI 求职 Agent(自动筛选、沟通、网申)

下载
					

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

187

2023.09.27

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

1

2026.02.03

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

790

2023.08.22

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

98

2023.09.25

java中break的作用
java中break的作用

本专题整合了java中break的用法教程,阅读专题下面的文章了解更多详细内容。

119

2025.10.15

java break和continue
java break和continue

本专题整合了java break和continue的区别相关内容,阅读专题下面的文章了解更多详细内容。

258

2025.10.24

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

543

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

547

2024.08.29

全国统一发票查询平台入口合集
全国统一发票查询平台入口合集

本专题整合了全国统一发票查询入口地址合集,阅读专题下面的文章了解更多详细入口。

19

2026.02.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 3.9万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号