C++实现贪吃蛇小游戏

总体思路


  一直输出、清屏、再输出...形成刷新效果,形成动画效果。生成一个二维数组,用以储存地图、食物、蛇和围墙。每次输出将这个二维数组输出。生成指针数组指向二维数组来表示一个蛇头和蛇尾,指针所指的位置值为*表示蛇身,-表示蛇头,创建变量fx用来记录当前蛇的移动方向

  蛇的移动:循环用_kbhit()判断键盘是否触动,如果没有触动,蛇就往前移动(将指针所指的位置值清空,蛇头指针前面那格变为新蛇头,原来的蛇头变成蛇身,蛇的最后一格尾巴去掉,如果蛇头吃到食物,蛇尾就不去。然后指针所指的位置重新赋值),如果键盘触动,判断如果不是w、a、s、d、空格(游戏结束)、回车(游戏重开)就视为没被触动,如果是wasd就改变变量fx,并且蛇头往所指方向移动。如果蛇头的前面一格是蛇身、围墙,游戏结束

  食物的生成:用两个随机数定位食物的位置,如果食物位置是围墙或蛇身,重新生成

 

代码

 

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<conio.h>
  4 #include<time.h>
  5 #include<windows.h>
  6 int st=3,js=1,df=0;
  7 char fx='a',*p;
  8 void sjs(char a[20][20])
  9 {
 10     srand(time(NULL));
 11     p=&a[rand()%17+1][rand()%17+1];
 12     while(*p=='*')
 13     {
 14         srand(time(NULL));
 15         p=&a[rand()%17+1][rand()%17+1];
 16     }
 17     *p='!';
 18 }
 19 void csh(char a[20][20],char *q[300])
 20 {    
 21     int i,j;
 22     st=3;
 23     js=1;
 24     df=0;
 25     fx='a';
 26     for(i=0;i<20;i++)
 27     {
 28         a[19][i]=a[0][i]='@';
 29         a[i][19]=a[i][0]='@';
 30     }
 31     for(i=1;i<19;i++)
 32         for(j=1;j<19;j++)
 33             a[i][j]=' ';
 34     q[0]=&a[10][9];
 35     q[1]=&a[10][10];
 36     q[2]=&a[10][11];
 37     *q[0]='-';
 38     *q[1]=*q[2]='*';
 39     sjs(a);
 40     printf("您的得分为:%d",df);
 41 }
 42 void sx(char a[20][20])
 43 {        
 44     int i,j;
 45     for(i=0;i<20;i++)
 46         {
 47             a[19][i]=a[0][i]='@';
 48             a[i][19]=a[i][0]='@';
 49         }
 50     for(i=1;i<19;i++)
 51         for(j=1;j<19;j++)
 52             a[i][j]=' ';
 53     *p='!';
 54 }
 55 void sc(char a[20][20])
 56 {
 57     int i,j;
 58     for(i=0;i<20;i++)
 59     {
 60         for(j=0;j<20;j++)
 61         {
 62         printf("%c ",a[i][j]);
 63         }
 64         printf("\n");
 65     }
 66     printf("您的得分为:%d",df);
 67 
 68 }
 69 void up(char a[20][20],char *q[300])
 70 {    
 71     int i,j;
 72     if(*(q[0]-20)!='@')
 73     {    
 74         if(*(q[0]-20)!='*')
 75             if(*(q[0]-20)=='!')
 76             {
 77                 sx(a);
 78                 for(i=st;i>0;i--)
 79                 {
 80                     q[i]=q[i-1];
 81                     *q[i]='*';
 82                 }
 83                 q[0]=q[0]-20;
 84                 *q[0]='|';
 85                 st=st+1;
 86                 df=df+1;
 87                 system("cls");
 88                 sjs(a);
 89                 sc(a);
 90             }
 91             else
 92             {
 93 
 94                 sx(a);
 95                 for(i=st-1;i>0;i--)
 96                 {
 97                     q[i]=q[i-1];
 98                     *q[i]='*';
 99                 }
100                 q[0]=q[0]-20;
101                 *q[0]='|';
102                 system("cls");
103                 sc(a);
104             }
105         else
106             js=0;
107     }
108     else
109         js=0;
110 
111 }
112 void left(char a[20][20],char *q[300])
113 {    
114     int i,j;
115     if(*(q[0]-1)!='@')
116     {
117         if(*(q[0]-1)!='*')
118         {
119             if(*(q[0]-1)=='!')
120             {
121                 sx(a);
122                 for(i=st;i>0;i--)
123                 {
124                     q[i]=q[i-1];
125                     *q[i]='*';
126                 }
127                 q[0]=q[0]-1;
128                 *q[0]='-';
129                 st=st+1;
130                 df=df+1;
131                 system("cls");
132                 sjs(a);
133                 sc(a);
134             }
135             else
136             {
137 
138                 sx(a);
139                 for(i=st-1;i>0;i--)
140                 {
141                     q[i]=q[i-1];
142                     *q[i]='*';
143                 }
144                 q[0]=q[0]-1;
145                 *q[0]='-';
146                 system("cls");
147                 sc(a);
148                 }
149             }
150         else
151             js=0;
152     }
153     else
154         js=0;
155 }
156 void down(char a[20][20],char *q[300])
157 {    
158     int i,j;
159     if(*(q[0]+20)!='@')
160     {    
161         if(*(q[0]+20)!='*')
162             if(*(q[0]+20)=='!')
163             {
164                 sx(a);
165                 for(i=st;i>0;i--)
166                 {
167                     q[i]=q[i-1];
168                     *q[i]='*';
169                 }
170                 q[0]=q[0]+20;
171                 *q[0]='|';
172                 st=st+1;
173                 df=df+1;
174                 system("cls");
175                 sjs(a);
176                 sc(a);
177             }
178             else
179             {
180 
181                 sx(a);
182                 for(i=st-1;i>0;i--)
183                 {
184                     q[i]=q[i-1];
185                     *q[i]='*';
186                 }
187                 q[0]=q[0]+20;
188                 *q[0]='|';
189                 system("cls");
190                 sc(a);
191             }
192         else
193             js=0;
194     }
195     else
196         js=0;
197 
198 }
199 void right(char a[20][20],char *q[300])
200 {
201     int i,j;
202     if(*(q[0]+1)!='@')
203     {
204         if(*(q[0]+1)!='*')
205         {
206             if(*(q[0]+1)=='!')
207             {
208                 sx(a);
209                 for(i=st;i>0;i--)
210                 {
211                     q[i]=q[i-1];
212                     *q[i]='*';
213                 }
214                 q[0]=q[0]+1;
215                 *q[0]='-';
216                 st=st+1;
217                 df=df+1;
218                 system("cls");
219                 sjs(a);
220                 sc(a);
221             }
222             else
223             {
224 
225                 sx(a);
226                 for(i=st-1;i>0;i--)
227                 {
228                     q[i]=q[i-1];
229                     *q[i]='*';
230                 }
231                 q[0]=q[0]+1;
232                 *q[0]='-';
233                 system("cls");
234                 sc(a);
235             }
236         }
237         else
238             js=0;
239     }
240     else
241         js=0;
242 
243 }
244 void dp()
245 {
246         int pd;
247         pd=_getch();
248         if(fx=='w')
249             if(pd=='a'||pd=='d')
250                 fx=pd;
251         if(fx=='a')
252             if(pd=='w'||pd=='s')
253                 fx=pd;
254         if(fx=='s')
255             if(pd=='a'||pd=='d')
256                 fx=pd;
257         if(fx=='d')
258             if(pd=='w'||pd=='s')
259                 fx=pd;
260 
261 }
262 void yx()
263 {
264     int i,j;
265     char a[20][20],*q[300],pd;
266     csh(a,q);
267     sc(a);
268     Sleep(500);
269     while(js==1)
270     {
271         if(_kbhit()!=0)
272         {
273         dp();
274         }
275         switch(fx)
276         {
277         case 'w':up(a,q);break;
278         case 'a':left(a,q);break;
279         case 's':down(a,q);break;
280         case 'd':right(a,q);
281         }
282     }
283         printf("\n很遗憾,您输了\n点击回车重开,点击空格结束\n");
284 
285 }
286 void main()
287 {
288     char xz=13;
289     yx();
290     xz=_getch();
291     while(xz!=13)
292     {
293         xz=_getch();
294         if(xz==' ')
295             break;
296     }
297     if(xz==13)
298     {
299         system("cls");
300         main();
301     }
302 }

 

总结


这个代码其实是四个月前写的,现在回过头来只有一个感觉。。。我当初写了啥?四个月前的代码现在已经忘了大半了,现在想重新看一遍都看不下去。所以这个博客也是凭模糊的记忆写的。。。这个代码最大的问题就是一个注释都没有,有些后来想到的一些改进的地方都因为没有注释而寸步难行,其他可以改进的部分就是一开始就定死了地图的大小,后面如果要改了话很麻烦,可以用define来定义二维数组的大小,以后要改可以直接在define改。还有就是在原代码是输入fx,然后根据w、a、s、d来传到不同的函数,每一个函数进行一个方向的行动,可以将四个函数合并为一个,判断完方向后将蛇头的位移传递到函数中,用这个函数来进行四个方向的移动

 

上一篇:风速风向 UV 相互转换


下一篇:三菱FX系列PLC教程