Форум сайта python.su
0
RomissevdСпасибо. Громоздко выходит. Думал можно в меньше строк можно.
Офлайн
568
RuslСделай цикл, будет негромоздко
Громоздко выходит
Офлайн
0
Здравствуйте, уважаемые форумчане!
Изучаю Python сравнительно недавно, пройденный материал закрепляю написанием задач.
Вчера решил написать программу, которая будет эмулировать броски игральных костей.
Программа консольная, с текстовым юзер-интерфейсом. Ничего особенного. Работает 
Но, я знаю, что новички склонны к излишне “тяжёлым решениям”, поэтому хочу попросить Вас проглядеть мой код и, возможно подсказать, что можно улучшить или исправить.
Заранее благодарен.
С уважением, Денис
Вот, собственно, код:
#Dice roller program. import random def dice_roller(): # main function dice_qty = int(input('How many dices do you want to roll ?')) # getting amount of dices dices= {} for n in range (1, (dice_qty + 1)): # finding out how many side ech dice is if n == 1: sides = int(input('How many sides is your first dice ?')) elif n == dice_qty: sides = int(input('How many sides is your last dice ?')) else: sides = int(input('How many sides is your next dice ?')) dices[n] = sides # forming a dictionary, where key is an index number of a dice and a value is a number of sides def roll_dice(dices,n):# 'rolling function' if n > dice_qty: #return statement. If we roll all dices - exit return else: # else roll dice roll = random.randint(1, dices[n]) print(' Your ' + str(n) + ' dice ( ' + str(dices[n]) + ' sides ) has rolled ' + str(roll) + ' ! ' )# printing out results n = n + 1 roll_dice(dices,n) #rolling next dice roll_dice(dices,1) dice_roller ()
Офлайн
568
Конкатенацию строк забыть. Открыть для себя .format
Архитектурно как-то не вполне понятен мотив организовывать вложенные функции, если вы все равно передаете локальные переменные в замыкание. Зачем так?
Отредактировано FishHook (Окт. 24, 2017 09:49:55)
Офлайн
0
Благодарю Вас за ответ!
FishHookСпасибо, почитаю.
Конкатенацию строк забыть. Открыть для себя .format
FishHookДа я сам не знаю пока. Хотелось, чтобы можно было “бросить” сколько угодно костей со сколько угодно гранями. Поэтому и написал рекурсивную функцию на бросок и вывод результата.
Архитектурно как-то не вполне понятен мотив организовывать вложенные функции, если вы все равно передаете локальные переменные в замыкание. Зачем так?
Офлайн
568
RetterhalmРекурсию то я и не заметил. Рекурсия здесь - как собаке пятая нога, лишнее вообще и более того вредное, никогда не применяйте рекурсию без обоснованной алгоритмической необходимости. Рекурсия - это хороший способ переполнить стек вызовов и уронить программу.
Поэтому и написал рекурсивную функцию на бросок и вывод результата.
Офлайн
0
FishHookСпасибо, приму к сведению! (Не так давно читал про неё, наверное поэтому везде пихаю
Рекурсию то я и не заметил. Рекурсия здесь - как собаке пятая нога, лишнее вообще и более того вредное, никогда не применяйте рекурсию без обоснованной алгоритмической необходимости. Рекурсия - это хороший способ переполнить стек вызовов и уронить программу.
)print(' Your {} dice ( {} sides ) has rolled {} !'.format(n, dices[n], roll))# printing out results
Отредактировано Retterhalm (Окт. 24, 2017 10:22:37)
Офлайн
0
Вот вариант вообще без функций.
#Dice roller program. import random dice_qty = int(input('How many dices do you want to roll ?')) # getting amount of dices dices= {} for n in range (1, (dice_qty + 1)): # finding out how many side ech dice is if n == 1: sides = int(input('How many sides is your first dice ?')) elif n == dice_qty: sides = int(input('How many sides is your last dice ?')) else: sides = int(input('How many sides is your next dice ?')) dices[n] = sides # forming a dictionary, where key is an index number of a dice and a value is a number of sides n = 1 while n < dice_qty + 1: roll = random.randint(1, dices[n]) print(' Your {} dice ( {} sides ) has rolled {} !'.format(n, dices[n], roll))# printing out results n = n + 1
Отредактировано Retterhalm (Окт. 24, 2017 10:58:38)
Офлайн
568
Retterhalm
Программу тут в принципе больше обсуждать и нечего, но я дам один совет:
if n == 1: sides = int(input('How many sides is your first dice ?')) elif n == dice_qty: sides = int(input('How many sides is your last dice ?')) else: sides = int(input('How many sides is your next dice ?'))
if n == 1: message = 'How many sides is your first dice ?' elif n == dice_qty: message = 'How many sides is your last dice ?' else: message = 'How many sides is your next dice ?' sides = int(input(message))
Офлайн
568
RetterhalmНенормально вообще давать переменным ничего не значащие имена
Это нормально так переопределять значения или лучше(чтобы не путаться) определить другую переменную?
Офлайн