Питоните хапят!
- Краен срок:
- 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
- eнергията му се увеличава с
-
__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)
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
..................@@########............
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................