您的位置:首页 > 其它

基于正点原子战舰开发板的贪吃蛇游戏

2016-03-22 18:32 621 查看
下午搞了一个贪吃蛇游戏,基本原子战舰开发板,通过外接游戏手柄控制蛇前进的方向以及速度。

主函数代码:

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"
#include "stdio.h"
#include <string.h>
#include "joypad.h"

void gameover(void)
{
LCD_Clear(WHITE);
POINT_COLOR=BLUE;
LCD_ShowString(lcddev.width/2-100,lcddev.height/2-50,200,24,24,"Game Over!");
delay_ms(10000);
NVIC_SystemReset();
}
void victory(void)
{
LCD_Clear(WHITE);
POINT_COLOR=GREEN;
LCD_ShowString(lcddev.width/2-100,lcddev.height/2-50,200,24,24,"SB!PEFECT!");
delay_ms(10000);
NVIC_SystemReset();
}
int main(void)
{
u8 i,j,direction=0;
vu8 key=0;
u8 key1;
u8 speed=50;
u32 node=3;
u8 lcd_id[12];          //存放LCD ID字符串
static u16 x[10],y[10],foodx[10],foody[10];
foodx[3]=200;foody[3]=200;
foodx[4]=240;foody[4]=240;
foodx[5]=280;foody[5]=280;
foodx[6]=320;foody[6]=320;
foodx[7]=120;foody[7]=120;
foodx[8]=160;foody[8]=160;
foodx[9]=160;foody[9]=40;
x[2]=40;x[1]=80;x[0]=120;
y[2]=40;y[1]=40;y[0]=40;

delay_init();            //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(115200);      //串口初始化为115200
LED_Init();              //LED端口初始化
LCD_Init();
KEY_Init();
JOYPAD_Init();          //手柄初始化
POINT_COLOR=RED;
sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);//将LCD ID打印到lcd_id数组。
LCD_DrawLine(10, 10, lcddev.width-10, 10);
LCD_DrawLine(10, 10, 10, lcddev.height -10);
LCD_DrawLine(10, lcddev.height -10, lcddev.width-10, lcddev.height -10);
LCD_DrawLine(lcddev.width -10, 10, lcddev.width-10, lcddev.height -10);
LCD_DrawLine(10, lcddev.height -150, lcddev.width-10, lcddev.height -150);
LCD_Fill(10,lcddev.height -150,lcddev.width -10,lcddev.height -10,BLACK);
LCD_Fill(0,0,lcddev.width -10,10,RED);
LCD_Fill(0,0,10,lcddev.height -10,RED);
LCD_Fill(0,lcddev.height -10,lcddev.width,lcddev.height,RED);
LCD_Fill(lcddev.width -10,0,lcddev.width,lcddev.height,RED);
POINT_COLOR=WHITE;
LCD_ShowString(40,lcddev.height -130,200,24,24,"Score:");
LCD_ShowString(40,lcddev.height -80,200,24,24,"Code by Rex-Pi");
POINT_COLOR=RED;
while(1)
{
LCD_Fill(foodx[node]-20,foody[node]-20,foodx[node]+20,foodx[node]+20,RED);
for(i=3;i<node;i++)
{
if(x[i]==x[0]&&y[i]==y[0])
{
gameover();
break;
}
}
if((x[0]==foodx[node])&&(y[0]==foody[node]))
{
LCD_Fill(foodx[node]-20,foody[node]-20,foodx[node]+20,foodx[node]+20,WHITE);
node++;
if(node==9)
{
victory();
break;
}
LCD_Fill(foodx[node]-20,foody[node]-20,foodx[node]+20,foodx[node]+20,RED);
}
else if((x[0]<=10)||(x[0]>=lcddev.width-10)||(y[0]<=10)||(y[0]>=lcddev.height-150))
{
gameover();
break;
}
POINT_COLOR=GREEN;
LCD_ShowxNum(110,lcddev.height -130,node-3,2,24,0);
POINT_COLOR=RED;
LCD_Fill(11,11,lcddev.width-11,lcddev.height -151,WHITE);
for(j=0;j<node;j++)
{
LCD_Draw_Circle(x[j],y[j],20);
}
delay_ms(speed);
if (direction)
{
for(i=node-1;i>0;i--)
{
x[i]=x[i-1];
y[i]=y[i-1];
}
}
key=KEY_Scan(0);
switch(key)
{       case WKUP_PRES: //上
direction=4;
break;
case KEY1_PRES: //下
direction=3;
break;
case KEY2_PRES: //左
direction=2;
break;
case KEY0_PRES: //右
direction=1;
break;
}
key1=JOYPAD_Read();
switch(key1)
{       case 0x10:  //上
direction=4;
break;
case 0x20:  //下
direction=3;
break;
case 0x40:  //左
direction=2;
break;
case 0x80:  //右
direction=1;
break;
case 0x01:
speed+=10;
break;
case 0x02:
speed-=10;
break;
}
switch(direction)
{
case 0:
break;
case 1:
x[0]+=40;break;
case 2:
x[0]-=40;break;
case 3:
y[0]+=40;break;
case 4:
y[0]-=40;break;
}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: