如何解决Pygame井字棋游戏中左键点击被重复检测的问题
解决Pygame中单次鼠标点击被多次检测的问题
这个问题我之前也碰到过!原因在于你用的pygame.mouse.get_pressed()是用来检测鼠标按键是否处于按住状态的,而不是捕捉单次点击的动作。因为你的游戏以30FPS运行,只要你按住左键的时间超过1/30秒,循环就会跑好几轮,每一轮都会检测到左键是按住的,自然就会打印多次。
正确的解决方案:监听鼠标点击事件
Pygame的事件系统提供了pygame.MOUSEBUTTONDOWN事件,这个事件只会在鼠标按键按下的那一刻触发一次,完全不会有重复触发的问题。你只需要把点击检测的逻辑移到事件处理的循环里即可。
修改后的完整代码
import pygame from pygame.constants import K_DOWN import time from time import sleep pygame.init() screen = pygame.display.set_mode((300, 300)) tickNumber = int(0) done = False boxOneSymbol = 0 boxTwoSymbol = 0 boxThreeSymbol = 0 boxFourSymbol = 0 boxFiveSymbol = 0 boxSixSymbol = 0 boxSevenSymbol = 0 boxNineSymbol = 0 smallBoxColor = (154, 154, 154) playerTurn = 0 FPS_CLOCK = pygame.time.Clock() font = pygame.font.SysFont('Roboto', 13) # 初始化缺失的is_blue变量 is_blue = True while not done: for event in pygame.event.get(): if event.type == pygame.QUIT: done = True if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE: is_blue = not is_blue # ====== 新增的单次点击检测逻辑 ====== if event.type == pygame.MOUSEBUTTONDOWN: if event.button == 1: # 1代表左键,2是中键,3是右键 print("Left Mouse Key was clicked once!") # 这里可以添加格子点击判断逻辑,比如获取点击坐标: # mouse_x, mouse_y = event.pos # 然后判断点击落在哪个小方块内 # ====== 删除了原有的持续按住检测代码 ====== pressed = pygame.key.get_pressed() pygame.draw.rect(screen, (0, 128, 255), pygame.Rect(10, 10, 280, 280)) # 绘制所有小方块 pygame.draw.rect(screen, smallBoxColor, pygame.Rect(30, 30, 60, 60)) pygame.draw.rect(screen, smallBoxColor, pygame.Rect(30, 120, 60, 60)) pygame.draw.rect(screen, smallBoxColor, pygame.Rect(30, 215, 60, 60)) pygame.draw.rect(screen, smallBoxColor, pygame.Rect(120, 215, 60, 60)) pygame.draw.rect(screen, smallBoxColor, pygame.Rect(120, 120, 60, 60)) pygame.draw.rect(screen, smallBoxColor, pygame.Rect(120, 30, 60, 60)) pygame.draw.rect(screen, smallBoxColor, pygame.Rect(215, 215, 60, 60)) pygame.draw.rect(screen, smallBoxColor, pygame.Rect(215, 120, 60, 60)) pygame.draw.rect(screen, smallBoxColor, pygame.Rect(215, 30, 60, 60)) textsurface = font.render('Au joueur 1!', False, (0, 0, 0)) screen.blit(textsurface, (10, 290)) # 将文字渲染到屏幕上 pygame.display.update() FPS_CLOCK.tick(30) tickNumber += 1
额外小提示
- 你代码里的
is_blue变量没有初始化,我已经在开头补上了,不然第一次按空格会报错。 - 之前渲染的文字没有用
screen.blit()放到屏幕上,所以不会显示,我也加上了这部分逻辑。 pygame.display.update()和pygame.display.flip()功能重复,保留一个就够了,这里用update()更高效。
内容的提问来源于stack exchange,提问作者pingouin_afk
相关产品推荐
相关产品推荐

