Python记忆游戏状态逻辑异常:card1与card2索引值错误
问题分析与修复方案
核心问题
你的代码里card1和card2是函数局部变量,每次触发mouseclick时都会被重新赋值为0。这就导致进入state2后,之前在state0、state1阶段保存的卡片索引完全丢失,自然没法正确判断两张卡片是否匹配。
另外state2的逻辑顺序也有问题:你先处理了当前点击的卡片,再去检查之前两张的匹配性,完全搞反了流程。
修复步骤
- 将
card1和card2升级为全局变量,让它们能在函数调用之间保留值; - 调整state2的逻辑:先完成前两张卡片的匹配检查,再处理新的点击操作;
- 修正state2中不必要的重复赋值(比如匹配成功时不需要再设置
exposed[card1] = True,因为之前已经翻牌了)。
修正后的代码
def mouseclick(pos): # 把card1、card2也声明为全局变量 global state, exposed, cards, card1, card2 index = pos[0] // 50 if state == 0: # 点击第一张未翻的卡片 if not exposed[index]: card1 = index exposed[card1] = True state = 1 print(card1) elif state == 1: # 点击第二张未翻的卡片,避免重复点击同一张 if not exposed[index] and index != card1: card2 = index exposed[card2] = True state = 2 print(card2) elif state == 2: # 先检查前两张卡片是否匹配 if cards[card1] != cards[card2]: # 不匹配则翻回去 exposed[card1] = False exposed[card2] = False # 处理当前点击的新卡片(作为下一轮的第一张) if not exposed[index]: card1 = index exposed[card1] = True state = 1 else: # 如果点的是已翻的卡片,回到state2等待有效点击 state = 2 print(f"匹配检查:cards[{card1}]={cards[card1]}, cards[{card2}]={cards[card2]}") print(f"当前exposed状态:{exposed}") # 初始化全局变量 state = 0 exposed = [False] * 16 cards = [1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8] # 可通过random.shuffle(cards)打乱卡片顺序
关键改动说明
- 全局变量声明:新增
global card1, card2,确保这两个变量在函数调用间保留之前存储的索引值; - 边界检查增强:state0/state1增加
not exposed[index]判断,避免重复点击已翻卡片;state1额外限制index != card1,防止连续点击同一张卡片; - state2逻辑重构:先完成前两张卡片的匹配判断和翻回操作,再处理新点击,流程更清晰;
- 冗余代码移除:匹配成功时无需重复设置
exposed[card1] = True,因为state0/state1阶段已经完成翻牌操作,仅不匹配时需要翻回。
效果验证
现在点击索引0和1的不匹配卡片后,exposed列表中这两个位置会被正确设为False,符合预期逻辑。
内容的提问来源于stack exchange,提问作者JoeP
相关产品推荐
相关产品推荐

