-
Notifications
You must be signed in to change notification settings - Fork 1
/
Snake.cpp
128 lines (116 loc) · 2.03 KB
/
Snake.cpp
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include "StdAfx.h"
#include "Snake.h"
Snake::Snake(void)
{
direction = LEFT;
block = false;
}
Snake::Snake(int y)
{
direction = LEFT;
block = false;
this->y = y;
POINT p;
p.x = 999;
p.y = y;
turns.push_back(p);
}
Snake::Snake(int length, int y)
{
POINT p;
p.x = rand() % 300 + 100;
p.y = -(rand() % 300) - 100;
turns.push_back(p);
for(int i = 0; i < length; i++)
{
p.x = p.x - 5;
turns.push_back(p);
}
direction = LEFT;
block = false;
this->y = y;
}
int Snake::GetY()
{
return y;
}
bool Snake::Empty()
{
if(turns.size() == 0) return true;
else return false;
}
void Snake::Draw(HDC hdc)
{
if(turns.size() == 0) return;
SetMapMode(hdc, MM_LOMETRIC);
MoveToEx(hdc, turns[0].x, turns[0].y, NULL);
for(unsigned int i = 1; i < turns.size(); i++) LineTo(hdc, turns[i].x, turns[i].y);
}
bool Snake::Move()
{
if(turns.size() == 0)
{
block = false;
return true;
}
for(unsigned int i = 0 ; i < turns.size()-1; i++)
{
if(turns[i].y - turns[i+1].y <= 5)
{
turns[i].x = turns[i+1].x;
turns[i].y = turns[i+1].y;
}
}
switch(direction)
{
case UP: if(turns[turns.size()-1].y > 0) return false;
turns[turns.size()-1].y += 5;
break;
case RIGHT: if(turns[turns.size()-1].x >= 1000)
{
block = true;
PostMessage(HWND_BROADCAST, GORIGHT, turns[turns.size()-1].y, NULL);
turns.pop_back();
break;
}
turns[turns.size()-1].x += 5;
break;
case DOWN: if(turns[turns.size()-1].y < -1000) return false;
turns[turns.size()-1].y -= 5;
break;
case LEFT: if(turns[turns.size()-1].x < 0) return false;
turns[turns.size()-1].x -= 5;
break;
}
return true;
}
void Snake::Turn(int dir)
{
if(block) return;
switch(dir)
{
case LEFT:
direction = (direction + 3) % 4;
break;
case RIGHT:
direction = (direction+1) % 4;
break;
default:
break;
}
}
void Snake::Add(int y)
{
POINT p;
it = turns.begin();
p.x = 999;
p.y = y;
turns.insert(it, p);
}
void Snake::SetDirection(int dir)
{
if(turns.size() == 1) direction = dir;
}
Snake::~Snake(void)
{
}