You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 11:55:22