You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何调整代码实现标准Tic-Tac-Toe棋盘?胜负判断及重构咨询

井字棋代码问题解答

一、现有代码的调整内容

  • 修正棋盘结构错误:
    • 变量命名混乱:代码中定义了变量i但棋盘第三行第三列误用了j,需将棋盘里的j替换为i。
    • 优化棋盘布局:当前每行的|符号冗余,标准井字棋应采用| x | o | x |的结构,分隔线改用---+---+---更贴合规范。
    • 调整初始值逻辑:现有代码直接随机填满所有格子,不符合井字棋“轮流落子”的玩法,需将所有格子初始化为空格(' '),后续通过落子逻辑更新内容。
    • 修复函数命名冲突:board函数内定义了同名列表,容易导致变量混淆,建议将棋盘设为全局可修改变量,或通过函数参数传递。

调整后的基础棋盘代码示例:

# 初始化空棋盘
board = [
    [' ', ' ', ' '],
    [' ', ' ', ' '],
    [' ', ' ', ' ']
]

def print_board():
    print("---+---+---")
    for row in board:
        print(f"| {row[0]} | {row[1]} | {row[2]} |")
        print("---+---+---")

print_board()

二、胜负判断逻辑实现

胜负判断需覆盖所有获胜组合:横向三行、纵向三列、两条对角线,只要任意一组三个格子内容相同且不为空,即可判定对应玩家获胜。

实现代码示例:

def check_win(player):
    # 检查横向三行
    for row in board:
        if all(cell == player for cell in row):
            return True
    # 检查纵向三列
    for col in range(3):
        if all(board[row][col] == player for row in range(3)):
            return True
    # 检查两条对角线
    if board[0][0] == board[1][1] == board[2][2] == player:
        return True
    if board[0][2] == board[1][1] == board[2][0] == player:
        return True
    return False

每次玩家落子后,调用check_win('x')或check_win('o'),返回True则说明对应玩家获胜。

三、是否需要从零重构代码

完全需要。现有代码的核心逻辑完全脱离井字棋的本质玩法:初始就随机填满所有格子,没有落子交互、玩家轮流机制,仅能打印随机字符网格。从零重构可按照正常游戏流程设计:

  1. 初始化空棋盘
  2. 实现落子逻辑(含坐标验证、空格子检查)
  3. 实现胜负与平局判断
  4. 循环推进游戏直至分出结果

完整简化重构示例:

import random

# 初始化空棋盘
board = [[' ' for _ in range(3)] for _ in range(3)]

def print_board():
    print("\n---+---+---")
    for row in board:
        print(f"| {row[0]} | {row[1]} | {row[2]} |")
        print("---+---+---")
    print()

def check_win(player):
    # 横向、纵向、对角线检查
    for row in board:
        if all(cell == player for cell in row):
            return True
    for col in range(3):
        if all(board[row][col] == player for row in range(3)):
            return True
    if board[0][0] == board[1][1] == board[2][2] == player:
        return True
    if board[0][2] == board[1][1] == board[2][0] == player:
        return True
    return False

def check_draw():
    return all(cell != ' ' for row in board for cell in row)

def player_move():
    while True:
        try:
            row = int(input("请输入行号(1-3): ")) - 1
            col = int(input("请输入列号(1-3): ")) - 1
            if 0 <= row < 3 and 0 <= col < 3 and board[row][col] == ' ':
                board[row][col] = 'x'
                break
            else:
                print("无效位置,请重新输入!")
        except ValueError:
            print("请输入有效数字!")

def ai_move():
    print("AI落子中...")
    while True:
        row = random.randint(0, 2)
        col = random.randint(0, 2)
        if board[row][col] == ' ':
            board[row][col] = 'o'
            break

def main():
    print("井字棋游戏开始!")
    print_board()
    while True:
        player_move()
        print_board()
        if check_win('x'):
            print("你获胜了!")
            break
        if check_draw():
            print("平局!")
            break
        ai_move()
        print_board()
        if check_win('o'):
            print("AI获胜了!")
            break
        if check_draw():
            print("平局!")
            break

if __name__ == "__main__":
    main()

内容的提问来源于stack exchange,提问作者Dylan Brown

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 23:55:31