Питоните хапят!

Предадени решения

Краен срок:
15.05.2013 17:00
Точки:
6

Срокът за предаване на решения е отминал

Питоните хапят!

В тази задача ще напишете класове които моделират Питоните и техния свят, както и клас за 2D вектор.

Задачата не изисква да пишете някакъв графичен интерфейс, но ви препоръчвам да си направите! Помага за дебъгването, пък и е забавно!

Насоки

  • Нарочно не съм дефинирал голяма част от детайлите по имплементацията (например какво връща world[3])
  • Със сигурност ще трябва да си напишете допълнителни методи и да си добавите още полета.
  • Класът Cell чупи правилото за Duck Typing, помислете си какви са ползите и недостатъците от това ;-)

Класове

World

class World():
    __init__(self, width):

Клас моделиращ квадратният, двуизмерен питонски свят. Трябва да може да бъде двойно индексиран: >>> world = World(25) >>> world[4][6] <main.Cell object at 0x7f2bd1359f30>

Поведение

  • Първият координат е x, вторият y.
  • Размерът на света е фиксиран.
  • Поддържат се само неотрицателни координати.
  • Отрицателни координати и такива надхвърлящи размера на света хвърлят IndexError

Трябва да поддържа len: >>> len(world) 25

Cell

class Cell(contents):
    contents
    is_empty(self)

Светът на питоните е квадратна матрица от Cell обекти. >>> c = Cell(Food(energy=5)) >>> c.contents at v(0, 0) >>> c.is_empty() False

 >>> c = Cell()
 >>> c.is_empty()
 True

contents може да съдържа само инстанции на WorldObject (или на негови наследници).

WorldObject

няма задължителни методи

Food

наследява WorldObject и има property енергия. class Food(WorldObject): init(self, energy): pass energy = 0

PythonPart

частите на питона. Няма задължителни полета или методи. Наследява WorldObject

PythonHead

главата на питона, наследява PythonPart

Python

това е класът, който моделира питона. Задължителни са:

  • Поле size
  • Константи за посоката като полета на класа: Python.LEFT, Python.UP
  • Константите трябва да са инстанции на клас Vec2D
  • move(direction) -- приема като аргумент една от константите за посока
    • Кара питона да се премести с една клетка в дадената посока.
    • Последната посока трябва да се пази в полето direction
    • Главата на питона трябва да бъде преместена на новата позиция
    • Тялото трябва да бъде преместено, така че да се освободи позицията заемана от последната му част
    • Ако move трябва да премести питона някъде извън света трябва да вдигне изключението Death
    • Ако move трябва да премести питона върху част от друг питон отново се вдига Death
    • Ако move трябва да премести питона върху своя част отново се вдига Death
    • Не може да се пълзи назад. Ако се подаде на move посока обратна на предишната посока трябва да се вдигне ValueError
    • Ако питонът намери инстанция на Food:
      • eнергията му се увеличава с Food.energy
      • пораства с 1 част (не зависи от енергията)
      • порастването става като при движението не се освобождава последната част, както при обикновен move
  • __init__(world, coords, size, direction)
    • world е инстанция на света в който ще живее питона
    • coords са координатите на питона (Vec2D инстанция)
    • size е число, първоначалната дъжина на питона.
    • Ако size е 3, това означава че питонът има глава и 3 части от тялото.
    • direction е вектор, първоначалната посока на питона
    • __init__ поставя питона в инстанцията на света.
      • Главата на питона трябва да е там, където е посочено с coords
      • Останалите части на питона трябва да са подредени в права линия и в посока обратна на direction

      class Python: LEFT = Vec2D(x, y) RIGHT = Vec2D(x, y) UP = Vec2D(x, y) DOWN = Vec2D(x, y) direction energy size init(self, world, coords, size, direction) move(self, direction)

Vec2D

Клас, моделиращ 2D вектор. Задължително е да поддържа:

  • събиране и изваждане с вектор
  • умножение със скалар
  • отрицание ( Vec2D(1, 1) == -Vec2D(-1, -1) )

    class Vec2D: init(self, x, y)

Death

Самата смърт.

class Death(Exception):
    pass

Примери

Една клетка е два символа (напр "..")

>>> w = World(20)
>>> p = Python(w, Vec2D(10, 10), 3, Python.RIGHT)
>>> print(w)
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
..............######@@..................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................

Кльопачка

>>> w = World(20)
>>> py = Python(w, Vec2D(10, 10), 3, Python.LEFT)
>>> f = Food(energy=1)
>>> w[9][10] = Cell(f)

........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
..................:3@@######............
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................

>>> py.move(Python.LEFT)
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
..................@@########............
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................