Pull to refresh

Мини текстовая игра на Python (RPG)

Level of difficultyEasy
Reading time14 min
Views1.7K

Ходил бродил по просторам интернета и случайно наткнулся на статью о создании мини rpg игры текстового типа на python. И так как я очень люблю всяческие Hello world-ы, то не смог пройти мимо.

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

Получилось у меня что-то типа этого:

https://gist.github.com/basimka/2a54ae0b256ecf057e2ebc839c718a66

Конечно же этого было мало и я начал писать дальше. В результате

  • Теперь у меня есть несколько комнат

  • По комнатам можно передвигаться

  • Можно взаимодействовать с предметами (поднимать, надевать)

  • Можно нападать на монстров и драться с ними

  • В планах прикрутить взлом замков... и прочие плюшки

Ссылка на Git проекта

Но статья моя будет конечно же сосредоточена на том что бы описать весь тот ужос который я напрограммировал и подтолкнуло меня к этому два факта:

  • Факт 1. В интернете не так много уроков или примеров текстовых игр на python. В основном всё концентрируется на игровом движке, картинках и конечном результате. В текстовой игре ты заморачиваешься над логикой игры, над механиками. Ни что не стоит потратить пару часов и накидать на python прототип какой либо игры. Ну а что может помешать потом прикрутить графику?...

  • Факт 2. Это статья как раз сможет показать мне интерес к данной теме. У одного меня и пары моих друзей(всего у одного) так горят руки сделать что нибудь этакое не прибегая к дизайну и художеству, а реализуя логику игры с помощью текста, спецсимволов, ну и естественно.

Собственно Игра

Начинается всё с того что мы добавляем в игру библиотеку randomizer и будущую библиотеку с картинками:

                                    # Для начала импортируем рандомайзер
from random import randint

# Добавляем библиотеку с картинками
from pictures import pic_Start

Создаём в этой же директории файл с именем pictures.py и создаём в нем функцию с нашим лого:

def pic_Start():
    print('''
############################################################################################
############################################################################################
#   ##    ##   ######   ##    ##        ##    ##  ########  ########  ##        ######     #
#   ###  ###   ##  ##    ##  ##         ## ## ##  ##    ##  ##    ##  ##        ##    ##   #
#   ## ## ##  ########   ##  ##         ###  ###  ##    ##  ######    ##        ##    ##   #
#   ##    ##  ##    ##  ##    ##        ##    ##  ########  ##    ##  ########  ######     #
############################################################################################
############################################################################################          

'''
    )

Теперь если мы где-то вызовем pic_Start() то вызовем печать нашего лого.

Вернёмся к нашему основному файлу. Реализация состояния "в битве" не "в битве" я решил реализовать с помощью глобальной переменной agressive, если agressive > 0 значит на вас кто-то напал, если нет то всё ОК :

#Объявление глобальной переменной агрессия
#Если агрессия есть то значит и по шапке получить можно
global agressive
agressive = 0

Далее мы выводим наш logo и описываем Class Player

###Приветственный экран
pic_Start()
# Это класс Персонажа, так как версия игры сейчас однопользовательская
# то экземпляр класса Игрока только один
class Player:
    inventar = []
    inventar_str = []
    def __init__(self, hp, damage, mana, haco):
        self.hp = hp
        self.damage = damage
        self.mana = mana
        self.haco = haco
    lvl = 1   
    exp = 0
    if exp >= 256000:
        lvl = 10
    elif exp >= 128000:
        lvl = 9
    elif exp >= 64000:
        lvl = 8
    elif exp >= 32000:
        lvl = 7
    elif exp >= 16000:
        lvl = 6
    elif exp >= 8000:
        lvl = 5
    elif exp >= 4000:
        lvl = 4
    elif exp >= 2000:
        lvl = 3
    elif exp >= 1000:
        lvl = 2
    def __str__(self):
        pass

#Так как экземпляр класса Игрока у нас должен быть доступен отовсюду,
# то для начала мы делаем его глобальным, а потом уже создаем сам
# экземпляр класса
global p

