0
0 комментариев
<strong>Версия:</strong> Phyton 3.7
<strong>Система:</strong> Windows 10
Среда разработки и исполнения кода <strong>PyCharm 2019.3</strong> 

<strong>О себе:</strong> <em>новичек. Последний раз с программированием связывался 5 лет назад в универе(делфи, паскаль). Тут решил для общего развития, и авось получения новой профессии попробовать  программировать.</em>
<em>Самообучение решил начать с книги "Автоматизация рутинных задач с помощью Phyton", самая, как мне показалось, доступная книга для новичка чтобы задевать все аспекты, а не вскользь.</em>
<em>Дошел до главы Словари, там было задание по работе с инвентарем (к словарю прибавить список).</em>
<em>Ну я себе решил усложнить задачу и написать мини квест с подборкой лута битвами и т.д на одно подземелье.</em>

<strong>Проблема: </strong>столкнулся с двумя проблемами, ответы на которые не смог найти. Часть нужного кода представлена ниже. 2 функции  одна проверяет синтаксис - чтобы условный игрок не вводил лишнего. Вторая обработка боя игрока с компьютером. 
<strong>1 основной вопрос:</strong> При выполнении функции fight(pvp), после вывода "вы победили" ("вы проиграли" вызвать не получилось пока что) в life_enemy передается значение 0, что заканчивает работу while. Но я столкнулся с проблемой что после этой фразы код мне заного писал 'Вы вступаете в бой с крысой' хотя этот код принадлежит ветвлению if(То-есть повторно исполнятся не должен). Но исполняется, и бесконечное количество раз. После вставки pvp = ' ' (принудительный обход if) все заработало нормально. 
<span style="text-decoration: underline;">Сам вопрос</span> - почему функция исполнялось постоянно? хотя команд для этого в коде вроде как и нет и после убийства крысы или убийства игрока программа должна отключаться. (stroka = 'rat' fight(stroka) - этим заканчивается пока весь код программы)
<strong>2 тоже интересный для меня вопрос: </strong>После ввода данных в функции def fight(pvp): по удару - данные переводятся в функцию def sintax_hit_rat(sintax): . И если они изначально был корректный ввод то все работает хорошо. Но если ввод не корректен то мы получим такое
"Выбирите куда ударять [left, up, right]
ght
Введены некоректные данные, повторите ввод
left
Выбирите куда ударять [left, up, right]"
Хотя вроде бы функция sintax_hit_rat должна была передать значение в fight(pvp) и тот продолжить выполнение. А создается впечатление что функция fight(pvp) выполняется повторно с самого начала, а не продолжается с того момента когда была вызвана функция sintax_hit_rat(sintax). Почему так происходит и как этого избежать?
<strong>3 не обязательный вопрос:  </strong>random.randint(1,3) всегда сдает мне 2 в этом коде. Проверял в другом файле - там каждый раз разные значения. Тут же "первый удар крысы" всегда приходится на up. И чаще всего там и остается. Понимаю, всевдорандом, в делфи таже хрень, но при повторном запуске кода 2 остается. 

Заранее благодарю за развернутые ответы, и прошу не кидаться <del>ссаными тряпками</del> в мой код. Я всего лишь учусь

import random    
inventory = {}  
rat = ['left', 'up', 'right']
def sintax_hit_rat(sintax):
     chek_hit = 0
     for i in range(len(rat)): # Проверяем есть ли введенные данные в списке
          if sintax == rat[i]: # Если ввод найден данные уйдут обратно
            chek_hit = chek_hit + 1
          if chek_hit == 0: # Если ввод был некорректные то функция зациклится сама на себя                        #пока не будет корректный ввод
            print('Введены некоректные данные, повторите ввод')
            hit = input()
            sintax_hit_rat(hit)
def fight(pvp): # бой
     life = 6 # жизнь игрока
     def_enemy = 0 # Пункт который будет защищать враг (пока не актуален)
     life_enemy = 3 # жизнь врага
     enemy1 = 'rat' # тип врага
     enemy2 = 'zombi'
     enemy3 = 'skelet'
     if pvp == enemy1: # бой с крысой
        print('Вы вступаете в бой с крысой')
        while life_enemy > 0:
           print('Выбирите куда ударять [left, up, right]')
           hit = input() # ввод игрока
           sintax_hit_rat(hit) # функция проверка синтаксиса удара
           for i in range(len(rat)): # перебираем возможные варианты удара
               if hit == rat[i]:
                  def_enemy = random.randint(1,3) # смотрим куда ударит крыса
                  if i == def_enemy: # проверяем смежность ударов
                     print('Герой получил по шее')
                     life = life - 1 # уменьшаем жизнь игрока если удар пришелся в 1 точку
                  else:
                     print('Герой ударил по крысе')
                     life_enemy = life_enemy - 1 # уменьшаем жизнь крысы если удар пришелся в #разные точки
              if life == 0:
                 print('Вы умерли')
                 pvp = ' ' # без этого обнуления функция выполняется постоянно
                 life_enemy = 0 #цикл идет на жизнь противника, не игрока, поэтому обнуляем #противника
              if life_enemy == 0:
                 print('Вы победили')
                 pvp = ' ' # без этого обнуления функция выполняется постоянно

stroka = 'rat'
fight(stroka)

Добавить комментарий