Mastermind游戏wrong_position函数报错:ValueError(预期2值解包,实际0个)
Mastermind游戏代码错误:wrong_position函数的ValueError问题
问题描述
代码运行时触发以下错误:
ValueError: not enough values to unpack (expected 2, got 0)
错误出在wrong_position函数的这行代码:
copy_guess[:], copy_code[:] = zip(*((a, b) for a, b in zip(guess,code) if a != b))
除该函数外,其余功能均正常;移除上述代码行后,多数场景能运行但仍存在异常。
完整相关代码
mastermind_funcs.py 文件
import random max_range = 5 code_lines = 4 def generate_code(): code_arr = [] for i in range(code_lines): code_arr.append(random.randint(0,max_range)) return code_arr def right_position(guess,code): right_positions = 0 answer_position = [len(set(i)) == 1 for i in zip(guess,code)] for x in answer_position: if x == True: right_positions += 1 return right_positions def all_positions_right(guess,code): answer_position = [len(set(i)) == 1 for i in zip(guess,code)] return answer_position
存在问题的wrong_position函数
def wrong_position(guess,code): char_number = 0 copy_guess = guess copy_code = code copy_guess[:], copy_code[:] = zip(*((a, b) for a, b in zip(copy_guess,copy_code) if a != b)) for a in copy_guess: for b in copy_code: if a == b: char_number += 1 return char_number
主文件代码
from mastermind_funcs import generate_code, right_position, wrong_position , all_positions_right code_lines = 4 def guesslist_func(): i = 1 guess_list = [] while i <= code_lines: x = int(input("guess number ")) guess_list.append(x) i += 1 return guess_list def main(): right_code = generate_code() print(right_code) true_list = [True,True,True,True] value = True guess_count = 0 while value: guess_list = guesslist_func() if all_positions_right(guess_list,right_code) == true_list: value = False print("grattis, coden var " , right_code , ".") else: if right_position(guess_list,right_code) > 0: print(right_position(guess_list,right_code)) print(wrong_position(guess_list,right_code)) else: print(wrong_position(guess_list,right_code)) guess_count += 1 print("du klarade det på" , guess_count , "gissningar.") if __name__ == "__main__": main()
错误原因
当猜测的数字与密码完全匹配(所有位置的a == b)时,生成器表达式((a, b) for a, b in zip(copy_guess,copy_code) if a != b)会返回空序列。此时zip(*空序列)没有任何输出,尝试将其解包给copy_guess[:]和copy_code[:]两个变量时,就会触发"expected 2, got 0"的ValueError。
此外,原函数的嵌套循环逻辑存在缺陷:遇到多个相同数字时会重复计数,导致结果不准确。
修复方案
换一种更简洁准确的逻辑实现wrong_position:先统计猜中数字的总数量(不考虑位置),再减去正确位置的数量,结果就是位置错误但数字正确的数量。
修复后的函数代码:
def wrong_position(guess, code): # 统计所有匹配数字的总数(忽略位置) total_matched = 0 # 复制密码列表,避免修改原数据 temp_code = code.copy() for num in guess: if num in temp_code: total_matched += 1 temp_code.remove(num) # 移除已匹配的数字,避免重复计数 # 总匹配数减去正确位置的数量,得到位置错误的匹配数 return total_matched - right_position(guess, code)
这个方案既避免了原代码的解包错误,又能准确计算位置错误的匹配数量,逻辑更清晰可靠。
内容的提问来源于stack exchange,提问作者Milloz
相关产品推荐
相关产品推荐