p = Player(100,10,0,20)

Class Player создаёт класс у которого есть inventar = [] - сюда помещаются всяческие мечи доспехи, которые игрок надел. И так как мне не удалось нормально выводить названия этих предметов то их названия хранятся в отдельном списке inventar_str = []. Через def _init_ задаём разные параметры персонажа, а с помощью p = Player(100,10,0,20), создаём экземпляр класс Player с параметрами hp = 100, damage = 10, mana = 0, haco = 20.

Класс противника делаем по тому же образу и подобию

#Экземпляр класса противника, во многом схож с игроком, но экземпляров класса будет куча
class Enemy:
    def __init__(self,name,hp,damage,mana,haco,exp):
        self.hp = hp
        self.damage = damage
        self.mana = mana
        self.name = name
        self.haco = haco
        self.exp = exp
    def __str__(self):
        return str(self.name)

e = Enemy('мышь',80,10,0,20,10)
Rabbit = Enemy('кролик',100,15,0,20,20)

Так же реализуем класс оружия:

############################## Оружие ###########################
class Weapon:
    def __init__(self,name,damage,stability):
        self.name = name
        self.damage = damage
        self.stability = stability

    def __str__(self):
        return str(self.name)

woodstick = Weapon('Палка',10,5)
clows = Weapon('Когти',20,20)
knife = Weapon('Нож',20,10)
sword = Weapon('Меч',25,15)
staff = Weapon('Посох',15,15)

Ну а дальше становится всё интереснее и интереснее, так как в любой RPG необходимо передвигаться по пещерам и полям, то мы вводим в игру такое понятие как комната(Room) и собственно описываем класс комната:

####################### Комнаты ##################################
class Room:
    name = 'Комната'
    vihody = ['ю','з']
    orujie = sword
    vragy = e
    opisanie =('\n' + '\
###################\n' + f'\
Вы попали в {name}\n'+'\
###################\n'+'\
Выходы есть только:\n'+ f'\
{vihody}\n')

r0 = Room()

У комнаты есть название - name. В комнате могут быть выходы - vihody, оружие может валяться на полу - orujie и собственно в комнате могут находится враги - vragy.

Описание комнаты у нас выполнен с применением спецсимволов \n - переход на другую строчку f - позволяет использовать в тексте ссылки на переменные {name} и \ - перенос кода на новую строчку. В конце мы конечно же вызываем экземпляр класса.

Инвентарь мы тоже реализовали с помощью класса, в принципе здесь нет ни чего интересного разве что кроме things = [] и str_things = []. Как и в прошлом примере в things мы помещаем класс предмета а в str_things его название.

# Инвентарь. Было принято решение вынести инвентарь в отдельный класс.
class inventar():
    golds = 0
    things = []
    str_things = []
    potions = []
    scrolls = []
    limit = 10

inv = inventar() 

Играя в игру мы будем вызывать разного рода информативные меню (посмотреть, инвентарь, помощь и т.д.). Эти меню должны отображать информацию о вещах и параметрах за которые отвечают:

######################### Меню Посмотреть###########################
def do_look():
    print(maplocation.opisanie)
    if maplocation.orujie != 0:
        print (f'Валяется {maplocation.orujie}')
    if maplocation.vragy != 0:
        print (f'В углу скалится {maplocation.vragy}')

######################### меню Инвентарь ###########################
def menu_inventory():
    print ('Ваше золото = ' , inv.golds)
    print ('Ваши вещи = ' , inv.str_things)
    print ('Ваши свитки = ' , inv.scrolls)
    print ('Ваши бутылочки = ' , inv.potions)
    print ('Свобдных слотов =' , inv.limit)
    input("Нажмите Enter для продолжения.")

########################## Меню статистика #########################
def menu_stats():
    print('Статистика игрок')
    print('****************')
    print (f'hp = {p.hp}')
    print (f'damage = {p.damage}')
    print (f'mana = {p.mana}')
    print (f'exp = {p.exp}')
    print (f'На вас надеты = {p.inventar_str}')
    input("Нажмите Enter для продолжения.")

