-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCSnake.cpp
More file actions
85 lines (70 loc) · 3.28 KB
/
CSnake.cpp
File metadata and controls
85 lines (70 loc) · 3.28 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
/*
* (c) Cranium, aka Череп. 2014
* GNU GPL
*
*/
#include "CSnake.h"
const char SNAKE_TAIL = '@'; // символ для отрисовки сегментов тела змеи, кроме головы
CSnake::CSnake() {
head_mark = '<';
}
void CSnake::reset(SCoord start_pos) {
worm.clear();
worm.reserve(1000); // зарезервировть память
worm.push_back(start_pos); // добавить координаты головы
worm.push_back(start_pos); // добавить координаты хвоста
worm[0].x++; // координата x хвоста - на 1 правее
}
void CSnake::draw(CScreen& scr) {
unsigned int wsize = worm.size() - 1;
for (unsigned int i = 0; i < wsize; i++)
scr.pos(worm[i].x, worm[i].y, SNAKE_TAIL);
scr.pos(worm[wsize].x, worm[wsize].y, head_mark);
drawn = worm.size();
}
void CSnake::move(const SCoord& delta, CScreen& scr) {
// При перемещении змеи перерисовывается только положение головы (и первого сегмента)
// и положение хвоста. Остальные сегменты змеи не перерисовываются.
// Перерисовка хвоста.
// Длина змеи увеличивается, когда змея растёт (метод grow()),
// но змея на экране не изменяется. Поэтому, если отрисованная длина змеи
// совпадает с реальной длиной, то на экране затирается последний сегмент змеи (хвост).
// В противном случае, хвост остаётся на месте, голова сдвигается на единицу,
// а отрисованная длина увеличивается.
if (drawn == worm.size())
scr.pos(worm[0].x, worm[0].y, ' ');
else
drawn++;
// сдвиг координат в векторе без отрисовки
for (unsigned int i = 1; i < worm.size(); i++)
worm[i - 1] = worm[i];
worm[worm.size()-1] += delta; // координата головы изменяется на приращение
// выбор символа для отрисовки головы в зависимости от направления движения
if (delta.x < 0)
head_mark = '<';
else if (delta.x > 0)
head_mark = '>';
else if (delta.y < 0)
head_mark = 'A';
else // (delta.y > 0)
head_mark = 'V';
// Перерисовка головы и первого сегмента змеи.
scr.pos(worm[worm.size() - 1].x, worm[worm.size() - 1].y, head_mark);
scr.pos(worm[worm.size() - 2].x, worm[worm.size() - 2].y, SNAKE_TAIL);
}
void CSnake::grow(const SCoord& pos, int growbits) {
for (int i = 0; i < growbits; ++i)
worm.insert(worm.begin(), pos);
}
bool CSnake::into(const SCoord& pos) {
for (unsigned int i = 0; i < worm.size(); i++)
if (worm[i].x == pos.x && worm[i].y == pos.y)
return true;
return false;
}
SCoord CSnake::head() {
return worm[worm.size() - 1];
}
int CSnake::size() {
return static_cast<int>(worm.size());
}