Я сделал простой ролик для игры в кости с 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 ответа
Вам нужно поместить игровую логику в цикл 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()
Вы можете использовать цикл 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
, поэтому оно навсегда выполнено ;-)
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.