📄 snake.lst
字号:
C51 COMPILER V3.96, SN-83203013 SNAKE 07/21/00 17:32:22 PAGE 1
DOS C51 COMPILER V3.96, COMPILATION OF MODULE SNAKE
OBJECT MODULE PLACED IN SNAKE.OBJ
COMPILER INVOKED BY: D:\C51WIN\BIN\C51.EXE SNAKE.C
stmt level source
1 #include "w77e58.h"
2 #include "vt100.h"
3 #include "init.h"
4 #include "stdio.h"
5 #include "stdlib.h"
6
7 typedef struct {
8 unsigned char x;
9 unsigned char y;
10 }SnakeType;
11
12 #define UP 0xf0
13 #define DOWN 0x0f
14
15 #define LEFT 0x00
16 #define RIGHT 0xff
17
18 #define L_SHEET 5
19 #define R_SHEET 61
20
21 #define T_SHEET 5
22 #define B_SHEET 22
23
24 void init(void);
25 void delay(unsigned int);
26 void put_block(char,char);
27 void hide_block(char,char);
28 bit flash_snake(unsigned char);
29 void putch(char);
30
31 bit kbhit(void);
32 char getch(void);
33 void clr_wchdog(void){}
34 void put_bug(void);
35 void init_snake(void);
36 void putstr(char xdata *);
37 void flash_data(void);
38 void type_kbd(char code*);
39
40 data dword GameScore;
41 data dword HighScore;
42 data byte direct;
43 data word SnakeLen;
44 xdata SnakeType snake[400];
45 xdata byte print_buf[20];
46
47 data byte Level;
48 data byte bug_x,bug_y;
49
50 bit TimerEnd;
51 bit GameOver;
52 bit GameStart;
53 bit blink_flag0;
54 bit blink_flag1;
55 bit flashed;
C51 COMPILER V3.96, SN-83203013 SNAKE 07/21/00 17:32:22 PAGE 2
56 bit type_flag;
57
58 void main()
59 {
60 1 data byte ch,ch1;
61 1 bit scoreadd;
62 1
63 1 init();
64 1 put_bug();
65 1 while(1)
66 1 {
67 2 REN_1=1;
68 2 if(kbhit())
69 2 {
70 3 ch1=ch;
71 3 ch=getch();
72 3 ch=ch&(0x20^0xff);
73 3 switch(ch)
74 3 {
75 4 case 'W':
76 4 ch=UP;
77 4 if(~ch == ch1) ch=ch1;
78 4 else {TimerEnd=1;scoreadd=1;}
79 4 break;
80 4 case 'S':
81 4 ch=DOWN;
82 4 if(~ch == ch1) ch=ch1;
83 4 else {TimerEnd=1;scoreadd=1;}
84 4 break;
85 4 case 'A':
86 4 ch=LEFT;
87 4 if(~ch == ch1) ch=ch1;
88 4 else {TimerEnd=1;scoreadd=1;}
89 4 break;
90 4 case 'D':
91 4 ch=RIGHT;
92 4 if(~ch == ch1) ch=ch1;
93 4 else {TimerEnd=1;scoreadd=1;}
94 4 break;
95 4 case '\r':
96 4 if(GameOver)
97 4 {
98 5 init_snake();
99 5 GameOver=0;
100 5 GameScore=0;
101 5 GameStart=0;
102 5 }
103 4 if(!GameStart)
104 4 {
105 5 del_line(4);
106 5 gotoxy(L_SHEET,4);
107 5 fputstr("Playing game....");
108 5
109 5 del_line(24);
110 5 gotoxy(L_SHEET,24);
111 5 fputstr("Option| UP(&W) DOWN(&S) LEFT(&A) RIGHT(D) &PAUSE");
112 5 }
113 4 GameStart=1;ch=1;
114 4 break;
115 4 case 'P':
116 4 if(!GameStart) break;
117 4 while(!kbhit())
C51 COMPILER V3.96, SN-83203013 SNAKE 07/21/00 17:32:22 PAGE 3
118 4 {
119 5 gotoxy(L_SHEET,4);
120 5 type_kbd("Game pause, Press any key to continue...");
121 5 del_line(4);
122 5 }
123 4 gotoxy(L_SHEET,4);
124 4 fputstr("Playing game....");
125 4 break;
126 4 case 'N':
127 4 if(!GameStart && Level>0) Level--;
128 4 flash_data();
129 4 ch=1;
130 4 break;
131 4 case 'U':
132 4 if(!GameStart && Level<16) Level++;
133 4 flash_data();
134 4 default:
135 4 ch=1;
136 4 }
137 3 }
138 2 if(!GameStart)
139 2 {
140 3 del_line(4);
141 3 gotoxy(L_SHEET,4);
142 3 if(GameOver) type_kbd("Game Over,");
143 3 type_kbd("Press Enter to start ");
144 3 }
145 2 if(!GameOver && GameStart)
146 2 {
147 3 if(blink_flag0)
148 3 {
149 4 hide_block(bug_x,bug_y);
150 4 blink_flag0=0;
151 4 }
152 3 if(blink_flag1)
153 3 {
154 4 put_block(bug_x,bug_y);
155 4 blink_flag1=0;
156 4 }
157 3 }
158 2
159 2 if( TimerEnd && GameStart && !GameOver)
160 2 {
161 3 TimerEnd=0;
162 3 if(!flash_snake(ch))
163 3 {
164 4 if(GameScore>HighScore) HighScore=GameScore;
165 4 GameScore=0;
166 4 GameOver=1;
167 4 GameStart=0;
168 4 hide_block(bug_x,bug_y);
169 4 del_line(24);
170 4 gotoxy(L_SHEET,24);
171 4 fputstr("Option| Level &UP/DOW&N");
172 4 }
173 3 if(scoreadd)
174 3 {
175 4 scoreadd=0;
176 4 GameScore += (20+Level*2);
177 4 }
178 3 flash_data();
179 3 }
C51 COMPILER V3.96, SN-83203013 SNAKE 07/21/00 17:32:22 PAGE 4
180 2 }
181 1 }
182 void time_int(void) interrupt 1
183 {
184 1 static byte tcc;
185 1
186 1 TH0=0x80;
187 1 if((tcc&0x03)==0) blink_flag0=1;
188 1 if((tcc&0x03)==2) blink_flag1=1;
189 1
190 1 if( ++tcc >= (16-Level+4) )
191 1 {
192 2 tcc=0;
193 2 TimerEnd=!flashed;
194 2 flashed=0;
195 2 }
196 1 if(type_flag ) TimerEnd=1;
197 1 }
198 void init(void)
199 {
200 1 char i;
201 1 char xdata*xptr;
202 1
203 1 EA=0;
204 1 use_inter_SRAM;
205 1 xptr=(char xdata*)0x400;
206 1 while(xptr) *xptr--=0;
207 1 timer0_16bit;
208 1 timer0_start;
209 1 ET0=1;
210 1 serial_uart8;
211 1 REN_1=1;
212 1 serial_baud_9600;
213 1 TI_1=1;
214 1 Level=8;
215 1 fputstr("#");
216 1 clrscr();
217 1 for(i=L_SHEET;i<=R_SHEET;i+=2)
218 1 {
219 2 put_block(i,T_SHEET);
220 2 put_block(i,B_SHEET);
221 2 }
222 1 for(i=T_SHEET+1;i<B_SHEET;i++)
223 1 {
224 2 put_block(L_SHEET,i);
225 2 put_block(R_SHEET,i);
226 2 }
227 1 fputstr("$");
228 1 gotoxy(L_SHEET,1);fputstr("#Cupidity snake version 1.00 $");
229 1 gotoxy(L_SHEET,2);fputstr("High Score:");
230 1 gotoxy(L_SHEET,3);fputstr("Score :");
231 1 gotoxy(L_SHEET+30,2);fputstr("Tuched:");
232 1 gotoxy(L_SHEET+30,3);fputstr("Level :");
233 1 gotoxy(L_SHEET,24);
234 1 fputstr("Option| Level &UP/DOW&N");
235 1 snake[0].x=0;
236 1 init_snake();
237 1 flash_data();
238 1 GameStart=0;
239 1 GameOver=0;
240 1 EA=1;
241 1 }
C51 COMPILER V3.96, SN-83203013 SNAKE 07/21/00 17:32:22 PAGE 5
242 void init_snake(void)
243 {
244 1 unsigned char i;
245 1
246 1 i=0;
247 1 while(snake[i].x!=0)
248 1 {
249 2 hide_block(snake[i].x,snake[i].y);
250 2 i++;
251 2 }
252 1 for(i=0;i<7;i++)
253 1 {
254 2 snake[i].x=L_SHEET+20;
255 2 snake[i].y=T_SHEET+4+i;
256 2 }
257 1 snake[7].x=0;
258 1 direct=LEFT;
259 1 for(i=0;snake[i].x!=0;i++)
260 1 put_block(snake[i].x,snake[i].y);
261 1 SnakeLen=7;
262 1
263 1
264 1 }
265 void put_bug(void)
266 {
267 1 data byte i,ch;
268 1 re_find:
269 1 do{
270 2 ch =rand()%76;
271 2 }while((ch<=L_SHEET || ch>=R_SHEET)|| 0==(ch&0x01));
272 1 bug_x=ch;
273 1 do{
274 2 ch =rand()%24;
275 2 }while(ch<=T_SHEET || ch>=B_SHEET);
276 1 for(i=0;snake[i].x!=0;i++)
277 1 {
278 2 if(ch==snake[i].y && bug_x==snake[i].x)
279 2 goto re_find;
280 2 }
281 1 bug_y=ch;
282 1 put_block(bug_x,bug_y);
283 1 }
284 bit flash_snake(unsigned char dir1)
285 {
286 1 data unsigned char x0,y0,i,j;
287 1
288 1
289 1 if(dir1==1) dir1=direct;
290 1 else
291 1 {
292 2 if(direct == ~dir1) dir1=direct;
293 2 else direct=dir1;
294 2
295 2 }
296 1 switch(dir1)
297 1 {
298 2 case UP:
299 2 y0=snake[0].y-1;
300 2 x0=snake[0].x;
301 2 break;
302 2 case DOWN:
303 2 y0=snake[0].y+1;
C51 COMPILER V3.96, SN-83203013 SNAKE 07/21/00 17:32:22 PAGE 6
304 2 x0=snake[0].x;
305 2 break;
306 2 case LEFT:
307 2 x0=snake[0].x-2;
308 2 y0=snake[0].y;
309 2 break;
310 2 case RIGHT:
311 2 x0=snake[0].x+2;
312 2 y0=snake[0].y;
313 2 break;
314 2 }
315 1 if( (y0<=T_SHEET)|| (y0>=B_SHEET)|| (x0<=L_SHEET)||(x0>=R_SHEET))return(0);
316 1
317 1 for(i=0;snake[i].x!=0;i++)
318 1 {
319 2 if(x0==snake[i].x && y0==snake[i].y) return(0);
320 2 }
321 1 hide_block(x0,y0);
322 1 put_block(x0,y0);
323 1 hide_block(snake[i-1].x,snake[i-1].y);
324 1 if(bug_x==x0 && bug_y==y0)
325 1 {
326 2 SnakeLen++;
327 2 GameScore +=(SnakeLen*5 + Level*3);
328 2 if((SnakeLen%15)==0 && Level<16) Level++;
329 2 snake[i].x=snake[i-1].x;
330 2 snake[i].y=snake[i-1].y;
331 2 snake[i+1].x=0;
332 2 i++;
333 2
334 2 for(j=0;snake[j].x!=0;j++)
335 2 {
336 3 hide_block(snake[j].x,snake[j].y);
337 3 put_block(snake[j].x,snake[j].y);
338 3 delay(0x200);
339 3 }
340 2 put_bug();
341 2 }
342 1
343 1 while(--i) snake[i]=snake[i-1];
344 1 snake[0].x=x0;
345 1 snake[0].y=y0;
346 1 flashed=1;
347 1 return(1);
348 1 }
349 void put_block(char x,char y)
350 {
351 1 gotoxy(x,y);
352 1 fputstr("▓");
353 1 delay(100);
354 1 }
355 void hide_block(char x,char y)
356 {
357 1 gotoxy(x,y);
358 1 fputstr(" ");
359 1 }
360 bit kbhit(void)
361 {
362 1 return(RI_1);
363 1 }
364 void putstr(char xdata*str)
365 {
C51 COMPILER V3.96, SN-83203013 SNAKE 07/21/00 17:32:22 PAGE 7
366 1 while(*str)
367 1 {
368 2 putch(*str++);
369 2 }
370 1 }
371 void flash_data(void)
372 {
373 1 gotoxy(L_SHEET+sizeof("High Score: "),2);
374 1 sprintf(print_buf,"%-10ld",HighScore);putstr(print_buf);
375 1 gotoxy(L_SHEET+sizeof("High Score: "),3);
376 1 sprintf(print_buf,"%-10ld",GameScore);putstr(print_buf);
377 1 gotoxy(L_SHEET+30+sizeof("Tuched: "),2);
378 1 sprintf(print_buf,"%3d",SnakeLen);putstr(print_buf);
379 1 gotoxy(L_SHEET+30+sizeof("Tuched: "),3);
380 1 sprintf(print_buf,"%3d",(int)(char)Level);putstr(print_buf);
381 1
382 1 }
383 void type_kbd(char code *str)
384 {
385 1 data byte ch,i=0;
386 1
387 1 type_flag=1;
388 1 flashed=1;
389 1 while( (ch=str[i]) !=0)
390 1 {
391 2 if(kbhit()) break;
392 2 if(TimerEnd)
393 2 {
394 3 TimerEnd=0;
395 3 putch(ch);
396 3 if(ch=='\n') fputstr("\r ");
397 3 i++;
398 3 }
399 2 clr_wchdog();
400 2 }
401 1 type_flag=0;
402 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 2039 ----
CONSTANT SIZE = 302 ----
XDATA SIZE = 820 ----
PDATA SIZE = ---- ----
DATA SIZE = 15 16
IDATA SIZE = ---- ----
BIT SIZE = 7 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -