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

📄 tcs.c

📁 贪吃蛇在arm版上的运行
💻 C
字号:
#include <unistd.h>#include <stdlib.h>#include <stdio.h>#include <fcntl.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#include <sys/mman.h>#include <string.h>#include <linux/fb.h>#include <linux/kd.h>#include <sys/mman.h>#include <sys/types.h>#include <sys/stat.h>#include <termios.h>#include <sys/time.h>#include <sys/ioctl.h>

#include "keyboard_up.h"
#include "lcd.h"
#include "ascii.lib"

#define N 200
#define LEFT '4'
#define RIGHT '6'
#define DOWN '2'
#define UP '8'
#define ESC '0'#define EVERY_GRADE 20

int i;int k = EVERY_GRADE;char key;
int score=0;			/*得分*/
int gamespeed=0;	/*游戏速度自己调整*/
struct Food
{
   int x;				/*食物的横坐标*/
   int y;				/*食物的纵坐标*/
   int yes;				/*判断是否要出现食物的变量*/
}food;					/*食物的结构体*/
struct Snake
{
   int x[N];
   int y[N];
   int node;			/*蛇的节数*/
   int direction;		/*蛇移动方向*/
   int life;			/* 蛇的生命,0活着,1死亡*/
}snake;

void Init(void);		/*图形驱动*/
void SelectGrade(void);	/*选择关卡*/
/*显示英文字符*/
void DrawCharEN(short x, short y, unsigned char c, ColorType color);
void Close(void);		/*图形结束*/
void DrawK(void);		/*开始画面*/
void GameOver(void);	/*结束游戏*/
void GamePlay(void);	/*玩游戏具体过程*/
void PrScore(void);		/*输出成绩*/
void NextGrade(){	int x,y;	char str[20] = "Next level,Press 0.";	while (1){		x = 261;		y = 240;		for (i = 0; i < strlen(str); i++){
			DrawCharEN(x, y, str[i], SYS_WHITE);
			x += 8;
		}
		key = get_key();		//if(key == 'n') continue;
		if (key == '0'){			gamespeed -= 10000;			if(gamespeed < 10000) {				strcpy(str,"All level passed.");				x = 261;				y = 240;				for (i = 0; i < strlen(str); i++){
					DrawCharEN(x, y, str[i], SYS_WHITE);
					x += 8;
				}				Close();			}			k += EVERY_GRADE;
			break;
		}		
	}	fb_Clear(SYS_BLACK);
	DrawK();				/*开始画面*/	GamePlay();}void DrawCharEN(short x, short y, unsigned char c, ColorType color)
{
	unsigned char codes[16];
	short i;

	for (i = 0; i < 16; i++)
		codes[i] = ascii_codes[c][i];
	
	fb_Text_8x16(x, y, codes, color);
}

void SelectGrade()
{
	char str[30];
	int tmp = 5;	int x,y;
	/*初始化*/
	fb_Init();	
	kbd_init();	key = 'n';
	while (1){
		/*获取键盘*/
		fb_FillRect(200,100,500,400,SYS_BLACK);		//if(key == 'n') continue;
		if (key == '2' && tmp >= 1){
			tmp --;
		}
		if (key == '8' && tmp < 8){
			tmp ++;
		}
		if (key == '0'){
			break;
		}		sprintf(str,"Select grade: %d",tmp);		x = 261;		y = 240;		for (i = 0; i < strlen(str); i++){
			DrawCharEN(x, y, str[i], SYS_WHITE);
			x += 8;
		}		key = get_key();
	}
	gamespeed = (10 - tmp) * 10000;
}
/*主函数*/
void main(void)
{
	SelectGrade();	fb_Clear(SYS_BLACK);
	DrawK();				/*开始画面*/
	GamePlay();				/*玩游戏具体过程*/
	Close();				/*图形结束*/
}

