Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于循环中的另一个数组更改数组中的元素?_Python_Arrays_Loops - Fatal编程技术网

Python 基于循环中的另一个数组更改数组中的元素?

Python 基于循环中的另一个数组更改数组中的元素?,python,arrays,loops,Python,Arrays,Loops,这是一场掷骰子游戏。每个玩家掷骰子两次(我定义了一个函数来实现这一点),我将掷骰子保存在一个数组中。因此,有三名玩家的回合可能看起来像[[1,6],[3,4],[5,2] 我想创建一个数组来保存每个玩家的分数(两个骰子的总和)。我想要分数[0]==玩家1,分数[1]==玩家2,等等 我尝试创建一个长度等于玩家数量的空数组,然后在循环中更改数组的元素 def dice(players): score = [0]*players rolls = [] for i in r

这是一场掷骰子游戏。每个玩家掷骰子两次(我定义了一个函数来实现这一点),我将掷骰子保存在一个数组中。因此,有三名玩家的回合可能看起来像
[[1,6],[3,4],[5,2]

我想创建一个数组来保存每个玩家的分数(两个骰子的总和)。我想要
分数[0]==玩家1
分数[1]==玩家2
,等等

我尝试创建一个长度等于玩家数量的空数组,然后在循环中更改数组的元素

def dice(players):
    score = [0]*players 
    rolls = [] 
    for i in range(0,players):
        rolls.append(diceroll(2))
        for r in rolls:
            score[i] += sum(r)
    return rolls, score
对于骰子(6),我得到了这个:

([[1, 2], [2, 2], [4, 2], [6, 2], [6, 4], [1, 1]], [3, 7, 13, 21, 31, 33])
而不是我想要的:

([[1, 2], [2, 2], [4, 2], [6, 2], [6, 4], [1, 1]], [3, 4, 6, 8, 10, 2])
为什么它的分数部分会添加到上一个索引中?有人能解释一下吗?我希望它只添加到
得分[I]
,并将玩家分开

编辑:我想能够做多轮骰子,这样分数可以增加。这就是为什么我不想做
score[I]=sum(r)

为什么它的分数部分会添加到上一个索引中

该循环表示,
score[i]
是迄今为止生成的
rolls
中所有值的总和:

for r in rolls:
    score[i] += sum(r)
所以计算如下:

score[0] = rolls[0][0] + rolls[0][1]
score[1] = (rolls[0][0] + rolls[0][1]) + (rolls[1][0] + rolls[1][1])
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^ the previous roll
score[2] = (rolls[0][0] + rolls[0][1]) + (rolls[1][0] + rolls[1][1]) + (rolls[2][0] + rolls[2][1])
           ^^^roll prior to the previous ^^^^^^^^^ the previous roll

依此类推,循环是嵌套的,这是您的问题。我会尽力解释的

这是你的密码

def dice(players):
    score = [0]*players 
    rolls = [] 
    for i in range(0,players):
        rolls.append(diceroll(2))
        for r in rolls:
            score[i] += sum(r)
    return rolls, score
基本上,您已经要求python运行for循环,这样每个玩家都可以掷一次骰子,然后将该骰子附加到
rolls
。 但是每个玩家在掷骰后,你要求python计算当前玩家每次掷骰时发生的所有掷骰。所以玩家1的掷骰会被计算多次

这段代码应该适合你。查看for循环的位置,还请注意我将
+=
删除到
=
,因为我们不需要添加到分数中,只需要计算分数然后存储它

def dice(players):
    score = [0]*players 
    rolls = [] 
    for i in range(0,players):
        rolls.append(diceroll(2))

    for i in range(len(rolls)):
        score[i] = sum(rolls[i])
    return rolls, score

现在我们让每个玩家掷一次骰子,一旦每个人都掷了骰子,我们就有另一个外部for循环来计算分数。

试着把你的问题分解成更小的部分

您有一个列表,其中每个对象包含单个玩家掷骰子

for playerRolls in players:
现在,
playerRolls
是一个列表,其中包含每个玩家掷骰的数字。这些的总和就是他们的分数。所以

    playerScore = 0
    for diceRoll in playerRolls:
        playerScore += diceRoll
    # or a nicer way:
    playerScore = sum(playerRolls)
    
现在将此值附加到分数

    score.append(playerScore)
总而言之:

score = []
for playerRolls in players:
    playerScore = sum(playerRolls)
    score.append(playerScore)

在最后一个循环中,
i
始终等于不应影响代码的
players-1
。除非你发布的代码中有我遗漏的东西,否则它仍然有效。哦,我明白你的意思了,那是我的错别字。请看编辑。OP想要“一个保存每个玩家分数的数组”,而最后一个循环只适用于最后一个玩家的得分。我把它从foreach改为for。你做的是累积和,而不是“每一个玩家”的分数。换言之,掷骰记录所有掷骰(同样适用于先前的玩家),当您进行
sum(r)
时,它也会将先前的掷骰加在一起。