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

📄 snake.c

📁 这是我大学4年来做过的竞赛以及老师的科研项目所积累下来的c51源代码
💻 C
字号:
#include "w77e58.h"
#include "vt100.h"
#include "init.h"
#include "stdio.h"
#include "stdlib.h"

typedef struct kk{
	unsigned char x;
	unsigned char y;
}SnakeType;

xdata struct kk snake[400];


#define UP	0xf0
#define DOWN	0x0f
//-----------------------------------------------------------------------------------
#define LEFT	0x00
#define RIGHT	0xff

#define L_SHEET (2*2 +1)
#define R_SHEET (13*2+1)

#define T_SHEET 5
#define B_SHEET 16
//-----------------------------------------------------------------------------------
void	init(void);
void	delay(unsigned int);
void	put_block(char,char);
void	hide_block(char,char);
bit	flash_snake(unsigned char);
void	putch(char);
bit	kbhit(void);
char	getch(void);
void	clr_wchdog(void){}
void	put_bug(void);
void	init_snake(void);
void	putstr(char xdata *);
void	flash_data(void);
void	type_kbd(char code*);
//-----------------------------------------------------------------------------------
data	char GameScore;
data	char HighScore;
data	char direct;
data	char SnakeLen;

xdata	char print_buf[20];

xdata	int Level;
xdata	int	bug_x,bug_y;

bit	TimerEnd;
bit	GameOver;
bit	GameStart;
bit	blink_flag0;
bit	blink_flag1;
bit	flashed;
bit	type_flag;