/*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/
void DrawK(void)
{
	for(i=50;i<=600;i+=10){							/*画围墙*/
		fb_FillRect(i,40,i+10,49,SYS_WHITE);		/*上边*/
		fb_FillRect(i,451,i+10,460,SYS_WHITE);		/*下边*/
	}
	for(i=40;i<=450;i+=10){
		fb_FillRect(50,i,59,i+10,SYS_WHITE);		/*左边*/
		fb_FillRect(601,i,610,i+10,SYS_WHITE);		/*右边*/
	}
}
/*玩游戏具体过程*/
void GamePlay(void)
{
	food.yes=1;										/*1表示需要出现新食物,0表示已经存在食物*/
   	snake.life=0;									/*活着*/
   	snake.direction=1;								/*方向往右*/
   	snake.x[0]=100;snake.y[0]=100;					/*蛇头*/
   	snake.x[1]=110;snake.y[1]=100;
   	snake.node=2;									/*节数*/
   	PrScore();										/*输出得分*/
   	while(1){										/*可以重复玩游戏,压ESC键结束*/
      		while((key = get_key()) == 'n'){		/*在没有按键的情况下,蛇自己移动身体*/
				if(food.yes==1){							/*需要出现新食物*/
      				food.x=rand()%400+60;
      				food.y=rand()%350+60;
      				while(food.x%10!=0)				/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/
  					food.x++;
      				while(food.y%10!=0)
  					food.y++;
  				food.yes=0;							/*画面上有食物了*/
  				}
				if(food.yes==0){					/*画面上有食物了就要显示*/
              		fb_FillRect(food.x,food.y,food.x+10,food.y-10,GREEN);
  				}
				for(i=snake.node-1;i>0;i--){		/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/
            			snake.x[i]=snake.x[i-1];
     				snake.y[i]=snake.y[i-1];
  				}
       			/*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/
  				switch(snake.direction){
     				case 1:snake.x[0]+=10;break;
     				case 2: snake.x[0]-=10;break;
     				case 3: snake.y[0]-=10;break;
     				case 4: snake.y[0]+=10;break;
  				}
				/*从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来*/
  				for(i=3;i<snake.node;i++){
     				if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0]){
               			GameOver();					/*显示失败*/
               			snake.life=1;
               			break;
     				}
        		}
				if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55|| snake.y[0]>455){/*蛇是否撞到墙壁*/
     				GameOver();						/*本次游戏结束*/
     				snake.life=1;					/*蛇死*/
 				}
 				if(snake.life==1)						/*以上两种判断以后,如果蛇死就跳出内循环,重新开始*/
           			break;
 				if(snake.x[0]==food.x&&snake.y[0]==food.y)/*吃到食物以后*/{
           			fb_FillRect(food.x,food.y,food.x+10,food.y-10,SYS_BLACK);
    				snake.x[snake.node]=-20;snake.y[snake.node]=-20;
          			/*新的一节先放在看不见的位置,下次循环就取前一节的位置*/
    				snake.node++;					/*蛇的身体长一节*/
    				food.yes=1;						/*画面上需要出现新的食物*/
    				score+=10;				PrScore();					if(score == k) NextGrade();
    									/*输出新得分*/
 				}
 				for(i=0;i<snake.node;i++)
    				fb_FillRect(snake.x[i],snake.y[i],snake.x[i]+10,snake.y[i]-10,SYS_WHITE);
 				usleep(gamespeed);
 				fb_FillRect(snake.x[snake.node-1],snake.y[snake.node-1],snake.x[snake.node-1]+10,snake.y[snake.node-1]-10,SYS_BLACK);
     		}  /*endwhile(get_key)*/			printf("keypress=%c\n", key);
    		if(snake.life==1)						/*如果蛇死就跳出循环*/
        		break;
    		if(key==ESC)							/*按ESC键退出*/
       			break;
    		else if(key==UP&&snake.direction!=4)
			/*判断是否往相反的方向移动*/
   			snake.direction=3;
       		else if(key==RIGHT&&snake.direction!=2)
      			snake.direction=1;
   			else if(key==LEFT&&snake.direction!=1)
  				snake.direction=2;
      		else if(key==DOWN&&snake.direction!=3)
     			snake.direction=4;
	}/*endwhile(1)*/
}
/*游戏结束*/
void GameOver(void)
{	int i = 0;	int x,y;	unsigned char * ascTxt1 = "GameOver,retry? Y(1)/N(0)"; 	x = 200;	y = 200;	PrScore();	for (i = 0; i < strlen(ascTxt1); i++){
		DrawCharEN(x, y, ascTxt1[i], SYS_WHITE);
		x += 8;
	}	while (1){
		/*获取键盘*/
		key = get_key();		//if(key == 'n') continue;
		if (key == '0'){			fb_Clear(SYS_BLACK);			Close();
			break;
		}
		if (key == '1'){
			fb_Clear(SYS_BLACK);
			DrawK();				/*开始画面*/			score = k - EVERY_GRADE;
			GamePlay();				/*玩游戏具体过程*/
		}		
	}
}
/*输出成绩*/
void PrScore(void)
{  	int x,y; 
   	unsigned char  str[20] = "";
	unsigned char  info[30] = "Welcome to play TCS game of wangyoang.";	fb_FillRect(0,15,640,35,SYS_BLACK);
	x = 55;
	y = 10;
	for (i = 0; i < strlen(info); i++){
		DrawCharEN(x, y, info[i], SYS_WHITE);
		x += 8;
	}
   	sprintf(str,"score:%d",score);	x = 55;	y = 20;	for (i = 0; i < strlen(str); i++){
		DrawCharEN(x, y, str[i], SYS_WHITE);
		x += 8;
	}
}
/*图形结束*/
void Close(void)
{  
	//fb_Clear(SYS_BLACK);		/*清屏*/	kbd_close();				/*关闭键盘*/
	fb_Release();				/*关闭显示*/
   	 exit(0);
}

⌨️ 快捷键说明

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