Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 23, 2014 09:07:44

Mixeyka
Зарегистрирован: 2014-09-19
Сообщения: 32
Репутация: +  1  -
Профиль   Отправить e-mail  

Требуется оценка специалиста (может занять некоторое время).

Добрался до ООП. Вроде разобрался, и попробовал написать какой то код, чтобы попрактиковаться. Но как правило, первый блин комом, поэтому прошу соображающих в этом деле людей, указать на ошибки.

ПС: на английский переводить на стал, поэтому если русский текст ломает глаза, не читайте - я предупредил.


# Программа "Ходилка"
# С намёком на игру
# Смысл программы в том, что бы перемещать некий объект по карте
# и закрепить на практике теорию объектно ориентированного программирования.
# Питон 3.4
# Кодировка UTF-8
 
 
class Клетка(object):
    """Свойства и состояния клетки карты"""
  
    клетка = []
    дерево = "Х"
    пусто = " "
 
 
class Генератор2дМассива(object):
    """Генерирует двумерный массив из заданных параметров."""
 
    def генерация_массива(собств, вертикаль, горизонталь):
 
        массив = []
        for координата_У in range(вертикаль):
            массив.append([])
            for координата_Х in range(горизонталь):
                массив[координата_У].append([])
        # Возвращаем созданный массив:
        return массив
 
 
class ИгровойЭкран(Клетка, Генератор2дМассива):
    """Отображает на экране видимую область"""
 
    def __init__(собств, горизонталь=3, вертикаль=3):
        """
        Инициализирует игровой экран (зону видимости персонажа)
        :param горизонталь: задаёт размер экрана, по ширине,
        :param вертикаль: задаёт размер экрана, по высоте,
        :return:возвращает двумерный массив экрана
        """
 
        собств.экран = собств.создание_изображения_экрана(вертикаль, горизонталь)
        собств.ширина = горизонталь
        собств.высота = вертикаль
        собств.коорд_У = 1
        собств.коорд_Х = 1
        собств.выход = ""
 
    def перемещение_по_карте(собств, локация):
        """ Перемещает экран по карте локации. """
        # Начинаем цикл с запросом на перемещение.
        print(локация.высота)
        while собств.выход != "выход":
            print("координаты камеры : У =", собств.коорд_У, "Х =", собств.коорд_Х)
            # Осуществляем срез с карты локации для проецирования на экран.
            for ц in range(собств.высота):
                собств.экран[ц] = локация.карта[собств.коорд_У + ц]\
                    [собств.коорд_Х: собств.коорд_Х + собств.ширина]
            # Выводим изображение на экран и запрашиваем у пользователя направление движения.
            собств.изображение()
            направление = собств.запрос_направления()
            собств.изменение_координат(локация, направление)
 
    def изменение_координат(собств, локация, направление):
        "Изменяет координаты экрана (перемещает по карте)."
        print(локация.высота)
 
        # Перемещаем камеру.
        if направление == "север":
            собств.коорд_У -= 1
        elif направление == "юг":
            собств.коорд_У += 1
        elif направление == "восток":
            собств.коорд_Х -= 1
        elif направление == "запад":
            собств.коорд_Х += 1
        elif направление == "выход":
            собств.выход = направление
            return собств.выход  # выход из программы.
        else:
            print("Фраза", направление, "- не является возможным направлением.")
        # Проверяем координаты экрана на достижение границ карты.
        if собств.коорд_У < 0:
            собств.коорд_У = 0
        elif собств.коорд_Х < 0:
            собств.коорд_Х = 0
        elif собств.коорд_У >= локация.высота - собств.высота:
            собств.коорд_У = локация.высота - собств.высота
        elif собств.коорд_Х >= локация.ширина - собств.ширина:
            собств.коорд_Х = локация.ширина - собств.ширина
 
        # Возвращаем координаты камеры.
        return собств.коорд_Х, собств.коорд_У
 
    def запрос_направления(собств):
        """Запрашивает у пользователя направление движения."""
        НАПРАВЛЕНИЕ = ["север", "юг", "запад", "восток", "выход"]
        направление = ""
        while направление not in НАПРАВЛЕНИЕ:
            направление = input(
                "Напишите, куда желаете направиться: север, юг, запад или восток? ").lower()
            if направление not in НАПРАВЛЕНИЕ:
                print("Неверная команда, попробуйте ещё раз.")
        return направление
 
    def изображение(собств):
        print(собств.экран[0][0], "|", собств.экран[1][0], "|", собств.экран[2][0])
        print("--------------")
        print(собств.экран[0][1], "|", собств.экран[1][1], "|", собств.экран[2][1])
        print("--------------")
        print(собств.экран[0][2], "|", собств.экран[1][2], "|", собств.экран[2][2])
 
    def создание_изображения_экрана(собств, вертикаль=3, горизонталь=3):
        экран = собств.генерация_массива(вертикаль, горизонталь)
        return экран
 
 
class КартаЛокации(Клетка, Генератор2дМассива):
    """Пространство, по которому перемещается герой"""
 
    def __init__(собств, горизонталь=10, вертикаль=10):
        """Создаёт карту локации и расставляет на ней деревья."""
        собств.карта = собств.генерация_карты(вертикаль, горизонталь)
        собств.высота = вертикаль
        собств.ширина = горизонталь
 
    # Эта программа герерирует двумерный массив карты и объекты на ней.
    def генерация_карты(собств, вертикаль=10, горизонталь=10):
        """ Генерирует карту, и расставляет на ней деревья."""
        import random
 
        карта = собств.генерация_массива(вертикаль, горизонталь)
        # Расставляем обозначения на карту.
        for у in range(вертикаль):
            for х in range(горизонталь):
                выбор_объекта = random.randint(0, 3)
                if выбор_объекта <= 1:
                    карта[у][х].append(собств.пусто)
                else:
                    карта[у][х].append(собств.дерево)
        return карта
 
 
локация1 = КартаЛокации()
экран = ИгровойЭкран()
экран.перемещение_по_карте(локация1)
 

Отредактировано Mixeyka (Окт. 23, 2014 09:11:24)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version