C++实现贪吃蛇小游戏
标签:else sys clu str 有一个 i++ == 代码 time
总体思路
一直输出、清屏、再输出...形成刷新效果,形成动画效果。生成一个二维数组,用以储存地图、食物、蛇和围墙。每次输出将这个二维数组输出。生成指针数组指向二维数组来表示一个蛇头和蛇尾,指针所指的位置值为*表示蛇身,-表示蛇头,创建变量fx用来记录当前蛇的移动方向
蛇的移动:循环用_kbhit()判断键盘是否触动,如果没有触动,蛇就往前移动(将指针所指的位置值清空,蛇头指针前面那格变为新蛇头,原来的蛇头变成蛇身,蛇的最后一格尾巴去掉,如果蛇头吃到食物,蛇尾就不去。然后指针所指的位置重新赋值),如果键盘触动,判断如果不是w、a、s、d、空格(游戏结束)、回车(游戏重开)就视为没被触动,如果是wasd就改变变量fx,并且蛇头往所指方向移动。如果蛇头的前面一格是蛇身、围墙,游戏结束
食物的生成:用两个随机数定位食物的位置,如果食物位置是围墙或蛇身,重新生成
代码
1 #include 2 #include 3 #include 4 #include 5 #include 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;i20;i++)
27 {
28 a[19][i]=a[0][i]=‘@‘;
29 a[i][19]=a[i][0]=‘@‘;
30 }
31 for(i=1;i19;i++)
32 for(j=1;j19;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;i20;i++)
46 {
47 a[19][i]=a[0][i]=‘@‘;
48 a[i][19]=a[i][0]=‘@‘;
49 }
50 for(i=1;i19;i++)
51 for(j=1;j19;j++)
52 a[i][j]=‘ ‘;
53 *p=‘!‘;
54 }
55 void sc(char a[20][20])
56 {
57 int i,j;
58 for(i=0;i20;i++)
59 {
60 for(j=0;j20;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来传到不同的函数,每一个函数进行一个方向的行动,可以将四个函数合并为一个,判断完方向后将蛇头的位移传递到函数中,用这个函数来进行四个方向的移动
C++实现贪吃蛇小游戏
标签:else sys clu str 有一个 i++ == 代码 time
原文地址:https://www.cnblogs.com/hbsblog/p/12863509.html
评论