Изменение элементов в массиве на основе другого массива в l oop? - PullRequest
0 голосов
/ 03 августа 2020

Это игра в кости. Каждый игрок бросает кости два раза (я определил для этого функцию), и я сохраняю броски кубиков в виде массива. Таким образом, ход с тремя игроками может выглядеть как [[1,6], [3,4], [5,2]].

Я хочу создать массив, в котором сохраняется счет (сумма двух бросков кубиков) каждого игрока. Я хочу score[0] == Player 1, score[1] == Player 2, et c.

Я попытался создать пустой массив с длиной, равной количеству игроков, а затем изменить элементы массива, находясь в al oop.

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])

Почему раздел очков чего добавить к предыдущему индексу? Кто-нибудь может объяснить? Я хочу, чтобы он просто добавлялся к score[i] и держал игроков отдельно.

Изменить: я хочу иметь возможность делать несколько ходов костей, чтобы счет мог увеличиваться. Вот почему я не хочу делать score[i] = sum(r)

Ответы [ 3 ]

0 голосов
/ 03 августа 2020

Вы для циклов вложены, и это ваша проблема. Я попытаюсь объяснить.

Вот ваш код.

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 запустить для l oop, чтобы каждый игрок мог бросить один раз, а вы добавьте этот список к 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

Теперь мы сделали бросок для каждого игрока по одному разу, и как только все бросили, у нас есть еще один за l oop снаружи, который подсчитывает очки.

0 голосов
/ 03 августа 2020

Попробуйте разбить вашу проблему на более мелкие части.

У вас есть список, в котором каждый объект содержит кости, брошенные одним игроком.

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)
0 голосов
/ 03 августа 2020

Почему его оценка добавляется к предыдущему индексу?

Этот l oop говорит, что 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

и так далее

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...