在线时间0 小时
UID383682
注册时间2012-8-28
NXP金币0
该用户从未签到
新手上路

- 积分
- 70
- 最后登录
- 1970-1-1
|
【开战Kinetis , .分享有礼】分析 月下听蝉之贪吃蛇游戏&后续俄罗斯方块
最近月下听蝉童心未昧,用K10搞起了贪吃蛇,怀念一下童年经典游戏之余,也学习一下制作游戏的简单过程,下面我来发发观看过程,有兴趣的可以玩玩哈```
先来介绍一下游戏框架
u8 key; //全局变量用于获取蛇的移动方向,通过TSI模块引出的4个电容按键
typedef enum //定义表示方向的枚举变量
{
left, right, up, down
}DIR;
//定义一个结构体表示坐标
typedef struct
{
int x;
int y;
}COOR;
//定义结构体,来存储食物的相关信息
struct FOOD
{
COOR crd; //食物出现的坐标
int flag; //食物的状态,1表示食物还没被吃,0表示食物被吃了
}food;
//定义结构体,来存储蛇的相关信息
struct SNAKE
{
COOR crd[1000]; //保存蛇的每个结数的坐标,最多有1000节
int node; //保存蛇当前节数
DIR dir; //当前蛇行进的方向
}snake;
游戏整体过程的介绍:
int main(void)
{
DelayInit();
TSI_Init(); //开启TSI按键
SPILCD_Init(); //初始化SPILCD
init(); //游戏初始化
while(1)
{
if (!food.flag)
{
setfoodcrd(); //食物坐标设置
}
SPILCD_nod(food.crd.x, food.crd.y);//显示食物
judgesef(); //判断是否吃到食物
snakemove();// 移动
DelayMs(300);
changeskdir(); //改变移动方向
gameover(); //失败检测
}
}
详细解释:
void init() //初始化
{
SPILCD_DrawRectangle(3,4,124,155);//屏幕坐标定格 相当于校准游戏边框
SPILCD_DrawRectangle(0,0,127,159); //屏幕坐标定格 相当于校准边框
snake.crd[0].x = 20 + 1; //两节蛇身
snake.crd[0].y = 20;
snake.crd[1].x = 20;
snake.crd[1].y = 20;
snake.node = 2;
snake.dir = right;
key=0;
food.flag = 0;
}
void setfoodcrd() //随机产生食物坐标
{
food.crd.x = rand() % 40;
food.crd.y = rand() % 50;
food.flag = 1;
}
//9点作为一节
void SPILCD_nod(u16 x1,u16 y1)
{
if(x1=0; i--) //从头到尾画蛇
{
SPILCD_nod(snake.crd.x, snake.crd.y); //9点作为一节
}
//清除上次蛇的末节 形成行动效果
SPILCD_clear_nod(snake.crd[snake.node].x, snake.crd[snake.node].y);
}
void changeskdir() //判断移动方向
{
switch(key)
{
case 1:
if (snake.dir != up)snake.dir = down;break;
case 2:
if (snake.dir != down)snake.dir = up;break;
case 3:
if (snake.dir != right)snake.dir = left;break;
case 4:
if (snake.dir != left)snake.dir = right;break;
}
}
void gameover() //结束游戏
{
char str[30];
u8 flag_gameover=0;
u16 i;
for(i=snake.node-1; i>0; i--)
{
//只要蛇头跟蛇身的任意一部分坐标重叠就挂了```
if(snake.crd.x == snake.crd[0].x&&snake.crd.y == snake.crd[0].y)
{
flag_gameover=1;
break;
}
}
//蛇头出界结束游戏
if(snake.crd[0].y49||snake.crd[0].x>39||snake.crd[0].xSTATUS & 0x0000FFFF);
if(TSI_ReadBit(TSIStatues,TSI_KEY1_CH)&&TSI_ReadBit(Status,TSI_KEY1_CH))
{
key = 1;
}
if(TSI_ReadBit(TSIStatues,TSI_KEY2_CH)&&TSI_ReadBit(Status,TSI_KEY2_CH))
{
key = 2;
}
if(TSI_ReadBit(TSIStatues,TSI_KEY3_CH)&&TSI_ReadBit(Status,TSI_KEY3_CH))
{
key = 3;
}
if(TSI_ReadBit(TSIStatues,TSI_KEY4_CH)&&TSI_ReadBit(Status,TSI_KEY4_CH))
{
key = 4;
}
TSIStatues=~Status; //记录上次状态
TSI0->GENCS |= TSI_GENCS_OUTRGF_MASK; //清超出阀值标志位
TSI0->GENCS |= TSI_GENCS_EOSF_MASK; //清扫描结束标志位
TSI0->STATUS = 0xFFFFFFFF;//清零标志
NVIC_EnableIRQ(TSI0_IRQn);//开中断
}
TSI的工作原理可参考以下链接:http://www.21ic.com/app/power/201208/138774.htm
完整工程代码请于月下听蝉的贴子下载:https://www.nxpic.org.cn/bbs/article_891_515121.html
月下听蝉贪吃蛇游戏效果:https://v.youku.com/v_show/id_XNDU4NDM2Nzg0.html
接下来我也想搞一下俄罗斯方块玩玩,敬请期待````
|
|