//-----------------------------------------------------------------------------------
void	main()
{
	data int ch,ch1;
	bit	scoreadd;

	init();
	put_bug();
	while(1)
	{
		REN_1=1;
		if(kbhit())
 		{
  			ch1=ch;
  			ch=getch();
    			ch=ch&(0x20^0xff);
    			switch(ch)
      			{
      	 		case	'W':
      	 	        	ch=UP;
	      	          	if(~ch == ch1) ch=ch1;
      	          		else {TimerEnd=1;scoreadd=1;}
				break;
      	 		case	'S':
      	 	        	ch=DOWN;
	      	          	if(~ch == ch1) ch=ch1;
      	          		else {TimerEnd=1;scoreadd=1;}
				break;
      	 		case	'A':
      	          	        ch=LEFT;
	      	          	if(~ch == ch1) ch=ch1;
      	          		else {TimerEnd=1;scoreadd=1;}
				break;
      	 		case	'D':
      	          	        ch=RIGHT;
	      	          	if(~ch == ch1) ch=ch1;
      	          		else {TimerEnd=1;scoreadd=1;}
				break;
      	 		case	'\r':
      	          	        if(GameOver)
      	                        {
	      	 	        	init_snake();
       	   			GameOver=0;
           	                        GameScore=0;
                                       //GameStart=0;
				}
   				if(!GameStart)
      				{
      	 		        	del_line(4);
      	 	                        gotoxy(L_SHEET,4);
      	 	                        fputstr("Playing game....");
      	                         	del_line(24);
      	                         	gotoxy(L_SHEET,24);
					fputstr("Option| UP(&W) DOWN(&S) LEFT(&A) RIGHT(D) &PAUSE");
				}
				GameStart=1;ch=1;
                               break;
			case	'P':
  				if(!GameStart) break;
  				while(!kbhit())
     				{
	      	 	                gotoxy(L_SHEET,4);
	      	 	                type_kbd("Game pause, any key to continue...");
					del_line(4);
    				}
      				gotoxy(L_SHEET,4);
				fputstr("Playing game....");
   				break;
			case	'N':
  				if(!GameStart && Level>0)	Level--;
     				flash_data();
				ch=1;
   				break;
			case	'U':
  				if(!GameStart && Level<16)	Level++;
     				flash_data();
			default:
  				ch=1;
			}
  		}
		if(!GameStart)
 		{
  			del_line(4);
	  		gotoxy(L_SHEET,4);
  			if(GameOver) type_kbd("Game Over,");
    			type_kbd("Press Enter to start    ");
  		}
 		if(!GameOver && GameStart)
  		{
	 		if(blink_flag0)
  			{
				hide_block(bug_x,bug_y);
  				blink_flag0=0;
	  		}
  			if(blink_flag1)
  			{
				put_block(bug_x,bug_y);
	  			blink_flag1=0;
  			}
   		}
		
		if( TimerEnd && GameStart && !GameOver)
 		{
  			TimerEnd=0;
    			if(scoreadd)
    			{
     				scoreadd=0;
	     			GameScore += (20+Level*2);
     			}
    			if(!flash_snake(ch))                            
      			{
				if(GameScore>HighScore) HighScore=GameScore;
   				GameScore=0;
      	 		        GameOver=1;
      	 	                GameStart=0;
      	                  	hide_block(bug_x,bug_y);
      	                  	del_line(24);
				gotoxy(L_SHEET,24);
				fputstr("Option| Level &UP/DOW&N");
			}
			flash_data();
  		}
	}
}
//-----------------------------------------------------------------------------------
void	time_int(void) interrupt 1
{
	static	int tcc;
	
	TH0=0x80;
	if((tcc&0x03)==0) blink_flag0=1;
	if((tcc&0x03)==2) blink_flag1=1;
	
	if( ++tcc >= (16-Level+4) )
	{	
		tcc=0;
 		TimerEnd=!flashed;
		flashed=0;
  	}
	if(type_flag ) TimerEnd=1;
}
//-----------------------------------------------------------------------------------
void	init(void)
{
	char i;
	char xdata*xptr;
	
       EA=0;
       use_inter_SRAM;
	xptr=(char xdata*)0x400;
	while(xptr) *xptr--=0;
	timer0_16bit;
	timer0_start;
	ET0=1;
	serial_uart8;
	REN_1=1;
	serial_baud_9600;
	TI_1=1;
	Level=8;
	fputstr("#");
	clrscr();
	for(i=L_SHEET;i<=R_SHEET;i+=2)
	{
 		put_block(i,T_SHEET);
 		put_block(i,B_SHEET);
	}
	for(i=T_SHEET+1;i<B_SHEET;i++)
	{
 		put_block(L_SHEET,i);
 		put_block(R_SHEET,i);
	}
	fputstr("$");
	gotoxy(L_SHEET,1);fputstr("#Cupidity snake version 1.00                               $");
	gotoxy(L_SHEET,2);fputstr("High Score:");
	gotoxy(L_SHEET,3);fputstr("Score     :");
	gotoxy(L_SHEET+30,2);fputstr("Tuched:");
	gotoxy(L_SHEET+30,3);fputstr("Level :");
	gotoxy(L_SHEET,24);
	fputstr("Option| Level &UP/DOW&N");
    snake[0].x=0;
	init_snake();
	flash_data();
	GameStart=0;
	GameOver=0;
	EA=1;
}
//-----------------------------------------------------------------------------------
void	init_snake(void)
{
	unsigned char i;
	
       i=0;
	while(snake[i].x!=0)
	{
    		hide_block(snake[i].x,snake[i].y);
      	        i++;
	}
	for(i=0;i<7;i++)
	{
		snake[i].x=L_SHEET+20;
 		snake[i].y=T_SHEET+4+i;
 	}
	snake[7].x=0;
	direct=LEFT;
	for(i=0;snake[i].x!=0;i++)
		put_block(snake[i].x,snake[i].y);
 	SnakeLen=7;
 	

}
//-----------------------------------------------------------------------------------
void	put_bug(void)
{
	data int i,ch;
re_find:
	do{
		ch =rand()%76;
       }while((ch<=L_SHEET || ch>=R_SHEET)|| 0==(ch&0x01));
       bug_x=ch;
       do{
		ch =rand()%24;
       }while(ch<=T_SHEET || ch>=B_SHEET);
	for(i=0;snake[i].x!=0;i++)
	{
		if(ch==snake[i].y && bug_x==snake[i].x)
 			goto re_find;
	}
       bug_y=ch;
       put_block(bug_x,bug_y);
}
//-----------------------------------------------------------------------------------
bit	flash_snake(unsigned char dir1)
{
	data	unsigned char x0,y0,i,j;


	if(dir1==1) dir1=direct;
	else
	{
		if(direct == ~dir1)	dir1=direct;
 		else	direct=dir1;
 		
	}
	switch(dir1)
	{
	case UP:
		y0=snake[0].y-1;
 		x0=snake[0].x;
		break;
	case DOWN:
		y0=snake[0].y+1;
 		x0=snake[0].x;
		break;
	case LEFT:
		x0=snake[0].x-2;
 		y0=snake[0].y;
		break;
	case RIGHT:
		x0=snake[0].x+2;
 		y0=snake[0].y;
		break;
	}
      	if(	(y0<=T_SHEET)|| (y0>=B_SHEET)||	(x0<=L_SHEET)||(x0>=R_SHEET))return(0);
      		
	for(i=0;snake[i].x!=0;i++)
	{
		if(x0==snake[i].x && y0==snake[i].y) return(0);
 	}
 	hide_block(x0,y0);
 	put_block(x0,y0);
	hide_block(snake[i-1].x,snake[i-1].y);
 	if(bug_x==x0 && bug_y==y0)
 	{
 		SnakeLen++;
  		GameScore +=(SnakeLen*5 + Level*3);
		if((SnakeLen%15)==0 && Level<16) Level++;
 		snake[i].x=snake[i-1].x;
 		snake[i].y=snake[i-1].y;
  		snake[i+1].x=0;
    		i++;
    		
		for(j=0;snake[j].x!=0;j++)
 		{
  			hide_block(snake[j].x,snake[j].y);
      			put_block(snake[j].x,snake[j].y);
      	 		delay(0x200);
  		}
   		put_bug();
  	}

	while(--i)	snake[i]=snake[i-1];
	snake[0].x=x0;
	snake[0].y=y0;
	flashed=1;
	return(1);
}
//-----------------------------------------------------------------------------------
void	put_block(char x,char y)
{
	gotoxy(x,y);
	fputstr("▓");
	delay(100);
}
//-----------------------------------------------------------------------------------
void	hide_block(char x,char y)
{
	gotoxy(x,y);
	fputstr("  ");
}
//-----------------------------------------------------------------------------------
bit	kbhit(void)
{
	return(RI_1);
}
//-----------------------------------------------------------------------------------
void	putstr(char xdata*str)
{
	while(*str)
	{
		putch(*str++);
	}
}
//-----------------------------------------------------------------------------------
void	flash_data(void)
{
	gotoxy(L_SHEET+sizeof("High Score: "),2);
	sprintf(print_buf,"%-10ld",HighScore);putstr(print_buf);
	gotoxy(L_SHEET+sizeof("High Score: "),3);
	sprintf(print_buf,"%-10ld",GameScore);putstr(print_buf);
	gotoxy(L_SHEET+30+sizeof("Tuched: "),2);
	sprintf(print_buf,"%3d",SnakeLen);putstr(print_buf);
	gotoxy(L_SHEET+30+sizeof("Tuched: "),3);
	sprintf(print_buf,"%3d",(int)(char)Level);putstr(print_buf);

}
//-----------------------------------------------------------------------------------
void	type_kbd(char code *str)
{
	data int ch,i=0;
	
	type_flag=1;
	flashed=1;
	while( (ch=str[i]) !=0)
	{
		if(kbhit()) break;
		if(TimerEnd)
		{
 			TimerEnd=0;
  			putch(ch);
  			if(ch=='\n') fputstr("\r    ");
      			i++;
  		}
   		clr_wchdog();
	}
	type_flag=0;
}
//-----------------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -