Объединить два цикла - PullRequest
       1

Объединить два цикла

0 голосов
/ 23 октября 2018

У меня есть два цикла while, которые занимают много места в моем коде.Мне было интересно, знает ли кто-нибудь, как объединить их, чтобы сделать мой код аккуратнее и меньше, потому что я даже не знаю, с чего начать.Я посмотрел вокруг и не могу найти, как объединить две почти одинаковые петли.Надеюсь, кто-то мне поможет.Я нашел вопрос, очень похожий на этот, но для меня ответ не имеет смысла для меня, так как код не работает, и я пытался это исправить.Вот код:

for i in range(5):
while True:
    print(" ")
    input("Press enter to roll player 1 ")
    print("Rolling dice!")
    roll1=random.randint(1,6)
    roll2=random.randint(1,6)
    print(roll1)
    print(roll2)
    total=(roll1 + roll2)
    print("Your total is:" ,total)
    score1=score1 +total

    if roll1 is roll2:
        if total in even:
            score1=score1 +10
            print(score1)
            print("You rolled a double. Roll again.")
            continue
        elif total in odd:
            score1-score1 -5
            print(score1)
            print("You rolled a double. Roll again.")
            continue

    elif total in even:
        score1=score1 +10
        print(score1)
        break

    elif total in odd:
        score1=score1 -5
        print(score1)
        break

if score1<0:
    print("Player 1, you went under 0. Game over.")
    break

while True:
    print(" ")
    input("Press enter to roll player 2 ")
    print("Rolling dice!")
    roll1=random.randint(1,6)
    roll2=random.randint(1,6)
    print(roll1)
    print(roll2)
    total=(roll1 + roll2)
    print("Your total is:" ,total)
    score2=score2 +total

    if roll1 is roll2:
        if total in even:
            score2=score2 +10
            print(score2)
            print("You rolled a double. Roll again.")
            continue
        elif total in odd:
            score2=score2 -5
            print(score2)
            print("You rolled a double. Roll again.")
            continue

    elif total in even:
        score2=score2 +10
        print(score2)
        break

    elif total in odd:
        score2=score2 -5
        print(score2)
        break

if score2<0:
    print("Player 2, you went under 0. Game over.")
    break

Как вы можете видеть, они практически идентичны, за исключением того, что игрок 1 переходит к игроку 2, а счет 1 переходит к счету 2. Как я могу упростить этот код?

Ответы [ 3 ]

0 голосов
/ 23 октября 2018

Создайте определение для этого цикла.

def roller(player_num):
    while True:
        print(" ")
        input("Press enter to roll player %s " % str(player_num))
        print("Rolling dice!")
        roll1=random.randint(1,6)
        roll2=random.randint(1,6)
        print(roll1)
        print(roll2)
        total=(roll1 + roll2)
        print("Your total is:" ,total)
        score1=score1 +total

        if roll1 is roll2:
            if total in even:
                score1=score1 +10
                print(score1)
                print("You rolled a double. Roll again.")
                continue
            elif total in odd:
                score1-score1 -5
                print(score1)
                print("You rolled a double. Roll again.")
                continue

        elif total in even:
            score1=score1 +10
            print(score1)
            break

        elif total in odd:
            score1=score1 -5
            print(score1)
            break

    if score1<0:
        print("Player %s, you went under 0. Game over." %s str(player_num)
        break

roller(1)
roller(2)

Я не уверен, почему у вас есть операторы break, так как это приведет к разрыву цикла с первого раза, но здесь у вас есть код в определении, и он используется длякаждый пользователь

0 голосов
/ 23 октября 2018

Этот большой цикл while практически одинаков для игрока 1 и игрока 2, поэтому вы должны сделать его функцией и передать имя (или номер) игрока в качестве параметра.

Но естьБолее того: даже внутри функции много избыточности.Например, вы проверяете, является ли бросок четным как в парном, так и в непарном случае, и вы можете дополнительно уплотнить эту часть, используя троичное выражение ... if ... else ....Также обратите внимание, что в вашем коде есть еще несколько проблем, например, вы никогда не инициализируете score1 и score2, и у вас есть опечатка в score1-score1 -5.Кроме того, что такое even, список всех четных чисел?Вместо этого вы можете использовать total % 2 == 0, чтобы проверить, является ли total четным.

Кроме того, ваша проверка if score < 0: находится за пределами цикла.Если это так, то break не имеет смысла, так как он только вырвется из внешнего цикла for, который, вероятно, не предназначен.Кроме того, вы можете добавить некоторые выходные данные для случая, когда оценка не равна < 0.

Собрав все это вместе, функция может выглядеть примерно так:

def roll(player):
    score = 0
    while True:
        input("\nPress enter to roll, %s" % player)
        roll1 = random.randint(1,6)
        roll2 = random.randint(1,6)
        print("Rolling dice!", roll1, roll2)
        total = roll1 + roll2
        score += total
        score += 10 if total % 2 == 0 else -5
        print("Your total is:", score)
        if roll1 == roll2:
            print("You rolled a double. Roll again.")
        else:
            break
    if score < 0:
        print("%s, you went under 0. Game over." % player)
    else:
        print("%s, your final score is %d." % (player, score))

Теперь простовызовите эту функцию дважды:

for _ in range(5):
    roll("Player 1")
    roll("Player 2")
0 голосов
/ 23 октября 2018

Одна вещь, которую вы можете сделать, чтобы избежать дублирования одного и того же кода, это определить функцию, которая принимает номер игрока и соответственно изменяет счет этого игрока, например updateScore() или changeScore().Аргументами будет количество игроков (1 или 2) и количество очков, на которое вы хотите его изменить.

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