Python3中二维数组遍历修改及井字棋实现问题求助
井字棋问题解决方案
一、修复矩阵创建代码
你提供的创建矩阵代码存在两个核心问题:
- 传入的是空数组
array,却试图访问mtrx[i][j],空数组无任何元素,直接报错。 - 使用
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
相关产品推荐
相关产品推荐

