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

pygame井字棋项目点击方格后circle绘制位置异常问题求助

问题修复方案

1. 圆圈错位核心原因

  • 网格线绘制坐标与点击判定逻辑不统一:你的窗口宽度为550,理论上每列宽度为550/3≈183,但实际绘制竖线的位置是175、370,和理论列宽不一致,导致点击判定的格子和实际显示的格子错位。
  • 圆心坐标取的是格子左上角而非中心:当前绘制圆圈的坐标(int(col * 550/3), int(row * 450/3))是对应格子的左上角位置,圆圈自然会偏移到格子边角,不会居中显示。

2. 代码修改步骤

建议先将窗口尺寸改为可被3整除的数值,避免浮点数计算误差,所有尺寸参数统一用常量定义,避免硬编码导致的逻辑不统一。

新增全局常量

# 尺寸常量统一管理
WIDTH = 600
HEIGHT = 450
CELL_WIDTH = WIDTH // 3
CELL_HEIGHT = HEIGHT // 3
CIRCLE_RADIUS = 60
CIRCLE_WIDTH = 10

修改窗口初始化代码

screen = pygame.display.set_mode((WIDTH, HEIGHT))

修改网格线绘制逻辑

def draw_lines():
    # 横向网格线
    pygame.draw.line(screen, line_color, (0, CELL_HEIGHT), (WIDTH, CELL_HEIGHT), line_width)
    pygame.draw.line(screen, line_color, (0, CELL_HEIGHT*2), (WIDTH, CELL_HEIGHT*2), line_width)
    # 纵向网格线
    pygame.draw.line(screen, line_color, (CELL_WIDTH, 0), (CELL_WIDTH, HEIGHT), line_width)
    pygame.draw.line(screen, line_color, (CELL_WIDTH*2, 0), (CELL_WIDTH*2, HEIGHT), line_width)

修改圆圈绘制逻辑,取格子中心为圆心

def draw_figures():
    for row in range(3):
        for col in range(3):
            if board[row][col] == 1:
                # 计算格子中心坐标
                center_x = col * CELL_WIDTH + CELL_WIDTH // 2
                center_y = row * CELL_HEIGHT + CELL_HEIGHT // 2
                pygame.draw.circle(screen, 'cyan', (center_x, center_y), CIRCLE_RADIUS, CIRCLE_WIDTH)
            # 补充玩家2的叉号绘制逻辑
            elif board[row][col] == 2:
                start1_x = col * CELL_WIDTH + 30
                start1_y = row * CELL_HEIGHT + 30
                end1_x = (col+1)*CELL_WIDTH - 30
                end1_y = (row+1)*CELL_HEIGHT - 30
                pygame.draw.line(screen, 'orange', (start1_x, start1_y), (end1_x, end1_y), 10)
                pygame.draw.line(screen, 'orange', (start1_x, end1_y), (end1_x, start1_y), 10)

修复is_board_full函数缺失返回值的问题

原函数棋盘满时会返回None而非True,补充返回逻辑:

def is_board_full():
    for row in range(3):
        for col in range(3):
            if board[row][col] == 0:
                return False
    return True

修改点击判定逻辑,使用统一尺寸常量

clicked_row = int(mouseY // CELL_HEIGHT)
clicked_col = int(mouseX // CELL_WIDTH)

3. 坐标计算规范方法

坐标计算不需要盲目试错,遵循两个原则即可避免错位问题:

  • 所有尺寸相关参数统一定义为常量,不要硬编码数值,修改时全局同步,不会出现逻辑不统一的问题
  • 元素坐标基于格子边界推导:比如格子中心坐标就是格子左边界 + 格子宽度/2、格子上边界 + 格子高度/2,所有计算都基于统一的格子尺寸常量,不会出现偏移。

4. 其他可优化点

  • available_square函数可以简化为return board[row][col] == 0,无需写冗余的if判断
  • 可补充胜负判定逻辑,当前代码下完棋没有胜负提示
  • 可补充棋盘满后的平局提示逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 15:24:10