Добавление боевой системы в текстовую приключенческую игру; смущен структурой кода, который я использую

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

В настоящее время я могу создать врага в каждой комнате и перемещаться между начальной комнатой (коридором) в ванную и обратно, но на данный момент я застрял. Я не могу определить, где я должен создавать своего «героя» или как я буду сообщать об изменениях, которые мне нужно внести в атрибуты здоровья и т. д.

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

Спасибо,

Дэйв

# text based adventure game

import random
import time
from sys import exit

class Game(object):

    def __init__(self, room_map):
        self.room_map = room_map

    def play(self):
        current_room = self.room_map.opening_room()

        while True:
            next_room_name = current_room.enter()
            current_room = self.room_map.next_room(next_room_name)


class Character(object):
    def __init__(self, name, health, attack):
        self.name = name
        self.health = health
        self.attack = attack


class Hero(Character):
    def __init__(self, name):
        super(Hero, self).__init__(name, 10, 2)

    def __str__(self):
        rep = "You, " + self.name + ", have " + str(self.health) + " health and " + \
              str(self.attack) + " attack."

        return rep



class Enemy(Character):

    ENEMIES = ["Troll", "Witch", "Ogre", "Jeremy Corbyn"]

    def __init__(self):
        super(Enemy, self).__init__(random.choice(self.ENEMIES),
                                    random.randint(4, 6), random.randint(2, 4))

    def __str__(self):
        rep = "The " + self.name + " has " + str(self.health) + \
        " health, and " + str(self.attack) + " attack."

        return rep




class Room(object):
    def __init__(self):
        self.commands = ["yes", "no"]
        self.rooms = ["\'corridor\'", "\'bathroom\'", "\'bedroom\'"]
        self.enemy = Enemy()


    def command_list(self):
        print("Commands: ", ", ".join(self.commands))


    def enter_room_question(self):
            print("Which room would you like to enter?")
            print("Rooms:", ", ".join(self.rooms))

    def leave_room_question(self):
        print("Do you want to leave this room?")
        print("Commands:", ", ".join(self.commands))





class Bathroom(Room):
    def enter(self):
        print("You enter the bathroom. But, wait! There is an", \
              self.enemy.name, "!")
        print(self.enemy)

        print("You are in the bathroom. Need to take a dump? ")
        self.command_list()
        response = input("> ")

        while response not in self.commands:
            print("Sorry I didn't recognise that answer")
            print("You are in the bathroom. Need to take a dump?")
            self.command_list()
            response = input("> ")

        if response == "yes":
            print("Not while I'm here!")
            return "death"

        elif response == "no":
            print("Good.")
            self.leave_room_question()
            response = input("> ")

            if response == "yes":
                return "corridor"
            else:
                return "death"



class Bedroom(Room):
    def enter(self):
        pass


class Landing(Room):
    def enter(self):
        pass

class Corridor(Room):
    def enter(self):
        print("You are standing in the corridor. There are two rooms available to enter.")
        self.enter_room_question()
        response = input("> ")
        if response == "corridor":
            print("You're already here silly.")
        else:
            return response


class Death(Room):

    QUIPS = ["Off to the man in sky. You are dead",
             "You died, no-one cried.",
             "Lolz. You're dead!"]
    def enter(self):
        time.sleep(1)
        print(random.choice(Death.QUIPS))
        exit()



class Map(object):

    ROOMS = {"corridor": Corridor(),
             "bathroom": Bathroom(),
             "death": Death(),
             "landing": Landing(),
             "bedroom": Bedroom()}

    def __init__(self, start_room):
        self.start_room = start_room
        self.hero = hero


    def next_room(self, room_name):
        return Map.ROOMS.get(room_name)


    def opening_room(self):
        return self.next_room(self.start_room)

a_hero = Hero("Dave")
a_map = Map("corridor")
a_game = Game(a_map, a_hero)
a_game.play()

person Michael Johnson    schedule 06.12.2015    source источник


Ответы (1)


На вашем месте я бы изложил схему игры. Вы можете узнать, задавая себе такие вопросы:

Какие объекты действительно важны?

В вашем случае, как и вы, я бы рассмотрел Персонажа, Врага, Комнату и Карту, наследуя, когда это будет уместно, например, Персонаж-> Герой и Враг, и несколько типов комнат из Комнаты как Ванная, Коридор, ...

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

Например, вы бы создали массив для группировки всех ваших разных комнат (состояний).

rooms = ["bedroom", "bathroom", "corridor", "kitchen", "living_room"] 

и другие комнаты, о которых вы можете подумать.

(Возможно, есть лучший пример, более эффективный и так далее, так что этот пример поможет вам не сдаваться, когда вы застряли на проблеме.

Согласно этому примеру, если вы используете массив, вы можете присвоить значение каждой комнате (равное каждой позиции в массиве)

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

случайные документы python

ответ на stackoverflow

Наконец, вам также будет полезно сравнить позицию героя, которая ранее имела случайное значение, с каждой позицией вашего массива или комнат.

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

Я надеюсь, что этот ответ будет полезен для вас. Дайте мне знать, если у вас есть какие-либо сомнения относительно моего ответа. Ваше здоровье

person Rafael VC    schedule 06.12.2015
comment
Привет. Спасибо за ответ. Я рассмотрю этот первый шанс, который у меня есть. - person Michael Johnson; 06.12.2015
comment
Привет еще раз. Извините, но я все еще не понимаю. Кажется, я не могу пройти мимо того, как мой герой и враг могут взаимодействовать, когда классы Room используют возвращаемое значение их ввода() для перехода в следующую комнату. Как мне с этим работать? Создавать врагов в каждой комнате, как у меня, это правильно? Если да, то куда мне идти отсюда? Привет, Дэйв - person Michael Johnson; 07.12.2015