54 : xsize_(horz), ysize_(vert), cells(horz * vert,
CELL_EMPTY)
72 return cells.at(x + xsize_ * y);
78 return cells.at(x + xsize_ * y);
84 return (*
this)(p.first, p.second);
90 return (*
this)(p.first, p.second);
100 template <
class Visitor>
101 void scan(Visitor visitor)
const
103 visitor (0, 0, cells[0]);
104 for (
Index x = 0, i = 1, sz = cells.size(); i < sz; ++i)
108 visitor(1 - xsize_, 1, cells[i]);
113 visitor(1, 0, cells[i]);
119 Index xsize_, ysize_;
120 std::vector<Cell> cells;
192 if (field.
xsize() <= new_head.first || field.
ysize() <= new_head.second)
203 switch (
const Cell next_cell = field[new_head])
213 field[new_head] = CELL_SNAKE;
224 using Positions = std::vector<Position>;
236 for (
Index i = 0; i < snake_len; ++i)
238 const Position block(snake_len - i - 1, 0);
240 field[block] = CELL_SNAKE;
247 return Position(p.first + vx, p.second + vy);