控制台小游戏-贪吃蛇,c++和c#版

2020-11-26 12:24

阅读:792

标签:style   blog   class   code   tar   ext   color   width   get   strong   int   

说是c++版,其实只是用到了c++的cout和cin而已。这是我做的第二个控制台游戏,基本上每一行代码都加上了注释。

游戏嘛,我觉得重要的是了解他的思想,所以后期学了面向对象之后这个游戏的代码我也没有重新封装。

下面请看图

 

mamicode.com,搜素材

mamicode.com,搜素材

mamicode.com,搜素材

mamicode.com,搜素材

 

代码如下:我是用dev c++写的

mamicode.com,搜素材mamicode.com,搜素材
  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


评论


亲,登录后才可以留言!