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

下午搞了一个贪吃蛇游戏,基本原子战舰开发板,通过外接游戏手柄控制蛇前进的方向以及速度。
主函数代码:

#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;
        }

    } 
}
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值