
本文介绍如何用二维列表重构战舰游戏棋盘,使玩家能通过行列坐标精准选择并标记目标格子(如将“#”替换为“x”),解决单列表重复打印导致的状态不可控问题。
本文介绍如何用二维列表重构战舰游戏棋盘,使玩家能通过行列坐标精准选择并标记目标格子(如将“#”替换为“x”),解决单列表重复打印导致的状态不可控问题。
在经典《战舰》游戏中,让玩家真正“操作”棋盘的关键在于——棋盘必须是可索引、可修改的数据结构。你当前代码中使用单一 row 列表并循环打印 10 次,虽能显示 10×10 网格的视觉效果,但所有行实际指向同一内存地址(即“浅拷贝”问题),修改某一行会影响所有行,无法独立标记命中位置。
✅ 正确做法:采用 10×10 二维列表(list of lists) 表示棋盘,每格独立可读写:
# 初始化一个干净的 10x10 棋盘,全部为 '#'(未探索状态) board = [["#" for _ in range(10)] for _ in range(10)]
这样 board[3][5] 就唯一对应第 4 行(索引 3)、第 6 列(索引 5)的格子,修改它不会影响其他位置。
接下来,你需要支持用户输入标准坐标(如 "C" + "4" → 对应列索引 2,行索引 4)。推荐统一处理逻辑:将字母 A–J 映射为列索引 0–9,数字 0–9 直接作为行索引(注意:打印时行号显示为 0–9,与索引一致更安全):
def print_board(board):
print(" A B C D E F G H I J")
for i, row in enumerate(board):
# 每行前加行号,格式对齐
print(f"{i} {' '.join(row)}")
def get_player_move():
while True:
try:
col_input = input("Choose a column (A-J): ").strip().upper()
row_input = int(input("Choose a row (0-9): "))
if col_input not in "ABCDEFGHIJ":
print("❌ Invalid column. Please enter A-J.")
continue
if not (0 <p>? <strong>关键注意事项:</strong> </p>
- 不要再用 row = [" # ", ...] + 循环打印——它无法持久化状态;
- 输入校验必须前置(字母范围、数字范围、类型转换异常);
- 坐标映射建议用 "ABCDEFGHIJ".index(letter),比手动字典或 ord() 更清晰安全;
- 后续添加战舰放置、击中判定、重复检测等功能时,二维结构将天然支持 if board[r][c] == "S": ... 等逻辑。
通过这一重构,你的《战舰》游戏就拥有了真实、可控、可扩展的底层数据模型——这是所有交互功能(命中反馈、AI逻辑、存档系统)的坚实基础。










