1 //注释。 ---星辰
2
3 #include 4 #include 5 #include 6 #include 7 #include "conio.h"//非标准输入输出库函数
8
9 using namespace std;
10
11
12 const int UP=72;//上
13 const int DOWN=80;//下
14 const int LEFT=75;//左
15 const int RIGHT=77;//右
16
17 int n=4;//n用来记录蛇身长度,初始为2节
18 int guan;//用来记录关卡
19 int T;//用来给记录蛇的移动速度
20 int t1,t2,t3=0;//用来记录以用时间
21 int HP=5;//记录蛇的生命值,初始化为6
22 int food=0;//用来记录所吃到的食物数
23 int x=12,y=12;//记录食物所在地
24
25 struct snake
26 {
27 int x;//蛇身所在横坐标
28 int y;//蛇身所在纵坐标
29 int direction;//行走方向
30 }p[81];
31
32
33 struct map
34 {
35 int food;//此map[x][y]处是否有食物有的话food为1
36 int star;//此map[x][y]处是否有星星的话值为1
37 int barrier;//此map[x][y]处是否有障碍物有的话值为1
38 }map[26][22];
39
40
41 inline void c(int k)//改变输出字体的颜色
42 {
43 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), k);
44 }
45
46 inline int time()//用来计时
47 {
48 clock_t t=clock()/CLOCKS_PER_SEC;//记录当前程序已用时间
49 return t;
50 }
51
52 inline void gotoxy(int x,int y) //移动坐标
53 {
54 COORD coord;
55 coord.X=x;
56 coord.Y=y;
57 SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), coord );
58 }
59
60 inline int random()//用来输出随机值
61 {
62 srand(t1+rand());//将随机数种子初始化
63 return rand();//返回随机数
64 }
65
66 void ycgb(int);//隐藏光标
67 void start();//绘制启动画面以及隔墙
68 void guanka();//用来选择关卡并根据关卡设置蛇的移动速度
69 void data();//用来记录游戏的各种状态数据
70 int game();//游戏运行
71 void show();//用来随机产生障碍物以及食物和生命药水以及用来判断游戏的各种参数(小星星是否吃到,是否撞墙)
72 void key();//用户是否操作键盘
73 void qp();//清除屏幕
74
75
76 int main()
77 {
78 ycgb(0);//隐藏光标
79 start();//绘制启动画面以及隔墙
80 while(1)
81 {
82 guanka();//用来选择关卡并根据关卡设置蛇的移动速度
83 ycgb(0);//隐藏光标
84 if(!game()) break;//游戏运行
85 }
86 }
87
88 void ycgb(int k)//隐藏光标
89 {
90 HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
91 CONSOLE_CURSOR_INFO cci;
92 GetConsoleCursorInfo(hOut,&cci);
93 cci.bVisible=k;//赋1为显示,赋0为隐藏
94 SetConsoleCursorInfo(hOut,&cci);
95 }
96
97
98 void start()//绘制墙/绘制启动画面以及隔墙
99 {
100 int i,j,z;
101 for(i=0;i25;i++)
102 {
103 cout" ";
104 }
105 c(14);//调成红色
106 for(z=0;z20;z++)
107 {
108 if(z>=0)
109 {
110 gotoxy(12,z);
111 cout" ~--______-~ ~-___-~\" ";
112 }
113 if(z>=1)
114 {
115 gotoxy(12,z-1);
116 cout" ~-_ _-~ ~-_ _-~ ";
117 }
118 if(z>=2)
119 {
120 gotoxy(12,z-2);
121 cout" \\ ~-____-~ _-~ ~-_ ~-_-~ / ";
122 }
123 if(z>=3)
124 {
125 gotoxy(12,z-3);
126 cout" ( ( _-~ _--_ ~-_ _/ | ";
127 }
128 if(z>=4)
129 {
130 gotoxy(12,z-4);
131 cout" / / _-~ ~-_ | | ";
132 }
133 if(z>=5)
134 {
135 gotoxy(12,z-5);
136 cout" / / _----_ \\ \\ ";
137 }
138 if(z>=6)
139 {
140 gotoxy(12,z-6);
141 cout" / / \\ \\ ";
142 }
143 if(z>=7)
144 {
145 gotoxy(12,z-7);
146 cout" / / \\\\ ";
147 }
148 if(z>=8)
149 {
150 gotoxy(12,z-8);
151 cout" / / \\\\ ";
152 }
153 if(z>=9)
154 {
155 gotoxy(12,z-9);
156 cout" / / \\ ";
157 }
158 if(z>=10)
159 {
160 gotoxy(12,z-10);
161 cout" | | \\ ";
162 }
163 if(z>=11)
164 {
165 gotoxy(12,z-11);
166 cout" \\ \\ ";
167 }
168 if(z>=12)
169 {
170 gotoxy(12,z-12);
171 cout" \\_______ \\ ";
172 }
173 if(z>=13)
174 {
175 gotoxy(12,z-13);
176 cout" \\____|__________/ \\ ";
177 }
178 if(z>=14)
179 {
180 gotoxy(12,z-14);
181 cout"\\/ /~ \\_/ \\ ";
182 }
183 if(z>=15)
184 {
185 gotoxy(12,z-15);
186 cout" _|__| O| ";
187 }
188 for(int k=15;k)
189 {
190 gotoxy(12,k-15);
191 cout" ";
192 }
193 Sleep(30);
194 }
195 Sleep(2000);
196 c(0);//调成黑底色
197 gotoxy(0,0);
198 for(i=0;i25;i++)
199 {
200 cout" ";
201 }
202 c(252);//调整输出颜色
203 for(i=0,j=60;i60;i++,j--)//if是为了异步输出
204 {
205 if(j>20)
206 {
207 gotoxy(2*(j-21),0);
208 cout"▉";//输出第一行
209 }
210 if(i40)
211 {
212 gotoxy(2*i,23);
213 cout"▉";// 输出最下面一行
214 }
215 if(j>22&&j45)
216 {
217 gotoxy(78,j-22);
218 cout"▇";//输出最右边列
219 }
220 if(j>22&&j45)
221 {
222 gotoxy(0,i-15);
223 cout"▇";//输出第一列
224 }
225 if(i>37&&i60)
226 {
227 gotoxy(54,i-37);
228 Sleep(10);
229 cout"▇";//输出中间那列
230 }
231 Sleep(30);
232 }
233 gotoxy(56,11);
234 cout"▉▉▉▉▉▉▉▉▉▉▉"; //56
235 gotoxy(19,0);
236 c(14);//调整输出颜色
237 cout"| | |贪 吃 蛇| | |";//输出标题
238
239 gotoxy(56,2);
240 cout"已用时间:";
241 gotoxy(75,2);
242 cout"秒";
243 gotoxy(56,4);
244 cout"生命值:";
245 gotoxy(56,6);
246 cout"当前长度:";
247 gotoxy(56,8);
248 cout"已吃食物:";
249 gotoxy(56,10);
250 cout"第 关";
251 gotoxy(64,12);
252 cout"提示:";
253 gotoxy(56,13);
254 cout"向上:↑ 向上:←";
255 gotoxy(56,14);
256 cout"向下:↓ 向右:→";
257 gotoxy(56,15);
258 cout"暂停/开始:确定键 ";
259 gotoxy(56,16);
260 cout"重新选关 :Esc键";
261 gotoxy(64,18);
262 cout"注意!";
263 gotoxy(56,19);
264 cout"1:撞到障碍物或者墙生命";
265 gotoxy(56,20);
266 cout" 值减一 ";
267 gotoxy(56,21);
268 cout"2:吃到小星星生命值加一";
269 }
270 void guanka()//用来选择关卡并根据关卡设置蛇的移动速度
271 {
272 ycgb(1);//显示光标
273 n=4;//n用来记录蛇身长度,初始为3节
274 HP=6;//记录蛇的生命值,初始化为6
275 p[0].x=6; //
276 p[0].y=10; //
277 p[0].direction=RIGHT; //
278 p[1].x=4; //
279 p[1].y=10; // 初始化蛇所在位置和移动方向
280 p[1].direction=RIGHT; //
281 p[2].x=2; //
282 p[2].y=10; //
283 p[2].direction=RIGHT; //
284 p[3].x=4;////////////////
285 p[3].y=4;///////////////记录蛇尾的信息
286 p[3].direction=RIGHT;////
287 while(1)
288 {
289 gotoxy(15,3);
290 cout"请输入关数(1-6):";
291 cin>>guan;
292 cin.get();
293 if(guan==0) //判断是否作弊
294 {
295 gotoxy(15,3);
296 c(12);//变成红色
297 cout" 作弊有害智商,需谨慎";
298 gotoxy(15,5);
299 c(14);//变成黄色
300 cout"请输入你想要的蛇的生命值:";
301 cin>>HP;
302 cin.get();
303 gotoxy(15,3);
304 cout" ";
305 gotoxy(15,5);
306 cout" ";
307 continue;//返回选关处
308 }
309 if(guan7&&guan>0) break;//判断关数是否溢出
310 gotoxy(15,5);
311 cout"输入错误!";
312 gotoxy(32,3);
313 cout" ";
314
315 }
316 gotoxy(15,3);
317 cout" ";
318 switch (guan)
319 {
320 case 1:{T=600;break;}//
321 case 2:{T=400;break;}//
322 case 3:{T=200;break;}// 根据关数来设定蛇的移动速度
323 case 4:{T=150;break;}//
324 case 5:{T=100;break;}//
325 case 6:{T=60;break;}//
326 }
327 qp();//清除屏幕
328 }
329 void data()//用来记录和判断游戏的各种状态数据
330 {
331 gotoxy(66,2);
332 c(12);//调成红色
333 cout//程序已用时间
334 switch (guan)
335 {
336 case 1:
337 gotoxy(59,10);
338 c(12);//调成红色
339 cout"1";
340 c(14);//调成黄色
341 cout" 2 3 4 5 6";
342 break;
343 case 2:
344 gotoxy(59,10);
345 c(14);//调成黄色
346 cout"1 ";
347 c(12);//调成红色
348 cout"2";
349 c(14);//调成黄色
350 cout" 3 4 5 6 ";
351 break;
352 case 3:
353 gotoxy(59,10);
354 c(14);//调成黄色
355 cout"1 2 ";
356 c(12);//调成红色
357 cout"3";
358 c(14);//调成黄色
359 cout" 4 5 6 ";
360 break;
361 case 4:
362 gotoxy(59,10);
363 c(14);//调成黄色
364 cout"1 2 3 ";
365 c(12);//调成红色
366 cout"4";
367 c(14);//调成黄色
368 cout" 5 6 ";
369 break;
370 case 5:
371 gotoxy(59,10);
372 c(14);//调成黄色
373 cout"1 2 3 4 ";
374 c(12);//调成红色
375 cout"5";
376 c(14);//调成黄色
377 cout" 6 ";
378 break;
379 case 6:
380 gotoxy(59,10);
381 c(14);//调成黄色
382 cout"1 2 3 4 5 ";
383 c(12);//调成红色
384 cout"6";
385 break;
386 }
387 switch (HP)
388 {
389 case 1:
390 gotoxy(65,4);
391 c(10);//调成绿色
392 cout"▁";
393 c(12);//调成红色
394 cout"▂▃▅▆▇";
395 break;
396 case 2:
397 gotoxy(65,4);
398 c(10);//调成绿色
399 cout"▁▂";
400 c(12);//调成红色
401 cout"▃▅▆▇";
402 break;
403 case 3:
404 gotoxy(65,4);
405 c(10);//调成绿色
406 cout"▁▂▃";
407 c(12);//调成红色
408 cout"▅▆▇";
409 break;
410 case 4:
411 gotoxy(65,4);
412 c(10);//调成绿色
413 cout"▁▂▃▅";
414 c(12);//调成红色
415 cout"▆▇";
416 break;
417 case 5:
418 gotoxy(65,4);
419 c(10);//调成绿色
420 cout"▁▂▃▅▆";
421 c(12);//调成红色
422 cout"▇";
423 break;
424 case 6:
425 gotoxy(65,4);
426 c(10);//调成绿色
427 cout"▁▂▃▅▆▇";
428 break;
429 default:
430 gotoxy(65,4);
431 c(10);//调成红色
432 cout"!超级模式 !";
433 break;
434 }
435 gotoxy(66,6);
436 c(12);//调成红色
437 cout1;//输出蛇的当前长度
438 gotoxy(66,8);
439 cout//输出蛇当前已经吃到食物
440 }
441 void qp()//用来清除屏幕
442 {
443 for(int i=1;i23;i++)
444 {
445 gotoxy(2,i);
446 cout" ";
447 }
448 map[x][y].food=0;//将食物清空
449 map[x][y].barrier=0;//将障碍物清除
450 map[x][y].star=0;//将星星清除
451 }
452
453 void show()//用来随机产生障碍物以及食物和生命药水以及用来判断游戏的各种参数
454 {
455 int a,b,e,f; //a,b用来表示小星星的坐标 c,d代表障碍物坐标
456 if(map[x][y].food==0)//判断食物是不是被吃掉
457 {
458 while(1)
459 {
460 x=random()%26;//产生随机横坐标
461 y=random()%22;//产生随机纵坐标
462 if(map[x][y].barrier==0&&map[x][y].star==0) break;//当此处无其他元素是才生效
463 }
464 map[x][y].food=1;//随机出现食物
465 gotoxy(2*(x+1),y+1);//定位到食物出现的位置
466 c(11);//调成黄色
467 cout"●";//打印出食物
468 }
469 if(t1/20>0&&t1%12==0&&t1>t3&&map[(p[0].x-1)/2][p[0].y-1].food==0&&map[(p[0].x-1)/2][p[0].y-1].star==0)
470 {
471 while(1)
472 {
473 e=random()%26;//产生随机横坐标
474 f=random()%22;//产生随机纵坐标
475 if(map[e][f].food==0&&map[e][f].star==0) break;//当此处无其他元素是才生效
476 }
477 gotoxy(2*(e+1),f+1);//定位到障碍物出现的位置
478 map[e][f].barrier=1;//随机出现障碍物
479 c(12);//调成黄色
480 cout"▇";//打印出障碍物
481 t3=t1;//以免产生多个障碍物
482 if(HP7)
483 {
484 gotoxy(18,24);
485 c(15);//调成白色
486 cout"温馨提示:在选关的时候输入0可以开启作弊模式";
487 }
488 }
489 if(t1/25>0&&t1%15==0&&t1>t3&&map[(p[0].x-1)/2][p[0].y-1].food==0&&map[(p[0].x-1)/2][p[0].y-1].barrier==0)//减少星星出现的几率
490 {
491 while(1)
492 {
493 a=random()%26;//产生随机横坐标
494 b=random()%22;//产生随机纵坐标
495 if(map[a][b].barrier==0&&map[a][b].food==0) break;//当此处无其他元素是才生效
496 }
497 map[a][b].star=1;//随机出现小星星(吃到星星长度减1)
498 gotoxy(2*(a+1),b+1);//定位到星星出现的位置(吃到星星长度减1)
499 c(14);//调成黄色
500 cout"☆";//打印出星星(吃到星星长度减1)
501 t3=t1;//以免产生多个障碍物
502 if(HP7)
503 {
504 gotoxy(18,24);
505 cout" ";
506 }
507 }
508 for(int i=0;i)
509 {
510 if(map[(p[i].x-1)/2][p[i].y-1].food==1)//判断蛇是否吃到食物
511 {
512 ++n;//让蛇长度加1
513 food++;//将食物数加1
514 map[(p[i].x-1)/2][p[i].y-1].food=0;//让食物标示归零
515 break;
516 }
517 }
518 if(map[(p[0].x-1)/2][p[0].y-1].star==1)//判断蛇是否吃到星星
519 {
520 map[(p[0].x-1)/2][p[0].y-1].star=0;//让星星标示归零
521&l