Я сделал простой ролик для игры в кости с for-in loop, который берет 2 части input, количество костей и количество сторон костей. Когда рулон сделан, результаты выводятся на экран.

После того, как начальный бросок сделан, я хотел бы, чтобы код начинался снова, с нового inputs, без генерации exit code 0.

##Original design obviously does not loop
from random import randint
import time
dice = int(input("\nHow many dice?\n   "))
sides = int(input("How many sides?\n   "))

def roll():
    for quantity in range(dice):
        time.sleep(.5)
        print(randint(1, sides))

roll()

Я переместил переменные input из global scope в local scope, чтобы они могли обновляться при каждом повторении. Когда я заканчиваю function, вызывая function, я достигаю некоторого успеха. Я могу loop бесконечно обрабатывать процесс, не генерируя exit code 0, но любое количество кубиков, кроме 1, похоже, не регистрируется. Таким образом, я могу бросить только одну кость за раз.

##Design 2 does not generate any exit codes and continues to loop
##endlessly but will not register more than 1 dice
from random import randint
import time

def roll():
    dice = int(input("\nHow many dice?\n   "))
    sides = int(input("How many sides?\n   "))
    for quantity in range(dice):
        time.sleep(.5)
        print(randint(1, sides))
        roll()

roll()

Я изменил function, чтобы он не заканчивался самим calling. Вместо этого я создал новую функцию, которая ничего не делает, кроме вызова первой. Я поместил избыточную функцию после первой и смог успешно достичь своей цели бросать любое количество односторонних кубиков, как мне угодно ... дважды. После двух итераций / циклов это генерирует exit code 0

##Current design will register all input data correctly 
##but only loops 2 times before generating an `exit code 0`
from random import randint
import time

def roll():
    dice = int(input("\nHow many dice?\n   "))
    sides = int(input("How many sides?\n   "))
    for quantity in range(dice):
        time.sleep(.5)
        print(randint(1, sides))

def roll_again():
    roll()

roll()
roll_again()

Кто-нибудь знает, что я делаю не так?

2
Marcvs 30 Май 2019 в 10:01

2 ответа

Лучший ответ

Вам нужно поместить игровую логику в цикл while; введите ноль кубиков, чтобы выйти, когда вы закончите играть.

from random import randint
import time


def roll():
    for quantity in range(dice):
        time.sleep(.5)
        print(randint(1, sides))

while True:
    dice = int(input("\nHow many dice? (zero to stop)\n   "))
    if dice == 0:
        break
    sides = int(input("How many sides?\n   "))
    roll()
3
Reblochon Masque 30 Май 2019 в 07:28

Вы можете использовать цикл while

from random import randint
import time

def roll():
    dice = int(input("\nHow many dice?\n   "))
    sides = int(input("How many sides?\n   "))
    for quantity in range(dice):
        time.sleep(.5)
        print(randint(1, sides))

while True:
    roll()

Это запустит скрипт навсегда, новый вход после всех бросков.

Для выхода нажмите Ctrl+C

Справочная информация: цикл while проверит условие в начале и запустится, если оно выполнено (True). В этом случае условие всегда устанавливается на True, поэтому оно навсегда выполнено ;-)

0
ilja 30 Май 2019 в 07:14