基于正点原子战舰开发板的贪吃蛇游戏
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; } } }
相关文章推荐
- 5分钟弄懂Docker!
- Oracle 学习笔记 11 -- 视图 (VIEW)
- 实习笔试题,源代码编译
- java中queue的使用
- 树莓派日记之 GPIO
- 《练手_快排的实现》
- Less语言特性
- webservice SOAP WSDL UDDI
- Spark—聚合操作—combineByKey
- c:forEach的varStatus属性
- 百分点技术负责人:我们为什么需要大数据操作系统
- 使用node的http模块实现爬虫功能,并把爬到的数据存入mongondb
- NSOJ 畅通工程(并查集)
- LeetCode 15 3Sum(尺取法或哈希)
- Java贪心算法: 田忌赛马
- Oracle Study之-AIX6.1构建Oracle 10gR2 RAC(1)
- Java --- HashMap的四种循环遍历方式及性能对比
- web开发者的博客
- L6-js定时器的应用
- leetcode——292—— Nim Game