英文:
Too many values to unpack, error only occurs with high iterations
问题
I'm here to help with the translation. Please note that I'll only translate the non-code parts.
我是新手学习Python和编程。我写了一个模拟掷骰机制的程序。现在我想计算不同情景下的成功几率。我的函数有时候有效,但我无法弄清楚为什么有时候不行。如果迭代次数较低,它有效,但如果使用较高的数字,它就会失败。
我收到以下错误:ValueError: 在simple_check_success_statistic中的for循环中解包值过多(预期7个)。
我会很感激您能提供建议。
谢谢您的考虑。
英文:
I am new to python and coding in general. I wrote a program to simulate a dice mechanic. Now I want to calculate the successchance for different scenarios. My function works...sometimes and I´m not able to figure ot why it does not. If the iterations are low it works, if I use higher numbers it fails.
I get: ValueError: too many values to unpack (expected 7) in the for loop in simple_check_success_statistic
I would be glad for hints.
Thank you for considering.
import random
import math
def roll_dice(sides):
    #get result of dice roll
    return random.randint(1, sides)
def simple_check(skillvalue, targetnumber, temptationdice, luckydice, temptfate):
    # Roll 3D20
    dice_rolls = sorted([roll_dice(20) for _ in range(3)])
    # Check for automatic failure
    if dice_rolls.count(1) >= 2:
        return "Automatic Failure"
    # Roll Temptation Dice and Lucky Dice
    td_rolls = [roll_dice(4) for _ in range(temptationdice)]
    ld_rolls = [roll_dice(4) for _ in range(luckydice)]
    # Check for 4 in TD and LD
    td_4 = 4 in td_rolls
    ld_4 = 4 in ld_rolls
    # Determine the chosen value
    if td_4 and ld_4:
        chosen_value = dice_rolls[1]  # Middle value
    elif td_4:
        chosen_value = dice_rolls[0]  # Lowest value
    elif ld_4 or tf == 1:
        chosen_value = dice_rolls[2]  # Highest value
    else:
        chosen_value = dice_rolls[1]  # Middle value
    # Calculate the Check Result
    cr = skillvalue + chosen_value - 10
    # Calculate Measure of Success
    if cr >= targetnumber:
        marks = math.floor((cr - tn) / 3)
    else:
        marks = 0
    # Determine success or failure
    if cr >= targetnumber:
        return "Success", cr, dice_rolls, td_rolls, ld_rolls, marks, temptfate
    else:
        return "Failure", cr, dice_rolls, td_rolls, ld_rolls, marks, temptfate
def userinput():
    
    #get values for the check
    skillvalue = int(input("Enter Skill Value (0-20): "))
    targetnumber = int(input("Enter Target Number (0-20): "))
    temptationdice = int(input("Enter number of Temptation Dice in pool: "))
    luckydice = int(input("Enter number of Lucky Dice in pool: "))
    while True:
        user_input = input("Tempt fate? (y/n): ").strip().lower()
        if user_input == "y":
            temptfate = True
            break
        elif user_input == "n":
            temptfate = False
            break
        else:
            print("Invalid input. Please enter 'Y' or 'N'.")
    return skillvalue, targetnumber, temptationdice, luckydice, temptfate
def simple_check_success_statistic(iterations, skillvalue, targetnumber, temptationdice, luckydice, temptfate):
    success_array = []
    #get a number of results
    for i in range(iterations):
        result, cr, dice_rolls, td_rolls, ld_rolls, marks, tempted = simple_check(skillvalue, targetnumber, temptationdice, luckydice, temptfate)
        success_array.append(result)
    #determine percentage of successful results
    print(str(success_array.count("Success")/iterations)+"%")
sv, tn, td, ld, tf = userinput()
simple_check_success_statistic(1000, sv, tn, td, ld, tf)
I ran the code through chatgpt (...no comment please 
 ) but it did not spot an error. I looked up arrays and checked the number of variables i return from simple check function. But as i said it sometimes works, othertimes not. I´m a bit lost.
答案1
得分: 1
在第16行,你返回了一个单一的值,"自动失败":
    if dice_rolls.count(1) >= 2:
        return "自动失败"
为了修复这个问题,你应该检查自动失败:
        res = simple_check(skillvalue, targetnumber, temptationdice, luckydice, temptfate)
        if len(res) == 1:
            ... # 处理自动失败(退出?)
        else:
            result, cr, dice_rolls, td_rolls, ld_rolls, marks, tempted = res
            ... # 继续之前的操作
英文:
In line 16 you return a single value, "Automatic Failure":
    if dice_rolls.count(1) >= 2:
        return "Automatic Failure"
To fix this, you should check for automatic failure
        res = simple_check(skillvalue, targetnumber, temptationdice, luckydice, temptfate)
        if len(res) == 1:
            ... # Do automatic failure handling (exit?)
        else:
            result, cr, dice_rolls, td_rolls, ld_rolls, marks, tempted = res
            ... # continue as before
答案2
得分: 0
在 "simple_check" 函数中,你期望它返回7个不同的值,然后将这些值赋给变量,但在以下部分:
检查自动失败
if dice_rolls.count(1) >= 2:
return "自动失败"
你只返回了一个值。我通过返回6个零来修复了这个问题,就像这样:
检查自动失败
if dice_rolls.count(1) >= 2:
return "自动失败", 0, 0, 0, 0, 0, 0
你可以考虑将所有这些作为列表返回,然后使用 if 语句检查其长度以确定接下来该做什么。你可以说如果它的长度等于7,那么我们可以访问所有7个索引,没有问题。如果长度为1,那么我们就得到了一个自动失败。
希望这能有所帮助!如果你需要更多解释,请评论,我会编辑我的答案。
英文:
In the "simple_check" function you are expecting it to return 7 different values and then assign those values to variables, but in the:
# Check for automatic failure
if dice_rolls.count(1) >= 2:
    return "Automatic Failure"
section you are only returning one value. I fixed this by returning 6 zeroes with what you expected like so:
# Check for automatic failure
if dice_rolls.count(1) >= 2:
    return "Automatic Failure", 0, 0, 0, 0, 0, 0
Something you could consider is returning this all as a list and then checking its length with an if statement to determine what to do next. You could say if its length is equal to 7, then we can access all 7 of those indices and there was no issue. If its length is 1, then we got an automatic failure.
Hope this helps! And if you need anymore clarification please comment and I'll edit my answer.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论