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

基于CMU Python课程的井字棋:如何避免点击已有形状的格子

解决CMU Python井字棋形状重叠问题

核心思路:维护棋盘状态数组,点击前先校验格子是否已被占用

不需要依赖图形库的复杂检查,自己维护一个记录每个格子状态的二维数组是最直接可靠的方案,适配CMU课程专属函数的实现步骤如下:

  1. 初始化棋盘状态
    定义一个3×3的二维列表,用None标记空格子,用具体值(比如'circle'/'square')标记已占用的格子:
# 全局变量:记录每个格子的状态,None=空,'circle'=红圆,'square'=蓝方块
board = [[None for _ in range(3)] for _ in range(3)]
# 定义每个格子的尺寸,根据你的画布大小调整
CELL_SIZE = 120
  1. 在点击事件中加入校验逻辑
    利用CMU课程常用的onMousePress函数,先将点击坐标转换为棋盘的行列索引,检查该格子是否为空,只有空格子才绘制形状并更新状态:
def onMousePress(mouseX, mouseY):
    # 计算点击位置对应的棋盘行列(整数除法自动取整)
    row = mouseY // CELL_SIZE
    col = mouseX // CELL_SIZE
    
    # 双重校验:确保点击在棋盘范围内,且格子为空
    if 0 <= row < 3 and 0 <= col < 3 and board[row][col] is None:
        # 根据当前玩家绘制对应形状(这里假设红圆是玩家1,蓝方块是玩家2)
        # 绘制红圆:圆心在格子中心
        drawCircle(col * CELL_SIZE + CELL_SIZE//2, row * CELL_SIZE + CELL_SIZE//2, 45, fill='red')
        # 更新棋盘状态
        board[row][col] = 'circle'
        
        # 如果是玩家2回合,替换成绘制蓝方块的代码:
        # drawRect(col * CELL_SIZE + 10, row * CELL_SIZE + 10, CELL_SIZE-20, CELL_SIZE-20, fill='blue')
        # board[row][col] = 'square'
    # 若格子已被占用,直接跳过绘制逻辑
    else:
        pass
  1. 额外优化提示
  • 如果需要支持玩家切换,可以再定义一个全局变量current_player,每次绘制后切换值(比如current_player = 'circle' if current_player == 'square' else 'square')
  • 如果你尝试使用CMU图形库的形状检查函数(比如getShapesAt类函数),虽然可以实现,但不如自己维护状态数组高效,且避免图形层级导致的误判

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 20:15:17