########################## Меню Битва #########################
### Пока не задействовано
def menu_prefight():
    print (f'''
(1) Сражаться
(2) Посмотреть статистику           
(3) Вызвать меню помощи
(4) Выход из игры
''')
    
########################## Основное меню #########################
def start_menu():
    print (f'''
Введите и нажмите  Enter
см (смотреть) - Осмотреться
хр (характеристики) - Характеристики
инв (инвентарь) - Инвентарь           
? (Помощь) - Вызвать меню помощи
выход (прочь) - Выход из игры
взять - Поднять или взять что есть в комнате
надеть - Надеть что-то из инвентаря
напасть - Напасть на кого нибудь
''')
    
############################ Меню Помощи #########################
def menu_help():
    print('####################################')
    print('Помочь ты сможешь только себе сам!!!')
    print('####################################')

Вызывая ту или иную функцию мы будем видеть необходимую информацию, например если мы вызовем:

start_menu()

то мы увидим:

Из неизвестного у нас здесь появляется переменная maplocation

Далее станет известно что в зависимости от комнаты в которой мы находимся maplocation принимает значение этой комнаты, например:

maplocation = r0

И если мы сменим комнату то и значение maplocation тоже поменяется.

И так, продолжим. Далее у нас следует гигантский блок под названием "Действие"

############## Основная функция действия #########################
def deystvie(n):  
    global x
    global maplocation
    if n == 'см':
        do_look()
    elif n == 'смотреть':
        do_look()
    elif n == 'хр':
        menu_stats()
    elif n == 'характеристики':
        menu_stats()
    elif n == 'инв':
        menu_inventory()
    elif n == 'инвентарь':
        menu_inventory()
    elif n == '?':
        start_menu()
    elif n == 'помощь':
        start_menu()
    elif n == 'выход':
        quit()
    elif n == 'прочь':
        quit()
    elif n == 'надеть':
        print ('Что вы хотите надеть?')
        print (inv.str_things)
        fg = input('Введите название предмета: ')
        i = 0
        while i < len(inv.things):
            if str(fg) == str(inv.things[i]):
                print (f'Вы надели {inv.things[i]}')
                p.inventar.append(inv.things[i]) 
                p.inventar_str.append(str(inv.things[i]))
                p.damage = p.damage + inv.things[i].damage
                del inv.things[i]
                del inv.str_things[i]
            i+=1

    elif n == 'напасть':
        if maplocation.vragy != 0:
            print ('На кого вы хотите напасть? \n')
            print (maplocation.vragy)
            fg = input('Введите название врага: ')
            if str(fg) == str(maplocation.vragy):
                print (f'Вы напали на {maplocation.vragy}')
                global agressive
                agressive = agressive + 1               
                fight()

    elif n == 'ю':
        if maplocation.name == 'Комната':
            print('\n Вы перешли на юг')
            maplocation = r3
        elif maplocation.name == 'Комната1':
            print('\n Тут стена, идти не куда')
        elif maplocation.name == 'Комната3':
            print('\n Тут стена, идти не куда')
    elif n == 'з':
        if maplocation.name == 'Комната':
            print('\n Вы перешли на запад')
            maplocation = r1
        elif maplocation.name == 'Комната1':
            print('\n Тут стена, идти не куда')
        elif maplocation.name == 'Комната3':
            print('\n Тут стена, идти не куда')
    elif n == 'в':
        if maplocation.name == 'Комната':
            print('\n Тут стена, идти не куда')
        elif maplocation.name == 'Комната1':
            print('\n Вы перешли на восток')
            maplocation = r0
        elif maplocation.name == 'Комната3':
            print('\n Тут стена, идти не куда')
            
    elif n == 'с':
        if maplocation.name == 'Комната':
            print('\n Тут стена, идти не куда')
        elif maplocation.name == 'Комната1':
            print('\n Тут стена, идти не куда')
        elif maplocation.name == 'Комната3':
            print('\n Вы перешли на север')
            maplocation = r0
    elif n == 'взять':
        if maplocation.orujie != 0:
            print ('\n Что вы хотите взять? \n')
            print (maplocation.orujie)
            vz = input('Введите название предмета: ')
            if str(vz) == str(maplocation.orujie):
                print (f'Вы взяли {maplocation.orujie}')
                inv.things.append(maplocation.orujie)
                inv.str_things.append(str(maplocation.orujie))
                maplocation.orujie = 0
    else:
        print ('Ни чего не произошло')

