# GESP等级：三级 | GESP Python 三级考点

"""
第5节：二维列表 —— 棋盘坐标演示
GESP #38

【场景说明】
  国际象棋/围棋的棋盘天然是一个二维结构。
  用二维列表存储棋盘状态，用 matrix[行][列] 定位每个格子。
"""

# ============================================================
# 演示1：用二维列表表示 8×8 棋盘
# ============================================================

# 每个格子的值表示棋子：空="·"，白兵="♙"，黑兵="♟"
# 使用字符串是为了在控制台清晰显示

def create_empty_board(size=8):
    """创建一个 size×size 的空棋盘，每个格子为 '·'"""
    return [["·"] * size for _ in range(size)]


def display_board(board):
    """在控制台美化打印棋盘"""
    size = len(board)
    # 打印列号
    print("   ", end="")
    for c in range(size):
        print(f" {c} ", end="")
    print()
    # 打印分隔线
    print("   " + "---" * size)
    # 打印每一行
    for i, row in enumerate(board):
        print(f"{i} │", end="")
        for cell in row:
            print(f" {cell} ", end="")
        print("│")
    print("   " + "---" * size)


print("【演示1】8×8 空棋盘")
board = create_empty_board(8)
display_board(board)


# ============================================================
# 演示2：放置棋子 —— matrix[行][列] = 棋子的值
# ============================================================

print("\n【演示2】在棋盘上放置棋子")

# 放一个白兵到 (1, 0) —— 第1行第0列
board[1][0] = "♙"
# 放一个黑兵到 (6, 7) —— 第6行第7列
board[6][7] = "♟"
# 放一个白王到 (0, 4)
board[0][4] = "♔"
# 放一个黑王到 (7, 4)
board[7][4] = "♚"

print("放置棋子后的棋盘：")
display_board(board)

# 读取棋子的值
print(f"\nboard[1][0] = '{board[1][0]}'  ← 第1行第0列")
print(f"board[6][7] = '{board[6][7]}'  ← 第6行第7列")
print(f"board[0][4] = '{board[0][4]}'  ← 第0行第4列（白王）")


# ============================================================
# 演示3：遍历棋盘画格子（带坐标标注）
# ============================================================

print("\n" + "=" * 60)
print("【演示3】遍历棋盘，输出每个格子的坐标")
print("=" * 60)

def show_all_coordinates(board):
    """遍历棋盘并打印每个格子的 (行,列) 坐标"""
    for i in range(len(board)):          # 遍历行
        for j in range(len(board[i])):   # 遍历列
            print(f"({i},{j})={board[i][j]}", end="  ")
        print()  # 一行结束换行

show_all_coordinates(board)


# ============================================================
# 演示4：统计棋盘上的棋子
# ============================================================

print("\n" + "=" * 60)
print("【演示4】统计棋盘上的棋子")
print("=" * 60)

def count_pieces(board):
    """统计棋盘上各种棋子的数量"""
    counts = {}
    for row in board:
        for cell in row:
            if cell != "·":          # 不是空位
                counts[cell] = counts.get(cell, 0) + 1
    return counts

stats = count_pieces(board)
print("棋子统计：")
for piece, cnt in stats.items():
    print(f"  {piece}: {cnt} 个")
print(f"  空格: {8*8 - sum(stats.values())} 个")


# ============================================================
# 演示5：用二维列表实现 3×3 方格阵（画格子）
# ============================================================

print("\n" + "=" * 60)
print("【演示5】用二维列表画 3×3 方格阵")
print("=" * 60)

def draw_grid(board):
    """
    将二维列表画成带边框的方格阵
    例如 [[1,2],[3,4]] →
        ┌───┬───┐
        │ 1 │ 2 │
        ├───┼───┤
        │ 3 │ 4 │
        └───┴───┘
    """
    rows = len(board)
    cols = len(board[0]) if board else 0

    # 顶边框
    print("┌───" + "┬───" * (cols - 1) + "┐")

    for i in range(rows):
        # 数据行
        print("│ " + " │ ".join(str(x) for x in board[i]) + " │")
        # 底边框或行分隔线
        if i < rows - 1:
            print("├───" + "┼───" * (cols - 1) + "┤")
        else:
            print("└───" + "┴───" * (cols - 1) + "┘")


# 创建一个 3×3 数字方格
number_grid = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

print("3×3 数字方格阵：")
draw_grid(number_grid)


# ============================================================
# 演示6：不规则棋盘 —— 不同行不同列数
# ============================================================

print("\n" + "=" * 60)
print("【演示6】蛇形棋盘（不规则二维列表）")
print("=" * 60)

snake = [
    [1],
    [2, 3],
    [4, 5, 6],
    [7, 8, 9, 10]
]

for i, row in enumerate(snake):
    print(f"第{i}行（{len(row)}列）: {row}")


print("\n" + "=" * 60)
print("演示小结")
print("  • 棋盘 = 二维列表，matrix[行][列] 定位格子")
print("  • 双重 for 循环逐个遍历所有格子")
print("  • 行遍历: for row in board")
print("  • 行列同时遍历: for i + for j")
print("=" * 60)
