-
Notifications
You must be signed in to change notification settings - Fork 1
/
贪吃蛇.cpp
189 lines (189 loc) · 3.43 KB
/
贪吃蛇.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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include<conio.h>
#include<time.h>
char x[10][20];
int H[20];
int Z[20];
int h, v;//分别代表横纵坐标
char ch = 'd';
int len = 3;
char f;
void getFood()//食物
{
h = rand() % 10;
v = rand() % 20;
if (x[h][v] == 1)
{
getFood();
}
else
x[h][v] = 3;//心形ASCII码为3
}
void print()
{
for (int i = 0; i <len; i++)//将数组中记录的蛇身坐标全部填充为笑脸,其ASCII码为1;
{
x[H[i]][Z[i]] = 1;
}
for (int i = 0; i < 10; i++)//用遍历的形式绘制
{
for (int j = 0; j < 20; j++)
{
printf("%c", x[i][j]);
}
printf("\n");
}
Sleep(500);//休眠0.5秒 相当于蛇0.5秒动一下
system("cls");//清屏函数。。以便将蛇身重新绘制
}
void getkey()//判断是否按下键盘
{
if (_kbhit())//如果按下键盘,就会执行以下语句
{
ch = _getch();//获取键盘值
if (ch == f)//如果这次按键和现在走的方向一致则为无效按键,重新来获取按下的键盘值
{
getkey();
}
else if ((ch == 100 && f != 97) || ch == 119 && f != 115 || ch == 97 && f != 100 || ch == 115 && f != 119) //即来判断其他无效按键(即朝左走时不能让其朝右走等等)
f = ch;//按键有效时将ch赋值为f
else
getkey();//按键无效时重新捕获键盘
}
}
void left()
{
x[H[0]][Z[0]] = '-';
for (int i = 0; i <len - 1; i++)//蛇身全部前进一格
{
Z[i] = Z[i + 1];
H[i] = H[i + 1];
}
Z[len-1]--;
}
void right()
{
x[H[0]][Z[0]] = '-';
for (int i = 0; i <len - 1; i++)//蛇身全部前进一格
{
Z[i] = Z[i + 1];
H[i] = H[i + 1];
}
Z[len-1]++;
}
void up()
{
x[H[0]][Z[0]] = '-';
for (int i = 0; i <len-1; i++)//蛇身全部前进一格
{
Z[i] = Z[i + 1];
H[i] = H[i + 1];
}
H[len-1]--;
}
void down()
{
x[H[0]][Z[0]] = '-';
for (int i = 0; i <len - 1; i++)//蛇身全部前进一格
{
Z[i] = Z[i + 1];
H[i] = H[i + 1];
}
H[len-1]++;
}
int main()
{
f = ch;//将初始的移动方向赋值给f
for (int i = 0; i < 10; i++) //将字符数组全部以'-'填充,进行初始化
{
for (int j = 0; j < 20; j++)
{
x[i][j] = '-';
}
}
for (int i = 0; i <10; i++)//将储存坐标的数组全部归零
{
Z[i] = 0;
H[i] = 0;
}
for (int i = 0; i <len; i++)//记录前3个蛇身坐标
Z[i] = i;
getFood();
while (len<=19)//设置蛇的最大长度来赢得游戏
{
getkey();
if (x[h][v]!=3)//食物没有了才获取食物
{
getFood();
}
switch (f)
{
case 'w':
if(H[len-1]-1<0)
{
printf("碰到上墙了\n");
return 0;
}
else if (H[len-1]-1==h&&Z[len-1]==v)//判断蛇要走的下个点是否是食物的点
{
H[len]=h;
Z[len]=v;
len++;
break;
}
up();
break;
case 'a':
if(Z[len-1]-1<0)
{
printf("碰到左墙了\n");
return 0;
}
else if (H[len-1]==h&&Z[len-1]-1==v)
{
H[len]=h;
Z[len]=v;
len++;
break;
}
left();
break;
case 's':
if(H[len-1]+1>=10)
{
printf("碰到下墙了\n");
return 0;
}
if (H[len-1]+1==h&&Z[len-1]==v)
{
H[len]=h;
Z[len]=v;
len++;
break;
}
down();
break;
case 'd':
if(Z[len-1]+1>=20)
{
printf("碰到右墙了\n");
return 0;
}
if (H[len-1]==h&&Z[len-1]+1==v)
{
H[len]=h;
Z[len]=v;
len++;
break;
}
right();
break;
}
print();
}
printf("You win!\n");
system("pause");
return 0;
}