Python列表项可否同时存储字符串和整型?简易海战游戏坐标替换问题
问题分析
- 你使用
"A3" or 88的方式无法实现单列表项存两个值的需求。Python中or是逻辑运算符,会返回第一个布尔值为真的对象,非空字符串布尔值为真,因此你定义的battleship_placement列表中实际只存储了坐标字符串,索引值被完全忽略。 - X出现在最前面的原因是代码逻辑错误:命中目标后你已经调用
remove()将坐标从列表移除,player_guess in battleship_placement的返回值为False,Python中False等价于整数0,因此你永远在修改列表索引0的位置,X自然出现在开头。
解决方案
推荐用字典存储坐标和对应列表索引的映射,同时可通过通用转换逻辑避免手动计算索引出错,修改后可正常运行的代码如下:
import time ocean_table = (" A B C D E F\n" + "1 # # # # # #\n" + "2 # # # # # #\n" + "3 # # # # # #\n" + "4 # # # # # #\n" + "5 # # # # # #\n" + "6 # # # # # #\n") print(ocean_table) # 坐标转棋盘列表索引的转换函数 def coord_to_index(coord): col_char = coord[0] row_num = int(coord[1:]) col = ord(col_char) - ord('A') # 单行长13字符,表头占1行,行号对应起始索引为 13 * 行号 start_idx = 13 * row_num # 列偏移:行号(1位)+空格(1位)=2,每列占2位(#加空格) offset = 2 + col * 2 return start_idx + offset # 战舰坐标列表 battleship_placement = ["A3", "A4", "A5", "C2", "D3", "E4", "F5"] # 预生成坐标与索引的映射关系 ship_index_map = {coord: coord_to_index(coord) for coord in battleship_placement} player_guess = input("Enter your coordinates: ").upper() if player_guess in battleship_placement: battleship_placement.remove(player_guess) ocean_list = list(ocean_table) # 取对应坐标的索引修改为X ocean_list[ship_index_map[player_guess]] = "X" ocean_table = "".join(ocean_list) print("You got a hit!") else: print("\nYou missed the target") time.sleep(1.4) print(ocean_table)
运行后输入正确的战舰坐标,对应位置的#就会被替换为X,不会再出现X跑到开头的问题。
内容的提问来源于stack exchange,提问作者Kevin Green
相关产品推荐
相关产品推荐