В функцию действие мы передаём значение n, ну а n у нас равно тому что пользователь введёт в строчку ввода. Если мы введём "см" или "смотреть" то запустим функцию do_look(), если введём хр или характеристики то запустим функцию menu_stats(). Если же ввод не будет удовлетворять ни одному условию то else нам выдаст "Ни чего не произошло".

Из наиболее интересных вещей у нас здесь есть "надеть", "напасть","взять". Попробуйте самостоятельно разобраться как они работают.

def fight():
    global agressive
    while agressive != 0:
        print('Вы hp:',p.hp)
        print('Вы damage: ',p.damage)
        print("**********************")
        print('Враг hp:',e.hp)
        print('Враг damage: ',e.damage)
        print("**********************")
        print("**********************")
        print("1)Ударить")
        print("2)Хил 0-5")
        n = input("Введите число: ")
        if n == '1':
            # Здоровье врага отнимает от вашего дамага.
            e.hp -= p.damage
            print('Вы ударили противника, у него осталось', e.hp)
            # Здоровье игрока отнимает от дамага врага.
            p.hp -= e.damage
            print('Противник ударил вас, у вас осталось',p.hp)
            print("*********************")
            if p.hp < 0:
                print("Вы проиграли")
                agressive = agressive - 1
                quit()
            elif e.hp < 0:
                print("Вы победили")
                agressive = agressive - 1
                p.exp = p.exp + maplocation.vragy.exp
                maplocation.vragy = 0

        elif n == '2':
            # Рандомно от 0 до 5 добавляет хп.
            p.hp += randint(0,5)
            # Если здоровье игрока больше, то хп игрока будет равна 100.
            if p.hp > 100:
                p.hp = 100

            #print('Ваши хп',p.hp)
        else:
             print("Чего ждем?")

И так, функция битвы, собственно для чего всё и задумывалось. Правда битва пока получилась не очень заурядная, при каждом раунде мы выбираем что делать, ударить или "отхилится", если выбираем ударить, то обмениваемся с врагом ударами, если у кого-то здоровье меньше ноля, то тот проиграл.

Остается дело за малым, выводим справку:

start_menu()

Объявляем и обнуляем агрессию, и запускаем основной цикл игры.

global maplocation
maplocation = r0

global agressiv
agressiv = False

############################## Основной игровой цикл  ###########################
while True:
    # Предлагаем выбрать действие
    n = input('Введите что нибудь: ')
    # Обрабатываем выбранное действие
    deystvie(n)
    # Проверяем не напал ли на нас кто-то
    # Пока не работает
    proverka_enimy()

Весь код игры ниже:

# Для начала импортируем рандомайзер
from random import randint

# Добавляем библиотеку с картинками
from pictures import pic_Start

#Объявление глобальной переменной агрессия
#Если агрессия есть то значит и по шапке получить можно
global agressive
agressive = 0

###Приветственный экран
pic_Start()
# Это класс Персонажа, так как версия игры сейчас однопользовательская
# то экземпляр класса Игрока только один
class Player:
    inventar = []
    inventar_str = []
    def __init__(self, hp, damage, mana, haco):
        self.hp = hp
        self.damage = damage
        self.mana = mana
        self.haco = haco
    lvl = 1   
    exp = 0
    if exp >= 256000:
        lvl = 10
    elif exp >= 128000:
        lvl = 9
    elif exp >= 64000:
        lvl = 8
    elif exp >= 32000:
        lvl = 7
    elif exp >= 16000:
        lvl = 6
    elif exp >= 8000:
        lvl = 5
    elif exp >= 4000:
        lvl = 4
    elif exp >= 2000:
        lvl = 3
    elif exp >= 1000:
        lvl = 2
    def __str__(self):
        pass

