如何实现Battleship中玩家选择格子并修改显示的功能?
战舰(Battleship)功能实现方案
需求
- 玩家可识别并选择地图上的特定点位
- 将选中格子的
#替换为X后重新打印地图
现有代码问题分析
你当前的代码能完成初始界面展示、接收玩家坐标输入,但核心功能(更新地图并重新打印)还未实现,同时存在一些体验问题:
- 每次进入游戏界面都会重新生成新地图,无法保留之前的选择记录
- 验证坐标合法后没有执行替换
#为X的操作,也不会重新渲染地图 - 输入错误时直接跳回开始界面,打断游戏流程
- 未使用
turns变量实现回合次数限制
修改后的完整代码
turns = 10 # 只存大写字母,后续统一转大写处理,减少判断逻辑 alphabet = ["A","B","C","D","E","F","G","H","I","J"] def StartScreen(): print("Welcome to Battleship!") print(''' 1. Start 2. Exit ''') try: choice = int(input("Enter your number: ")) if choice == 1: GameScreen() elif choice == 2: exit() else: print("Please choose a valid number.") StartScreen() except ValueError: print("Please enter a number.") StartScreen() def GameScreen(): # 初始化10x10的地图,用二维列表保存状态 grid = [[" # " for _ in range(10)] for _ in range(10)] remaining_turns = turns while remaining_turns > 0: print(f"\nRemaining turns: {remaining_turns}") # 打印地图表头 print(" " + " ".join(alphabet)) # 打印每一行 for row_num in range(10): print(f"{row_num:2d} " + "".join(grid[row_num])) print("\n") rowx = input("Choose a letter(A-J): ").upper() try: rowy = int(input("Enter a number(0-9): ")) except ValueError: print("Please enter a valid number(0-9)\n") continue # 验证输入合法性 if rowx in alphabet and rowy in range(0,10): # 转换字母为列索引 col_idx = alphabet.index(rowx) # 修改对应格子为X grid[rowy][col_idx] = " X " print(f'You chose {rowx}{rowy}\n') remaining_turns -= 1 else: print("Please choose a valid point(A-J/0-9)\n") print("\nGame Over! All turns used.") StartScreen() # 启动游戏 StartScreen()
关键改动说明
- 改用**二维列表
grid**存储地图状态,确保每次修改后能保留更新结果 - 统一将玩家输入的字母转为大写,简化合法性判断逻辑
- 新增字母到列索引的转换:通过
alphabet.index(rowx)把A-J对应到0-9的列位置 - 加入回合循环,每次有效选择后减少剩余回合数,用完后结束游戏
- 优化输入错误处理:数字输入非法时捕获
ValueError,仅提示后重新输入,不中断游戏流程 - 调整地图打印格式,用
join方法让排版更整齐,行号用{row_num:2d}对齐
内容的提问来源于stack exchange,提问作者oneskepticalcoder
相关产品推荐
相关产品推荐

