⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 snake.lst

📁 用终端仿真接收显示和控制来玩游戏
💻 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 + -