基于CMU Python课程的井字棋:如何避免点击已有形状的格子
解决CMU Python井字棋形状重叠问题
核心思路:维护棋盘状态数组,点击前先校验格子是否已被占用
不需要依赖图形库的复杂检查,自己维护一个记录每个格子状态的二维数组是最直接可靠的方案,适配CMU课程专属函数的实现步骤如下:
- 初始化棋盘状态
定义一个3×3的二维列表,用None标记空格子,用具体值(比如'circle'/'square')标记已占用的格子:
# 全局变量:记录每个格子的状态,None=空,'circle'=红圆,'square'=蓝方块 board = [[None for _ in range(3)] for _ in range(3)] # 定义每个格子的尺寸,根据你的画布大小调整 CELL_SIZE = 120
- 在点击事件中加入校验逻辑
利用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
- 额外优化提示
- 如果需要支持玩家切换,可以再定义一个全局变量
current_player,每次绘制后切换值(比如current_player = 'circle' if current_player == 'square' else 'square') - 如果你尝试使用CMU图形库的形状检查函数(比如
getShapesAt类函数),虽然可以实现,但不如自己维护状态数组高效,且避免图形层级导致的误判
内容的提问来源于stack exchange,提问作者Zer0
相关产品推荐
相关产品推荐

