Как определить, когда выполняется свертка максимального числа?

#python #if-statement #random

#python #if-оператор #Случайный

Вопрос:

Кажется, что на этот вопрос можно было бы легко ответить, просто указав if для моего максимума в диапазоне, НО, пожалуйста, уделите секунду чтению, прежде чем называть меня идиотом. Я создаю программу, которая позволяет пользователю выбирать между множеством разных кубиков. Мне интересно, есть ли простой способ определить, когда выпадает максимальное значение из любого из вариантов, без установки операторов if для всех разных кубиков.

 def inphandle(choice):
    if choice==4:
        roll = random.randint(1,4)
    elif choice==6:
        roll = random.randint(1,6)
    elif choice==8:
        roll = random.randint(1,8)
    elif choice==10:
        roll = random.randint(1,10)
    elif choice==20:
        roll = random.randint(1,20)
    return roll

def dice(roll):
    min = 0
    if roll==1:
        print("Min roll! Try again!")
        min = min 1
    if roll 


def mainmenu():
    print("Please choose from the following options:")
    print("Roll | EXIT")
    option = input()
    if option=="EXIT" or option=="exit" or option=="Exit"
        print("You rolled"   max   "max rolls and "   min   " min rolls! Goodbye!")

def main():
    choice = int(input("Please enter a number corresponding to the number of faces on your dice. E.x. 4 for 4-Sided: "))
    cont = input("Would you like to roll the dice? Y or N: ")
    while cont=="y" or cont=="Y":
        roll = inphandle(choice)
        dice(roll)
        cont = input("Would you like to roll again? Y or N: ")
    while cont=="n" or cont=="N":
        easteregg()
        cont = input("Do I get bunus points now?!?")
main()
 

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

Комментарии:

1. Я в замешательстве, потому def dice(roll): что является неполным и ничего не возвращает, и я не уверен, где вы хотите проверить, возвращается ли максимальное значение. Неясно, на что мы должны смотреть.

2. Максимальное значение для текущего кубика равно choice , просто сравните с выпавшим значением.

Ответ №1:

Позвольте мне предложить создать класс, который обрабатывает различные типы кубиков:

 class Die(object):
    def __init__(self, num_faces):
        self.num_faces = num_faces

    def roll(self):
        return random.randint(1, self.num_faces)

    def is_min(self, number):
        return number == 1

    def is_max(self, number):
        return number == self.num_faces
 

Я бы сказал, что это допустимая ситуация для этого, и вы узнаете о классах 😉

Затем используйте класс:

 def main():
    minimums = maximums = 0
    choice = int(input("Please enter a number corresponding to the"
                       " number of faces on your dice. E.x. 4 for 4-Sided: "))
    die = Die(choice)
    cont = input("Would you like to roll the dice? Y or N: ")
    while cont.lower() == "y":
        number = die.roll()
        if die.is_min(number):
            minimums  = 1
        if die.is_max(number):
            maximums  = 1
        cont = input("Would you like to roll again? Y or N: ")

main()
 

Обратите внимание, что я переместил ваши min max счетчики amp; в main, потому что альтернативой является создание глобальных значений, что плохо.

Я также переименовал их, потому min что и max — это имена встроенных функций. Лучше научиться не скрывать их.

Комментарии:

1. Это хорошая практика (я думаю), к которой можно прибегнуть while cont=="y" or cont=="Y": while cont.lower() == 'y' .

2. @Nf4r Абсолютно. Я тоже это изменю.

Ответ №2:

Это то, что я бы сделал:

измените inphandle на это:

 def inphandle(choice):
  roll = random.randrange(1,choice 1,1)
  return roll
 

И измените main() на:

 def main():
  choice = int(input("Please enter a number corresponding to the number of faces on your dice. E.x. 4 for 4-Sided: "))
  valid_inputs = [4,6,8,10,12]
  if choice not in valid_inputs:
    print('Valid inputs are: 4,6,8,10,12. Try again.')
    main()
  cont = input("Would you like to roll the dice? Y or N: ")
  while cont=="y" or cont=="Y":
    roll = inphandle(choice)
    dice(roll)
    cont = input("Would you like to roll again? Y or N: ")
  while cont=="n" or cont=="N":
    easteregg()
    cont = input("Do I get bunus points now?!?")
 

Просто немного разъяснений по поводу random.randrange:

 random,randrange('from','to','increments')
 

from — это минимальное значение, а to — максимальное значение, КРОМЕ самого себя.
так что, если вам нужен диапазон от 1 до 4, поставьте от 1 до 5.
приращение: поставьте 1 для приращений «1», чтобы возможные выходные данные были равны 1, 2, 3 или 4 вместо 1.3252342 или 2.446211

Комментарии:

1. Рекурсивный вызов main() является ошибкой. Python имеет ограничение глубины рекурсии, что означает, что пользователь, который вводит 3 много раз, в конечном итоге вызывает исключение. Вместо этого это должен быть while choice not in valid_inputs цикл.

2. хм, каждый день узнаешь что-то новое! Для меня это имеет смысл. Спасибо 🙂

Ответ №3:

первое изменение inphandle

 def inphandle(choice):
    return random.randint(1,choice)
 

а затем измените

     while cont=="y" or cont=="Y":
        roll = inphandle(choice)
        dice(roll,choice)

   ...
 def dice(roll,max_val):
       if roll == max_val:print "MAX"
       elif roll == 1:print "MIN"
 

Комментарии:

1. ну, не используйте max для имени аргумента 😉

2. lol хороший улов… несмотря на то, что fwiw, поскольку я никогда на самом деле не использую встроенный, и он только затеняет его локально … (все равно плохо это делать … (хотя я бы не возражал, если бы они поставили свою домашнюю работу с максимальным аргументом))

Ответ №4:

Просто используйте

 def inphandle(choice):
    roll = random.randint(1, choice)
    return roll == choice
 

Комментарии:

1. В этом коде есть ошибки, например, посмотрите def dice(roll): . Как этот ответ «определяет, когда максимальное значение откатывается от любого из вариантов»?

2. я думаю, вы получили отрицательный результат (я дал вам 1), потому что, хотя ваше предложение является огромным улучшением… это не отвечает на актуальный вопрос постеров

3. @JoranBeasley Я проголосовал против по причине, указанной в моем комментарии.