📄 tcs.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 + -