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

Python3中二维数组遍历修改及井字棋实现问题求助

井字棋问题解决方案

一、修复矩阵创建代码

你提供的创建矩阵代码存在两个核心问题:

  1. 传入的是空数组array,却试图访问mtrx[i][j],空数组无任何元素,直接报错。
  2. 使用append(0)后会返回None,最终生成的矩阵全是None而非预期的0。

正确的3x3初始矩阵创建方式:

def create_matrix():
    # 生成3行3列、初始值为0的二维数组
    return [[0 for _ in range(3)] for _ in range(3)]

# 调用示例
board = create_matrix()
print(board)  # 输出: [[0, 0, 0], [0, 0, 0], [0, 0, 0]]

二、遍历与修改二维数组

在Python中,直接通过索引即可修改二维数组元素,遍历可使用嵌套循环:

# 直接修改指定位置元素(例:将第一行第一列改为'X')
board[0][0] = 'X'

# 嵌套循环遍历所有元素并打印
for row_idx in range(3):
    for col_idx in range(3):
        print(f"({row_idx}, {col_idx}): {board[row_idx][col_idx]}")

三、三子连线获胜逻辑实现

可以通过检查横向、纵向、两条对角线是否全部为同一玩家标记('X'或'O',非0)来判断获胜:

def check_win(board, 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 all(board[i][i] == player for i in range(3)):
        return True
    # 检查副对角线(右上到左下)
    if all(board[i][2 - i] == player for i in range(3)):
        return True
    return False

# 调用示例:判断'X'是否获胜
if check_win(board, 'X'):
    print("X获胜!")

四、简单可视化方案

1. 文本版可视化(无需额外库)

适合快速测试逻辑:

def print_board(board):
    for row in board:
        # 将0替换为空格,让棋盘更直观
        print(' | '.join(str(cell) if cell != 0 else ' ' for cell in row))
        # 打印分隔线(最后一行不打印)
        if row != board[-1]:
            print('-' * 9)

# 调用示例
print_board(board)

输出效果:

X |   |   
---------
  |   |   
---------
  |   |   

2. GUI版可视化(用内置tkinter库)

无需额外安装依赖,实现可交互的图形界面:

import tkinter as tk
from tkinter import messagebox

# 复用之前的create_matrix和check_win函数
def create_matrix():
    return [[0 for _ in range(3)] for _ in range(3)]

def check_win(board, 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 all(board[i][i] == player for i in range(3)):
        return True
    if all(board[i][2 - i] == player for i in range(3)):
        return True
    return False

def make_move(row, col):
    global current_player
    if board[row][col] == 0:
        board[row][col] = current_player
        buttons[row][col].config(text=current_player)
        # 判断胜负
        if check_win(board, current_player):
            messagebox.showinfo("游戏结束", f"{current_player}获胜!")
            reset_board()
        # 判断平局
        elif all(cell != 0 for row in board for cell in row):
            messagebox.showinfo("游戏结束", "平局!")
            reset_board()
        # 切换玩家
        else:
            current_player = 'O' if current_player == 'X' else 'X'

def reset_board():
    global board, current_player
    board = create_matrix()
    current_player = 'X'
    for row in range(3):
        for col in range(3):
            buttons[row][col].config(text='')

# 初始化游戏状态
board = create_matrix()
current_player = 'X'

# 创建主窗口
root = tk.Tk()
root.title("井字棋")

# 创建按钮矩阵
buttons = []
for row in range(3):
    button_row = []
    for col in range(3):
        btn = tk.Button(root, text='', width=10, height=3, 
                        command=lambda r=row, c=col: make_move(r, c))
        btn.grid(row=row, column=col)
        button_row.append(btn)
    buttons.append(button_row)

# 启动GUI主循环
root.mainloop()

内容的提问来源于stack exchange,提问作者Marshall Crew

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 09:50:44