Объясните работу кода в задачке python

Рейтинг: -1Ответов: 1Опубликовано: 07.02.2023

Непонятен код там, где добавлены комментарии. Объясните пожалуйста работу кода в отмеченных моментах. Вот описание задачи: Напишите программу «Генератор персонажей» для ролевой игры. Пользователю должно быть предоставлено 30 пунктов, которые можно распределить между четырьмя характеристиками: Сипа, Здоровье, Мудрость и Ловкость. Надо сделать так, чтобы пользователь мог не только брать эти пункты из общего «Пула», но и возвращать их туда из характеристик, которым он решит присвоить другие значения.

print('Hi! You have 30 points and you can distribute \
them between 4 characteristics \n-Strength\n-Health\n-Wisdom\n-Skill')
table={'Strength':0, 'Health':0, 'Wisdom':0, 'Skill':0}
characteristics=['Strength', 'Health', 'Wisdom', 'Skill']
all_points=30
choose=None
choose_ch=None
while choose!=0:
  print('\n0-Exit\n1-Add points to characteristic\n2-Remove points from characteristic\n3-Look at the list with points')
  choose=int(input('\nYour choice: '))
  if choose==1:
    print('What do you want to change?\n1-Strength\n2-Health\n3-Wisdom\n4-Skill''')
    choose_ch=int(input('\nYour choice: '))
    points = int(input('\nHow many points: '))
    if points<0:
        points=points*(-1)
    x=all_points-points
    while x<0:
        print('You run out of points. Left {} points at all'.format(all_points))
        points = int(input('\nHow many points: '))
        x = all_points - points
    table[characteristics[choose_ch-1]]+=points #Что значит эта конструкция и почему отнимают1
    all_points-=points
  if choose==2:
        print('What do you want to change?\n1-Strength\n2-Health\n3-Wisdom\n4-Skill''')
        choose_ch = int(input('\nYour choice: '))
        points = int(input('\nHow many points: '))
        if points>0:
            points=points*(-1) # зачем умножение на -1
        y=table[characteristics[choose_ch - 1]]+points
        if y<0: # почему условие меньше 0
            table[characteristics[choose_ch - 1]]=0 # почему равно 0
            all_points+=(-points+y)
        else:
            table[characteristics[choose_ch - 1]] += points
            all_points += points
  if choose==3:
      for characteristic, point in table.items(): # зачем тут point. как работает эта строка?
          print(characteristic, point)
      print("Left {} spare points".format(all_points))
input('\nPress enter')

Ответы

▲ 1Принят
table[characteristics[choose_ch - 1]] += points  # Что значит эта конструкция и почему отнимают1

У вас есть 2 переменных: table и characteristics. Список (list) characteristics представляет собой набор возможных ключей к словарю (dict) table.

Дословно эту строчку можно перевести так:

В словаре table будет взят ключ, который соответствует определённой позиции в characteristics. В обращениях по индексам ([<...>]) счёт начинается с нуля, поэтому например при указании индекса 2, будет взят 3-ий элемент - для этого нужно уменьшить выбор пользователя choose_ch на 1.

Значению, которое будет получено в результате этой строчки, прибавится points.

Чтобы лучше понять, взгляните на эти полностью эквивалентные примеры:

x += 1
x = x + 1

points = points * -1  # Зачем умножение на -1

Скобки у -1 можно опустить, т.к. здесь это не влияет на приоритет операций.

Здесь всё просто: умножение на -1 меняет знак на противоположный. В данном случае это произойдёт если points будет больше нуля.


if y < 0:  # Почему условие меньше 0
    table[characteristics[choose_ch - 1]] = 0  # Почему равно 0

После объяснения 2 предыдущих пунктов, советую вынести выражение table[characteristics[choose_ch - 1]] в отдельную переменную, т.к. дубликация кода не очень хорошая практика.

Смотрите: y - это table[characteristics[choose_ch - 1]] + points и судя по всему не допускается чтобы значение было отрицательным. Первая строчка в блоке if y < 0: - это обнуление значения если оно стало отрицательным.


for characteristic, point in table.items():  # Зачем тут point. Как работает эта строка?
    print(characteristic, point)

Представьте себе словарь: {"key": 100}. У словарей есть метод: .items(), который возвращает ключ-значение в виде кортежа, здесь это будет ("key", 100). И есть ещё одна фишка: распаковка коллекций (вообще, более обширная тема). Соответственно в characteristic будет помещено "key", а в point - 100.