C++贪吃蛇

动画链接

GitHub链接:https://github.com/yanpeng1314/Snake

  1 #include "Snake.h"
  2 
  3 int iScore = 0;
  4 int iGrade = 1;
  5 
  6 //蛇头蛇尾初始位置
  7 int x_head = 1, y_head = 3;
  8 int x_tail = 1, y_tail = 1;
  9 
 10 //地图坐标
 11 int i_Map = 1, j_Map = 1;
 12 
 13 //第二节初始位置
 14 int x_second = 1, y_second = 2;
 15 
 16 //初始化移动方向
 17 int towards1 = 2; //原来方向
 18 int towards2; //按键按下后的方向
 19 
 20 const int SIDE = 20;
 21 int Snake_Map[SIDE][SIDE] = { 0 };
 22 
 23 int Speed = 300;
 24 
 25 
 26 
 27 
 28 list<Snake_Position> LIST;
 29 Snake_Position snake;
 30 
 31 
 32 
 33 int main()
 34 {
 35     Init();
 36     srand((unsigned)time(NULL));
 37     char getKeyboard = 'd';        //从键盘读取的键值
 38     char getKeyboard_Vice = 'd';    //副本: 如果读取其他值,则保持原来键值
 39     while (1)
 40     {
 41         int isSendFood = 1; //1--不发送食物  0--发送食物  
 42         int iFood;
 43         int x = rand() % 18 + 1;
 44         int y = rand() % 18 + 1;
 45         setColor(6);
 46         HiddenCursor();
 47         GOTO(y, x);
 48         cout << "";
 49         if (Snake_Map[x][y] != 2)
 50             Snake_Map[x][y] = 3;
 51         else
 52             continue;
 53 
 54         while (isSendFood)
 55         {
 56             if (_kbhit())
 57                 getKeyboard = _getch();
 58             if (getKeyboard != 's' && getKeyboard != 'S' && getKeyboard != 'a' && getKeyboard != 'A' && getKeyboard != 'w' && getKeyboard != 'W' && getKeyboard != 'd' && getKeyboard != 'D')
 59                 getKeyboard = getKeyboard_Vice;
 60             switch (getKeyboard)
 61             {
 62             case 'W':
 63             case 'w':
 64                 towards2 = 4;
 65                 if ((towards1 + towards2) == 5)
 66                 {
 67                     getKeyboard = getKeyboard_Vice;
 68                     break;
 69                 }
 70                 towards1 = towards2; //如果现在方向合理,则保存方向到towards1
 71                 x_head -= 1;
 72 
 73                 isDead();
 74                 if (Snake_Map[x_head][y_head] == 3)  //吃到食物
 75                 {
 76                     isSendFood = 0;
 77                     iScore += 1;
 78                     snake.x_snake = x_head;
 79                     snake.y_snake = y_head;
 80                     LIST.push_front(snake);
 81                     Snake_Map[x_head][y_head] = 2;
 82 
 83                     setColor(7);
 84                     HiddenCursor();
 85                     GOTO(y_head, x_head);
 86                     cout << "";
 87 
 88                 }
 89                 else
 90                 {
 91                     snake.x_snake = x_head;
 92                     snake.y_snake = y_head;
 93                     LIST.push_front(snake);
 94                     Snake_Map[LIST.back().x_snake][LIST.back().y_snake] = 0;
 95 
 96                     setColor(7);
 97                     HiddenCursor();
 98                     GOTO(y_head, x_head);
 99                     cout << "";
100                     setColor(7);
101                     HiddenCursor();
102                     GOTO(LIST.back().y_snake, LIST.back().x_snake);
103                     cout << " ";
104 
105                     LIST.pop_back();
106                 }
107                 Snake_Map[x_head][y_head] = 2;
108                 Show_Score();
109                 Sleep(Speed);
110                 //Show_Snake();
111 
112                 getKeyboard_Vice = 'w';
113                 break;
114 
115             case 'S':
116             case 's':
117                 towards2 = 1;
118                 if ((towards1 + towards2) == 5)
119                 {
120                     getKeyboard = getKeyboard_Vice;
121                     break;
122                 }
123                 towards1 = towards2;
124                 x_head += 1;
125 
126                 isDead();
127                 if (Snake_Map[x_head][y_head] == 3)  //吃到食物
128                 {
129                     isSendFood = 0;
130                     iScore += 1;
131                     snake.x_snake = x_head;
132                     snake.y_snake = y_head;
133                     LIST.push_front(snake);
134                     Snake_Map[x_head][y_head] = 2;
135 
136 
137                     setColor(7);
138                     HiddenCursor();
139                     GOTO(y_head, x_head);
140                     cout << "";
141 
142 
143                 }
144                 else
145                 {
146                     snake.x_snake = x_head;
147                     snake.y_snake = y_head;
148                     LIST.push_front(snake);
149                     Snake_Map[LIST.back().x_snake][LIST.back().y_snake] = 0;
150                     setColor(7);
151                     HiddenCursor();
152                     GOTO(y_head, x_head);
153                     cout << "";
154                     setColor(7);
155                     HiddenCursor();
156                     GOTO(LIST.back().y_snake, LIST.back().x_snake);
157                     cout << " ";
158                     LIST.pop_back();
159 
160                 }
161                 Snake_Map[x_head][y_head] = 2;
162                 Show_Score();
163                 Sleep(Speed);
164                 //Show_Snake();
165 
166                 getKeyboard_Vice = 's';
167                 break;
168 
169             case 'A':
170             case 'a':
171                 towards2 = 3;
172                 if ((towards1 + towards2) == 5)
173                 {
174                     getKeyboard = getKeyboard_Vice;
175                     break;
176                 }
177                 towards1 = towards2;
178 
179                 y_head -= 1;
180 
181                 isDead();
182                 if (Snake_Map[x_head][y_head] == 3)  //吃到食物
183                 {
184                     isSendFood = 0;
185                     iScore += 1;
186                     snake.x_snake = x_head;
187                     snake.y_snake = y_head;
188                     LIST.push_front(snake);
189                     Snake_Map[x_head][y_head] = 2;
190                     setColor(7);
191                     HiddenCursor();
192                     GOTO(y_head, x_head);
193                     cout << "";
194 
195                 }
196                 else
197                 {
198                     snake.x_snake = x_head;
199                     snake.y_snake = y_head;
200                     LIST.push_front(snake);
201                     Snake_Map[LIST.back().x_snake][LIST.back().y_snake] = 0;
202                     setColor(7);
203                     HiddenCursor();
204                     GOTO(y_head, x_head);
205                     cout << "";
206                     setColor(7);
207                     HiddenCursor();
208                     GOTO(LIST.back().y_snake, LIST.back().x_snake);
209                     cout << " ";
210                     LIST.pop_back();
211 
212 
213                 }
214                 Snake_Map[x_head][y_head] = 2;
215                 Show_Score();
216                 Sleep(Speed);
217                 //Show_Snake();
218 
219                 getKeyboard_Vice = 'a';
220                 break;
221 
222             case 'D':
223             case 'd':
224                 towards2 = 2;
225                 if ((towards1 + towards2) == 5)
226                 {
227                     getKeyboard = getKeyboard_Vice;
228                     break;
229                 }
230                 towards1 = towards2;
231                 y_head += 1;
232 
233                 isDead();
234                 if (Snake_Map[x_head][y_head] == 3)  //吃到食物
235                 {
236                     isSendFood = 0;
237                     iScore += 1;
238                     snake.x_snake = x_head;
239                     snake.y_snake = y_head;
240                     LIST.push_front(snake);
241                     Snake_Map[x_head][y_head] = 2;
242                     setColor(7);
243                     HiddenCursor();
244                     GOTO(y_head, x_head);
245                     cout << "";
246 
247                 }
248                 else
249                 {
250                     snake.x_snake = x_head;
251                     snake.y_snake = y_head;
252                     LIST.push_front(snake);
253                     Snake_Map[LIST.back().x_snake][LIST.back().y_snake] = 0;
254                     setColor(7);
255                     HiddenCursor();
256                     GOTO(y_head, x_head);
257                     cout << "";
258                     setColor(7);
259                     HiddenCursor();
260                     GOTO(LIST.back().y_snake, LIST.back().x_snake);
261                     cout << " ";
262                     LIST.pop_back();
263 
264 
265                 }
266                 Snake_Map[x_head][y_head] = 2;
267                 Show_Score();
268                 Sleep(Speed);
269                 //Show_Snake();
270 
271                 getKeyboard_Vice = 'd';
272                 break;
273 
274             default:
275                 break;
276             }
277 
278         }
279     }
280 
281 
282     system("pause");
283     return 0;
284 }
285 
286 
287 void Init_Map()
288 {
289     for (int i = 0; i < SIDE; i++)
290     {
291         for (int j = 0; j < SIDE; j++)
292         {
293             if (i == 0 || i == SIDE - 1 || j == 0 || j == SIDE - 1)
294             {
295                 GOTO(i, j);
296                 cout << "";
297             }
298         }
299     }
300 }
301 
302 void Show_Snake()
303 {
304     for (int i = 1; i < SIDE - 1; i++)
305     {
306         for (int j = 1; j < SIDE - 1; j++)
307         {
308             if (Snake_Map[i][j] == 3)
309             {
310                 GOTO(j, i);
311                 cout << "";
312             }
313             if (Snake_Map[i][j] == 2)
314             {
315                 GOTO(j, i);
316                 cout << "";
317             }
318             if (Snake_Map[i][j] == 0)
319             {
320                 GOTO(j, i);
321                 cout << " ";
322             }
323         }
324     }
325 }
326 
327 void Init()
328 {
329     Init_Map();    //初始化显示地图
330     for (int i = 0; i < SIDE; i++)
331     {
332         for (int j = 0; j < SIDE; j++)
333         {
334             if (i == 0 || i == SIDE - 1 || j == 0 || j == SIDE - 1)
335                 Snake_Map[i][j] = 9;
336         }
337     }
338     //将蛇的初始三节坐标依次保存到LIST中
339     Snake_Map[1][1] = 2;
340     snake.x_snake = 1;
341     snake.y_snake = 1;
342     LIST.push_front(snake);
343 
344     Snake_Map[1][2] = 2;
345     snake.x_snake = 1;
346     snake.y_snake = 2;
347     LIST.push_front(snake);
348 
349     Snake_Map[1][3] = 2;
350     snake.x_snake = 1;
351     snake.y_snake = 3;
352     LIST.push_front(snake);
353 
354     Show_Snake();
355 }
356 
357 void isDead()
358 {
359     if (Snake_Map[x_head][y_head] == 9 || Snake_Map[x_head][y_head] == 2)  //死亡条件
360     {
361         system("cls");
362         cout << "你已经挂了, 游戏结束!" << endl;
363         Sleep(2000);
364         exit(-1);
365     }
366 }
367 
368 void Show_Score()
369 {
370     if (iScore == 5)
371     {
372         iGrade = 2;
373         Speed = 250;
374         //Sleep(2000);
375     }
376     if (iScore == 10)
377     {
378 
379         iGrade = 3;
380         Speed = 200;
381         //Sleep(2000);
382     }
383     if (iScore == 15)
384     {
385         setColor(4);
386         HiddenCursor();
387         GOTO(5, 5);
388         cout << "您已达到王者级别";
389         Sleep(5000);
390         exit(0);
391     }
392     setColor(4);
393     HiddenCursor();
394     GOTO(30, 8);
395     cout << "级别: " << iGrade;
396     GOTO(30, 12);
397     cout << "得分: " << iScore;
398 }
Main.cpp
 1 #include "Snake.h"
 2 using namespace std;
 3 
 4 
 5 void GOTO(int x, int y)
 6 {
 7     COORD wall{ 2 * x, y };
 8     SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), wall);
 9 }
10 
11 void setColor(int color)
12 {
13     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color);
14 }
15 
16 
17 void HiddenCursor()
18 {
19     CONSOLE_CURSOR_INFO info;
20     info.dwSize = 1;
21     info.bVisible = FALSE;
22     SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &info);
23 }
Snake.cpp
 1 #pragma once
 2 
 3 #include <iostream>
 4 #include <Windows.h>
 5 #include <time.h>
 6 #include <list>
 7 #include <conio.h>
 8 #include <stdio.h>
 9 #include <stdlib.h>
10 #include <stack>
11 
12 using namespace std;
13 
14 class Snake_Position
15 {
16 public:
17     int x_snake;
18     int y_snake;
19 };
20 
21 //系统函数
22 void setColor(int color);
23 void GOTO(int x, int y);
24 void HiddenCursor();
25 
26 //自定义函数
27 void Init_Map();
28 void Show_Snake();
29 void Init();
30 void isDead();
31 void Show_Score();
Snake.h

 

转载于:https://www.cnblogs.com/yan1314/articles/8454276.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值