📄 main.c
字号:
void GamePlay(void)
{
uint32 i;
snake.life=0;
snake.direction=1;
snake.x[0]=0;snake.y[0]=6; //蛇头
snake.x[1]=1;snake.y[1]=6;
snake.node=2; //节数
food.x=7;
food.y=6;
DrawBeanSnake(food.x,food.y);
food.yes=1;
PrintScore(112,54,score);
while(1)
{
if(food.yes==0)
{
food.x=food.x+3;
food.y++;
if(food.x>17)
food.x=0;
if(food.y>9)
food.y=0;
DrawBeanSnake(food.x,food.y);
food.yes=1;
}
if(food.yes==1)//避免豆子显示在蛇身上而使豆子被清掉
{
DrawBeanSnake(food.x,food.y);
}
for(i=snake.node-1;i>0;i--)
{
snake.x[i]=snake.x[i-1];
snake.y[i]=snake.y[i-1];
}
switch(snake.direction)
{
case 1:snake.x[0]+=1;break;
case 2:snake.x[0]-=1;break;
case 3:snake.y[0]-=1;break;
case 4:snake.y[0]+=1;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]>17||snake.y[0]>9) //判断蛇是否撞到墙
{
GameOver();
snake.life=1;
}
if(snake.life==1) //如果蛇死就跳出循环,重新开始
break;
for(i=0;i<snake.node;i++) //画蛇
DrawBeanSnake(snake.x[i], snake.y[i]);
OSTimeDly(GameSpeed);
if(snake.x[0]==food.x&&snake.y[0]==food.y) //吃到食物后
{
food.yes=0;
snake.node++;
score+=1;
PrintScore(112,54,score);
}
ClearSnake(snake.x[snake.node-1], snake.y[snake.node-1]); //清除蛇的最后一节
/*if(key==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==LIFT&&snake.direction!=1)
snake.direction=2;
else if(key==DOWN&&snake.direction!=3)
snake.direction=4;*/
}//END while
}
/****************************************************************************
* 名称:IniPicture()
* 功能:游戏开始时屏幕的边框初始化
*
* 入口参数:无
* 出口参数:无
* 说明:无
****************************************************************************/
void IniGamePicture(void)
{
GUI_Initialize();
GUI_PutHZ(125-12, 0, (uint8 *)tan0, 16, 16); //边上显示"贪吃蛇"
GUI_PutHZ(125-12, 16, (uint8 *)chi0, 16, 16);
GUI_PutHZ(125-12, 32, (uint8 *)she0, 16, 16);
GUI_Rectangle(0,0,125-13,63,2); //画边界框
DrawBeanSnake(0,6);
DrawBeanSnake(1,6);
}
/****************************************************************************
* 名称:IniDesignInformation()
* 功能: 显示设计者信息
*
* 入口参数:无
* 出口参数:无
* 说明:无
****************************************************************************/
void IniDesignInformation(void)
{
uint32 i=1;
GUI_PutHZ(i*18, 0, (uint8 *)huang0,16, 16); //黄石理工学院 设计者 周义
i++;
GUI_PutHZ(i*18, 0, (uint8 *)shi0, 16, 16);
i++;
GUI_PutHZ(i*18, 0, (uint8 *)li0, 16, 16);
i++;
GUI_PutHZ(i*18, 0, (uint8 *)gong0, 16, 16);
i++;
GUI_PutHZ(i*18, 0, (uint8 *)xue0, 16, 16);
i++;
GUI_PutHZ(i*18, 0, (uint8 *)yuan0, 16, 16);
i=2;
GUI_PutHZ(i*18, 18, (uint8 *)she4, 16, 16);
i++;
GUI_PutHZ(i*18, 18, (uint8 *)ji0, 16, 16);
i++;
GUI_PutHZ(i*18, 18, (uint8 *)zhe0, 16, 16);
i=3;
GUI_PutHZ(i*18, 36, (uint8 *)zhou0, 16, 16);
i++;
GUI_PutHZ(i*18, 36, (uint8 *)yi0, 16, 16);
OSTimeDlyHMSM(0,0,0,50);
}
/****************************************************************************
* 名称:GUI_PutHZ_Gai()
* 功能: GUI_PutHZ修改版,坐标(0,0)到(8,4)
*
* 入口参数:x
* y
* dat
* 出口参数:无
* 说明:无
****************************************************************************/
void GUI_PutHZ_Gai(uint32 x, uint32 y, uint8 *dat)
{
//GUI_PutHZ(x*16, y*16, *dat, 16, 16);
}
/****************************************************************************
* 名称:LedInit()
* 功能: Led口的输入输出定义
*
* 入口参数:无
* 出口参数:无
* 说明:无
****************************************************************************/
void LedInit(void)
{
PINSEL0=0x00000000;
PINSEL1=0x00000000;
IODIR=0xffffffff;
IOSET=LED1;
IOSET=LED2;
IOSET=LED3;
}
/****************************************************************************
* 名称:LedInit()
* 功能: Led口的输入输出定义
*
* 入口参数:无
* 出口参数:无
* 说明:无
****************************************************************************/
void KeyInit(void)
{
PINSEL0=0x00000000;
PINSEL1=0x00000000;
IODIR =0xe83fffff;
}
/****************************************************************************
* 名称: main()
* 功能: 初始化uC/OS-II操作系统,建立第一个任务,然后启动系统。
****************************************************************************/
int main(void)
{
OSInit ();
OSTaskCreate(Task0, (void *)0, &TaskStk[TaskStkLengh - 1], 10);
OSTaskCreate(TaskLed1, (void *)0, &TaskLed1Stk[TASK_STK_SIZE - 1], 30);
OSTaskCreate(TaskLed2, (void *)0, &TaskLed2Stk[TASK_STK_SIZE - 1], 35);
OSTaskCreate(TaskLed3, (void *)0, &TaskLed3Stk[TASK_STK_SIZE - 1], 31);
OSStart ();
return 0;
}
/*********************************************************************************************************
** Task0 任务0
** 功能:主任务,游戏的显示任务
********************************************************************************************************/
void Task0(void *pdata)
{
pdata = pdata;
TargetInit ();
LedInit();
GUI_Initialize(); // 初始化LCM
GUI_SetColor(1, 0); // 设置前景色和背景色
OSTimeDly(10);
IniDesignInformation();
OSTimeDly(10);
IniGamePicture();
GamePlay();
while (1)
{
OSTimeDly(10);
}
}
/*********************************************************************************************************
** TaskLed1 任务1
** 功能:LED闪烁任务,显示操作系统的运行状况
********************************************************************************************************/
void TaskLed1(void *pdata)
{
pdata=pdata;
TargetInit();
LedInit();
while(1)
{
IOSET=LED2;
OSTimeDlyHMSM(0,0,0,50);
IOCLR=LED2;
//OSTaskSuspend(5);
OSTimeDlyHMSM(0,0,0,50);
}
while(1);
}
/*********************************************************************************************************
** TaskLed2 任务2
** 功能:键盘扫描任务
********************************************************************************************************/
void TaskLed2(void *pdata)
{
//POSMSG pMsg;
pdata=pdata;
TargetInit();
KeyInit();
while(1)
{
if((IO0PIN&KEY_UP)==0)
{
OSTimeDlyHMSM(0,0,0,5);
if((IO0PIN&KEY_UP)==0)
{
snake.direction=3;
IOSET=LED2;
while((IO0PIN&KEY_UP)==0);
}
}
if((IO0PIN&KEY_DOWN)==0)
{
OSTimeDlyHMSM(0,0,0,5);
if((IO0PIN&KEY_DOWN)==0)
{
snake.direction=4;
IOCLR=LED2;
while((IO0PIN&KEY_DOWN)==0);
}
}
if((IO0PIN&KEY_LIFT)==0)
{
OSTimeDlyHMSM(0,0,0,5);
if((IO0PIN&KEY_LIFT)==0)
{
snake.direction=2;
while((IO0PIN&KEY_LIFT)==0);
}
}
if((IO0PIN&KEY_RIGHT)==0)
{
OSTimeDlyHMSM(0,0,0,5);
if((IO0PIN&KEY_RIGHT)==0)
{
snake.direction=1;
while((IO0PIN&KEY_RIGHT)==0);
}
}
//pMsg=OSCreateMessage(0,(snake.direction+1),snake.direction>>16);
//if(pMsg)
// SendMessage(pMsg);
OSTimeDlyHMSM(0,0,0,5);
}//end while
while(1);
}
/*********************************************************************************************************
** TaskLed3 任务3
** 功能:LED闪烁任务,显示操作系统的运行状况
********************************************************************************************************/
void TaskLed3(void *pdata)
{
//uint8 txmsg;
uint32 j;
//txmsg = 'A';
pdata=pdata;
TargetInit();
LedInit();
while(1)
{
for(j=0;j<=2;j++)
{
IOSET=LED3;
OSTimeDlyHMSM(0,0,0,50);
IOCLR=LED3;
OSTimeDlyHMSM(0,0,0,50);
}
//OSMboxPost(TxMbox,(void *)&txmsg);
}
while(1);
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -