1 #include<stdio.h>
2 #include<windows.h>
3 #include<time.h>
4 #include<conio.h>
5 #include<stdlib.h>
6 #include <iostream>
7 #include <cmath>
8 #include <cstring>
9 using namespace std;
10 struct node{
11 int x,y;
12 node *next;
13 };
14
15 int Life=1;//是否死亡 0代表死亡;
16 int x_food,y_food;//食物位置
17 int x_block[36],y_block[36];//障碍物的位置
18 char movedir='R';//方向
19 node* SHead=NULL;//
20 node* STail=NULL;
21 node* p=NULL;
22 int foodnum=0;
23 int score=0;
24 int level=0;
25 int death=0;
26 int speed=400;
27
28 void creatsnakemap();//创建地图
29 void creatsnake();//创建蛇
30 void gotoxy(int,int);//光标定位函数*
31 void SetColor(unsigned short);//设置颜色
32 void startgame();//开始游戏
33 void makeblock();//产生障碍物
34 void isdead();//判断是否死亡;
35 void nofood(int x,int y);//前方没有食物
36 void yesfood();//前方有食物
37 void makefood();//随机产生食物
38 void drawsnake();//画出蛇
39 void Snakedelete();//删除蛇的尾巴
40 void isfood();//判断前方是否有食物
41 void creatscreen();//打印开始屏幕
42 void ending();//结束
43 bool judge();//判断食物是否出现在蛇身体上
44 int main()
45 {
46 system("mode con cols=80 lines=35");
47 system("color 1f");
48 creatscreen();
49 creatsnakemap();
50 creatsnake();
51 startgame();
52 ending();
53 while(getch()!=27)
54 continue;
55 }
56 void creatscreen()
57 {
58 SetColor(7);
59 gotoxy(31,10);printf("经典贪吃蛇");
60 gotoxy(28,12);printf("按任意键开始游戏");
61 gotoxy(28,30);printf("Copyright@_御心飞行");
62 getch();
63 system("cls");
64 }
65 void creatsnakemap()
66 {
67 int i;
68 SetColor(3);
69 for(i=4;i<50;i+=2)//横墙
70 {
71 gotoxy(i,4);
72 printf("■");
73 gotoxy(i,29);
74 printf("■");
75 Sleep(30);
76 }
77 for(i=4;i<29;i++)//竖墙
78 {
79 gotoxy(4,i);
80 printf("■");
81 gotoxy(48,i);
82 printf("■");
83 Sleep(30);
84 }
85 SetColor(7);
86 gotoxy(58,13);printf("人头:");
87 gotoxy(58,15);printf("等级:");
88 gotoxy(58,19);printf("还没有穿墙技能");
89 makeblock();
90 }
91 void creatsnake()
92 {
93 node* newsnake;
94 int i;
95 SHead=(node *)malloc(sizeof(node));
96 STail=SHead;
97 STail->next=NULL;
98 for(i=0;i<3;i++)
99 {
100 newsnake=(node *)malloc(sizeof(node));
101 newsnake->next=NULL;
102 STail->next =newsnake;
103 STail=newsnake;
104 }
105 STail->next=NULL;
106 p=SHead;
107 SetColor(2);
108 gotoxy(p->x=16,p->y=10),printf("◆");
109 p=p->next;
110 SetColor(3);
111 gotoxy(p->x=14,p->y=10),printf("□");
112 p=p->next;
113 gotoxy(p->x=12,p->y=10),printf("□");
114 p=p->next;
115 gotoxy(p->x=10,p->y=10),printf("□");
116
117 }
118 void startgame()
119 {
120 while(1)
121 {
122 isdead();
123 if(Life==0)
124 break;
125 if(foodnum==0)
126 {
127 makefood();
128 foodnum=1;
129 }
130 if(GetAsyncKeyState(VK_UP)&&movedir!='D')
131 movedir='U';
132 if(GetAsyncKeyState(VK_DOWN)&&movedir!='U')
133 movedir='D';
134 if(GetAsyncKeyState(VK_LEFT)&&movedir!='R')
135 movedir='L';
136 if(GetAsyncKeyState(VK_RIGHT)&&movedir!='L')
137 movedir='R';
138 isfood(); //判断前方是否有食物,然后移动一格
139 Sleep(speed);//刷新时间,即速度;
140 int Olevel=level;
141 SetColor(7);
142 gotoxy(68,13);printf("%d",score);
143 gotoxy(68,15);printf("%d",level=score/7+1);
144 if(Olevel==level-1)//等级判断
145 {
146 if(speed>200)
147 speed-=60;
148 else if(speed>100)
149 speed-=40;
150 else
151 speed-=14;
152 }
153 SetColor(5);
154 if(level>=5)
155 {
156 gotoxy(58,19);printf("穿墙技能GET.22333");
157 gotoxy(58,20);printf("你可放心穿过白墙");
158 }
159 }
160 system("cls");
161 }
162 void isfood()
163 {
164 if(movedir=='U')
165 {
166 if(SHead->x==x_food&&SHead->y-1==y_food)//判断
167 yesfood(); //前方有食物
168 else
169 nofood(SHead->x,SHead->y-1);//前方没有食物
170 }
171 if(movedir=='D')
172 {
173 if(SHead->x==x_food&&SHead->y+1==y_food)
174 yesfood();
175 else
176 nofood(SHead->x,SHead->y+1);
177 }
178 if(movedir=='L')
179 {
180 if(SHead->x-2==x_food&&SHead->y==y_food)
181 yesfood();
182 else
183 nofood(SHead->x-2,SHead->y);
184 }
185 if(movedir=='R')
186 {
187 if(SHead->x+2==x_food&&SHead->y==y_food)
188 yesfood();
189 else
190 nofood(SHead->x+2,SHead->y);
191
192 }
193 drawsnake();
194 }
195 void nofood(int x,int y)
196 {
197 node* Nh;//临时头节点
198 Nh=(node *)malloc(sizeof(node));//设定新的蛇头
199 Nh->x=x;
200 Nh->y=y;
201 Nh->next=SHead;
202 SHead=Nh;
203 Snakedelete();//删除最后一个节点
204 }
205 void yesfood()
206 {
207 node* food;
208 food=(node*)malloc(sizeof(node));
209 food->x=x_food;
210 food->y=y_food;
211 food->next=SHead;
212 SHead=food;
213 foodnum=0;
214 makefood();
215 score++;
216 }
217 void Snakedelete()
218 {
219 p=SHead;
220 while((p->next)->next!=NULL)
221 {
222 p=p->next;
223 }
224 gotoxy(STail->x,STail->y),printf(" ");
225 free(STail);
226 STail=p;
227 STail->next=NULL;
228 }
229 void drawsnake()
230 {
231 p=SHead->next;
232 SetColor(2);
233 gotoxy(SHead->x,SHead->y);
234 printf("◆");
235 while(p!=NULL)
236 {
237 SetColor(2);
238 gotoxy(p->x,p->y),printf("□");
239 p=p->next;
240 }
241 }
242 void isdead()//判断是否死亡
243 {
244 node* p;
245 if(SHead->y==4&&movedir=='U')//预判是否撞到墙
246 {
247 Life=0;
248 return;
249 }
250 if(SHead->y==29&&movedir=='D')
251 {
252 Life=0;
253 return;
254 }
255 if(SHead->x==4&&movedir=='L')
256 {
257 Life=0;
258 return;
259 }
260 if(SHead->x==48&&movedir=='R')
261 {
262 Life=0;
263 return;
264 }
265 for(p=SHead->next;p!=NULL;p=p->next)//判断是否撞到自己
266 {
267 if(SHead->x==p->x&&SHead->y==p->y)
268 {
269 Life=0;
270 break;
271 }
272 }
273 if(level<5)
274 {
275 for(int i=0;i<36;i++)
276 {
277 if(SHead->x==x_block[i]&&SHead->y==y_block[i])
278 {
279 Life=0;
280 break;
281 }
282 }
283 }
284 }
285 void makefood()//随机产生食物
286 {
287 srand(time(NULL));
288 do
289 {
290 x_food=rand()%41+5;
291 if(x_food%2==1)
292 x_food++;
293 y_food=(rand()*rand())%23+5;
294 }while(judge());//判断食物是否会产生在蛇的身体上
295 gotoxy(x_food,y_food);
296 SetColor(4);
297 printf("●");
298 foodnum=1;
299 }
300 void makeblock()//随机产生障碍物
301 {
302 memset(x_block,0,sizeof(x_block));
303 memset(y_block,0,sizeof(y_block));
304 int i=0,j=8,k=7,p=2;
305 for(;i<12;i++)
306 {
307 srand(time(NULL));
308 x_block[i]=(rand()*(++p))%39+8;
309 if(x_block[i]%2==1)
310 x_block[i]++;
311 y_block[i]=(rand()*(++k)*i)%22+5;
312 if(y_block[i]%3==0)
313 {
314 gotoxy(x_block[i],y_block[i]);
315 printf("■■");
316 x_block[j]=x_block[i]+2;
317 y_block[j++]=y_block[i];
318 }
319 else if(y_block[i]%3==1)//最坏的情况
320 {
321 gotoxy(x_block[i],y_block[i]);
322 printf("■");
323 gotoxy(x_block[i],y_block[i]+1);
324 printf("■");
325 gotoxy(x_block[i],y_block[i]+2);
326 printf("■");
327 x_block[j]=x_block[i];
328 y_block[j]=y_block[i]+1;
329 x_block[j+1]=x_block[i];
330 y_block[j+1]=y_block[i]+2;
331 j+=2;
332 }
333 else
334 {
335 gotoxy(x_block[i],y_block[i]);
336 printf("■■");
337 x_block[j]=x_block[i]+2;
338 y_block[j]=y_block[i];
339 }
340 }
341 }
342 bool judge()
343 {
344 node* p=SHead;
345 int i=0;
346 for(;p!=NULL;p=p->next)
347 {
348 if(p->x==x_food&&p->y==y_food)
349 return 1;
350 }
351 for(;i<36;i++)
352 {
353 if(x_food==x_block[i]&&y_food==y_block[i])
354 return 1;
355 }
356 return 0;
357 }
358 void ending()
359 {
360 SetColor(6);
361 gotoxy(27,10);printf("game over! -_-!");
362 SetColor(7);
363 gotoxy(30,14);printf("成绩:%d",score);
364 gotoxy(21,30);printf("我的博客:www.cnblog.com/a1225234/");
365 }
366 void gotoxy(int x, int y)//光标定位函数 x列,y行
367 {
368 COORD coord = {x, y};
369 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
370 }
371
372 void SetColor(unsigned short ForeColor) // ForeColor前景色
373 {
374 HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE); //获得缓冲区句柄
375 SetConsoleTextAttribute(hCon,ForeColor);//设置文本及背景颜色
376 }