Python数独游戏Pygame代码列表重复添加元素问题咨询
问题根因分析
- 遍历范围错误:你当前的循环写的是
for j in range(len(text_cor) - 1):,由于range是左闭右开区间,这个逻辑会永远跳过列表最后一个元素的校验,当坐标刚好匹配最后一个元素的坐标时,校验逻辑不会命中,就会重复插入新元素。 - 全局变量初始状态异常:你使用了全局变量
equal做标记,但每次进入函数时没有重置该变量的初始值,上一次函数调用结束后equal的残留状态会直接干扰本次的判断逻辑,导致新增逻辑错误触发。 - 按键检测逻辑易重复触发:
pygame.key.get_pressed()是逐帧检测按键状态,只要你按住按键的时间超过1帧的渲染间隔,就会连续多次触发插入逻辑,也会导致重复添加。
修复方案
你可以按照以下步骤修改代码:
- 进入函数后第一时间重置
equal的初始状态为False - 修正遍历范围,覆盖列表所有元素
- 合并重复的坐标判断逻辑,简化代码
- 建议替换为
KEYDOWN事件检测,避免长按重复触发
修复后的参考代码如下:
def typing(text_cor, pos): global numbers, equal # 每次进入函数先重置标记位,避免上次调用的残留值干扰 equal = False # 建议替换为KEYDOWN事件检测,替换原有get_pressed逻辑即可避免长按重复触发 keys = pygame.key.get_pressed() if keys[pygame.K_1]: numbers = 1 if keys[pygame.K_2]: numbers = 2 if keys[pygame.K_3]: numbers = 3 if keys[pygame.K_4]: numbers = 4 if keys[pygame.K_5]: numbers = 5 if keys[pygame.K_6]: numbers = 6 if keys[pygame.K_7]: numbers = 7 if keys[pygame.K_8]: numbers = 8 if keys[pygame.K_9]: numbers = 9 if numbers in range(1,10): target_x = pos[0] + 15 target_y = pos[1] + 10 if len(text_cor) > 0: # 修正遍历范围,覆盖所有元素 for j in range(len(text_cor)): if text_cor[j][1] == target_x and text_cor[j][2] == target_y: equal = True if text_cor[j][0] == 0: text_cor[j][0] = numbers numbers = 0 break if not equal and numbers != 0: text_cor.append([numbers, target_x, target_y]) numbers = 0 equal = True else: equal = False numbers = 0 else: text_cor.append([numbers, target_x, target_y]) numbers = 0
如果希望进一步优化性能,还可以把text_cor改成字典结构,以(x,y)坐标为key,值为对应数字,不需要遍历就能直接判断坐标是否存在,性能会比列表遍历高很多。
内容的提问来源于stack exchange,提问作者TAKSHEEL GUPTA
相关产品推荐
相关产品推荐

