Pygame中如何在背景棋盘图上创建对齐棋子的矩阵?
问题解决与代码优化
核心问题修正
1. 初始化顺序错误
你的代码里先创建了screen再调用pygame.init(),这会导致运行报错,必须把pygame.init()放在最开头,先初始化Pygame再创建窗口。
2. 棋子绘制的错误方式
你现在直接在background表面上画棋子,这会永久修改背景图,导致每次循环的背景都带着之前的棋子残留。正确做法是把棋子画在screen上,每次循环先贴原始背景清空屏幕,再重新绘制当前状态的棋子。
3. 棋子偏移调整
要让棋子整体偏移100像素,只需修改位置计算里的起始偏移值,把原来的+50改成+100即可。如果背景里的棋盘实际位置有偏差,你可以根据视觉效果微调这个数值。
优化后的代码
import pygame import HasamiShogiGame1 # 先初始化Pygame pygame.init() # CONSTANTS WIDTH, HEIGHT = 700, 700 SQUARE_SIZE = 60 # 创建游戏窗口 screen = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("Hasami Shogi") # 加载并缩放背景图(保留原始背景,不直接修改它) background = pygame.image.load("image/background.png") background = pygame.transform.scale(background, (WIDTH, HEIGHT)) # 初始化游戏对象 game = HasamiShogiGame1.HasamiShogiGame() while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() exit() # 贴原始背景,清空屏幕 screen.blit(background, (0, 0)) # 获取当前棋盘状态 board = game.get_board() # 遍历棋盘绘制棋子,直接计算位置,无需提前存储字典 for row in range(9): for col in range(9): piece = board[row][col] # 调整此处的100为你需要的偏移量 x = col * SQUARE_SIZE + 100 y = row * SQUARE_SIZE + 100 if piece == "B": pygame.draw.circle(screen, (0, 0, 0), (x, y), SQUARE_SIZE // 2 - 10) elif piece == "R": pygame.draw.circle(screen, (255, 0, 0), (x, y), SQUARE_SIZE // 2 - 10) pygame.display.update()
关于最简方案的说明
你的核心思路(用背景图代替逐帧绘制棋盘)是高效且正确的,优化后的代码做了以下简化:
- 去掉了提前生成
positions字典的步骤,直接在绘制时计算棋子位置,减少内存占用,代码更简洁。 - 修正了Pygame初始化顺序的bug,避免运行报错。
- 修复了棋子绘制的逻辑,确保每次循环都基于干净的背景绘制当前状态的棋子。
如果后续需要复用棋子位置(比如处理点击选棋事件),再把位置存入字典也不迟,当前场景下直接计算是更轻量的方案。
内容的提问来源于stack exchange,提问作者spam.i.am
相关产品推荐
相关产品推荐