#Так как экземпляр класса Игрока у нас должен быть доступен отовсюду,
# то для начала мы делаем его глобальным, а потом уже создаем сам
# экземпляр класса
global p

p = Player(100,10,0,20)

#Экземпляр класса противника, во многом схож с игроком, но экземпляров класса будет куча
class Enemy:
    def __init__(self,name,hp,damage,mana,haco,exp):
        self.hp = hp
        self.damage = damage
        self.mana = mana
        self.name = name
        self.haco = haco
        self.exp = exp
    def __str__(self):
        return str(self.name)

e = Enemy('мышь',80,10,0,20,10)
Rabbit = Enemy('кролик',100,15,0,20,20)

############################## Оружие ###########################
class Weapon:
    def __init__(self,name,damage,stability):
        self.name = name
        self.damage = damage
        self.stability = stability

    def __str__(self):
        return str(self.name)

woodstick = Weapon('Палка',10,5)
clows = Weapon('Когти',20,20)
knife = Weapon('Нож',20,10)
sword = Weapon('Меч',25,15)
staff = Weapon('Посох',15,15)

####################### ЗамкИ ####################################



####################### Комнаты ##################################
class Room:
    name = 'Комната'
    vihody = ['ю','з']
    orujie = sword
    vragy = e
    opisanie =('\n' + '\
###################\n' + f'\
Вы попали в {name}\n'+'\
###################\n'+'\
Выходы есть только:\n'+ f'\
{vihody}\n')
    
class Room1:
    name = 'Комната1'
    vihody = ['в']
    orujie = knife
    vragy = 0
    opisanie =('\n' + '\
###################\n' + f'\
Вы попали в {name}\n'+'\
###################\n'+'\
Выходы есть только:\n'+f'\
{vihody}\n')

class Room2:
    name = 'Комната2'
    vihody = ['в','ю','']
    orujie = sword
    vragy = 0
    opisanie =('###################\n' + f'\
Вы попали в {name}\n'+'\
###################\n'+'\
Здесь ни чего нет\n'+'\
###################\n'+'\
Выходы есть только:\n'+f'\
{vihody}\n')

class Room3:
    name = 'Комната3'
    vihody = ['с',]
    orujie = staff
    vragy = 0
    opisanie =('\n' + '\
###################\n' + f'\
Вы попали в {name}\n'+'\
###################\n'+'\
Выходы есть только:\n'+f'\
{vihody}\n')

class Room4:
    name = 'Комната4'
    vihody = ['в','ю','с','з']
    orujie = sword
    vragy = []
    opisanie =('###################\n' + f'\
Вы попали в {name}\n'+'\
###################\n'+'\
Здесь ни чего нет\n'+'\
###################\n'+'\
Выходы есть только:\n'+f'\
{vihody}\n')
    
class Room5:
    name = 'Комната5'
    vihody = ['в','ю']
    orujie = sword
    vragy = []
    opisanie =('###################\n' + f'\
Вы попали в {name}\n'+'\
###################\n'+'\
Здесь ни чего нет\n'+'\
###################\n'+'\
Выходы есть только:\n'+f'\
{vihody}\n')
    
class Room6:
    name = 'Комната6'
    vihody = ['с','з']
    orujie = sword
    vragy = []
    opisanie =('###################\n' + f'\
Вы попали в {name}\n'+'\
###################\n'+'\
Здесь ни чего нет\n'+'\
###################\n'+'\
Выходы есть только:\n'+f'\
{vihody}\n')
    
