總體思路
一直輸出、清屏、再輸出...形成刷新效果,形成動畫效果。生成一個二維數組,用以儲存地圖、食物、蛇和圍牆。每次輸出將這個二維數組輸出。生成指針數組指向二維數組來表示一個蛇頭和蛇尾,指針所指的位置值為*表示蛇身,-表示蛇頭,創建變量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來傳到不同的函數,每一個函數進行一個方向的行動,可以將四個函數合並為一個,判斷完方向后將蛇頭的位移傳遞到函數中,用這個函數來進行四個方向的移動