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
相关产品推荐
相关产品推荐