class Room7:
    name = 'Комната7'
    vihody = ['в','з','с']
    orujie = sword
    vragy = []
    opisanie =('###################\n' + f'\
Вы попали в {name}\n'+'\
###################\n'+'\
Здесь ни чего нет\n'+'\
###################\n'+'\
Выходы есть только:\n'+f'\
{vihody}\n')
    
class Room8:
    name = 'Комната8'
    vihody = ['в','с']
    orujie = sword
    vragy = []
    opisanie =('###################\n' + f'\
Вы попали в {name}\n'+'\
###################\n'+'\
Здесь ни чего нет\n'+'\
###################\n'+'\
Выходы есть только:\n'+f'\
{vihody}\n')

r0 = Room()
r1 = Room1()
r2 = Room2()
r3 = Room3()
r4 = Room4()
r5 = Room5()
r6 = Room6()
r7 = Room7()

# Инвентарь. Было принято решение вынести инвентарь в отдельный класс.
class inventar():
    golds = 0
    things = []
    str_things = []
    potions = []
    scrolls = []
    limit = 10

inv = inventar()    

######################### Меню Посмотреть###########################
def do_look():
    print(maplocation.opisanie)
    if maplocation.orujie != 0:
        print (f'Валяется {maplocation.orujie}')
    if maplocation.vragy != 0:
        print (f'В углу скалится {maplocation.vragy}')

######################### меню Инвентарь ###########################
def menu_inventory():
    print ('Ваше золото = ' , inv.golds)
    print ('Ваши вещи = ' , inv.str_things)
    print ('Ваши свитки = ' , inv.scrolls)
    print ('Ваши бутылочки = ' , inv.potions)
    print ('Свобдных слотов =' , inv.limit)
    input("Нажмите Enter для продолжения.")

########################## Меню статистика #########################
def menu_stats():
    print('Статистика игрок')
    print('****************')
    print (f'hp = {p.hp}')
    print (f'damage = {p.damage}')
    print (f'mana = {p.mana}')
    print (f'exp = {p.exp}')
    print (f'На вас надеты = {p.inventar_str}')
    input("Нажмите Enter для продолжения.")

########################## Меню Битва #########################
### Пока не задействовано
def menu_prefight():
    print (f'''
(1) Сражаться
(2) Посмотреть статистику           
(3) Вызвать меню помощи
(4) Выход из игры
''')
    
########################## Основное меню #########################
def start_menu():
    print (f'''
Введите и нажмите  Enter
см (смотреть) - Осмотреться
хр (характеристики) - Характеристики
инв (инвентарь) - Инвентарь           
? (Помощь) - Вызвать меню помощи
выход (прочь) - Выход из игры
взять - Поднять или взять что есть в комнате
надеть - Надеть что-то из инвентаря
напасть - Напасть на кого нибудь
''')
    
############################ Меню Помощи #########################
def menu_help():
    print('####################################')
    print('Помочь ты сможешь только себе сам!!!')
    print('####################################')

