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来传到不同的函数,每一个函数进行一个方向的行动,可以将四个函数合并为一个,判断完方向后将蛇头的位移传递到函数中,用这个函数来进行四个方向的移动