############## Основная функция действия #########################
def deystvie(n):  
    global x
    global maplocation
    if n == 'см':
        do_look()
    elif n == 'смотреть':
        do_look()
    elif n == 'хр':
        menu_stats()
    elif n == 'характеристики':
        menu_stats()
    elif n == 'инв':
        menu_inventory()
    elif n == 'инвентарь':
        menu_inventory()
    elif n == '?':
        start_menu()
    elif n == 'помощь':
        start_menu()
    elif n == 'выход':
        quit()
    elif n == 'прочь':
        quit()
    elif n == 'надеть':
        print ('Что вы хотите надеть?')
        print (inv.str_things)
        fg = input('Введите название предмета: ')
        i = 0
        while i < len(inv.things):
            if str(fg) == str(inv.things[i]):
                print (f'Вы надели {inv.things[i]}')
                p.inventar.append(inv.things[i]) 
                p.inventar_str.append(str(inv.things[i]))
                p.damage = p.damage + inv.things[i].damage
                del inv.things[i]
                del inv.str_things[i]
            i+=1

    elif n == 'напасть':
        if maplocation.vragy != 0:
            print ('На кого вы хотите напасть? \n')
            print (maplocation.vragy)
            fg = input('Введите название врага: ')
            if str(fg) == str(maplocation.vragy):
                print (f'Вы напали на {maplocation.vragy}')
                global agressive
                agressive = agressive + 1               
                fight()

    elif n == 'ю':
        if maplocation.name == 'Комната':
            print('\n Вы перешли на юг')
            maplocation = r3
        elif maplocation.name == 'Комната1':
            print('\n Тут стена, идти не куда')
        elif maplocation.name == 'Комната3':
            print('\n Тут стена, идти не куда')
    elif n == 'з':
        if maplocation.name == 'Комната':
            print('\n Вы перешли на запад')
            maplocation = r1
        elif maplocation.name == 'Комната1':
            print('\n Тут стена, идти не куда')
        elif maplocation.name == 'Комната3':
            print('\n Тут стена, идти не куда')
    elif n == 'в':
        if maplocation.name == 'Комната':
            print('\n Тут стена, идти не куда')
        elif maplocation.name == 'Комната1':
            print('\n Вы перешли на восток')
            maplocation = r0
        elif maplocation.name == 'Комната3':
            print('\n Тут стена, идти не куда')
            
    elif n == 'с':
        if maplocation.name == 'Комната':
            print('\n Тут стена, идти не куда')
        elif maplocation.name == 'Комната1':
            print('\n Тут стена, идти не куда')
        elif maplocation.name == 'Комната3':
            print('\n Вы перешли на север')
            maplocation = r0
    elif n == 'взять':
        if maplocation.orujie != 0:
            print ('\n Что вы хотите взять? \n')
            print (maplocation.orujie)
            vz = input('Введите название предмета: ')
            if str(vz) == str(maplocation.orujie):
                print (f'Вы взяли {maplocation.orujie}')
                inv.things.append(maplocation.orujie)
                inv.str_things.append(str(maplocation.orujie))
                maplocation.orujie = 0
    else:
        print ('Ни чего не произошло')

def proverka_enimy():
    pass

def fight():
    global agressive
    while agressive != 0:
        print('Вы hp:',p.hp)
        print('Вы damage: ',p.damage)
        print("**********************")
        print('Враг hp:',e.hp)
        print('Враг damage: ',e.damage)
        print("**********************")
        print("**********************")
        print("1)Ударить")
        print("2)Хил 0-5")
        n = input("Введите число: ")
        if n == '1':
            # Здоровье врага отнимает от вашего дамага.
            e.hp -= p.damage
            print('Вы ударили противника, у него осталось', e.hp)
            # Здоровье игрока отнимает от дамага врага.
            p.hp -= e.damage
            print('Противник ударил вас, у вас осталось',p.hp)
            print("*********************")
            if p.hp < 0:
                print("Вы проиграли")
                agressive = agressive - 1
                quit()
            elif e.hp < 0:
                print("Вы победили")
                agressive = agressive - 1
                p.exp = p.exp + maplocation.vragy.exp
                maplocation.vragy = 0

        elif n == '2':
            # Рандомно от 0 до 5 добавляет хп.
            p.hp += randint(0,5)
            # Если здоровье игрока больше, то хп игрока будет равна 100.
            if p.hp > 100:
                p.hp = 100

            #print('Ваши хп',p.hp)
        else:
             print("Чего ждем?")
        
### Основноe меню
start_menu()

############################## Глобальные переменные ###########################
#global x
#x = 1
global maplocation
maplocation = r0

global agressiv
agressiv = False

############################## Основной игровой цикл  ###########################
while True:
    # Предлагаем выбрать действие
    n = input('Введите что нибудь: ')
    # Обрабатываем выбранное действие
    deystvie(n)
    # Проверяем не напал ли на нас кто-то
    # Пока не работает
    proverka_enimy()

Игра постоянно дорабатывается и по ссылкам в Git будет обновляться. Надеюсь данная статься поможет кому нибудь воплотить свои задумки в жизнь.

Tags:
Hubs:
+5
Comments10

Articles