采用STM32核心板制作贪吃蛇小游戏

硬件平台:stm32核心板、oled显示(spi接口)、按键
实现功能:
    1.绘制蛇身,通过随机数生成食物;
    2.按键控制运动方向,完成上下左右控制和加速控制;
    3.游戏结束判断:当蛇头碰到上下左右墙壁或者碰到蛇身则游戏结束,可按任意键重新开始;
    4.得分统计,每吃到一颗食物则+1积分,知道游戏结束;
实现原理:
    1.完成按键驱动,用户控制蛇行动方向;
    2.完成oled驱动,实时刷新蛇行动轨迹和食物位置;
    3.创建蛇身结构体信息,设置初始蛇身长度,每吃到一个食物结构体成员+1,蛇身变长,可通过链表实现或结构体数组实现;
实物效果:
    1.设置初始蛇身和生成实物
    2.按键控制运动方向
3.游戏结束提示和得分统计
软件设计:
      1.oled底层画点函数实现,用户绘制蛇身和食物
static u8 oled_gram[8][128];//屏幕缓冲区void oled_drawpoint(u8 x,u8 y,u8 c){ u8 page=y/8;//y坐标值在第几页 u8 line=y%8;//在当前页的第几行上 if(c)oled_gram[page][x]|=1    2.蛇身绘制,每个蛇身节点为4*4矩形填充
/*绘制贪吃蛇单个节点*/static void oled_drawsnake(u8 x,u8 y,u8 c){ u16 i; u8 x0=x; for(i=0;i 4.食物坐标判断,计算是否吃到食物
/**************判断实物位置*******************判断新生成的实物x坐标是否落在蛇身上**形参:u8 x --实物光标位置** cnt --蛇身节点个数**返回值:1 --落在蛇身上,0 -- 没有*******************************************/static u8 oled_getsnakefoodx(u8 x,u8 cnt){ u8 i=0; for(i=0;i;i++)>     5.移动蛇身
/*******************动态移动蛇身********************************/static void snake_move(u8 x,u8 y){ u8 i=0; oled_drawsnake(snake_info[0].x,snake_info[0].y,0);//清除蛇尾 for(i=0;i;i++)>    6.开始游戏,控制移动方向,生成实物,判断游戏是否结束,得分统计
/*******************控制方向,判断游戏是否结束********************/u8 snakegamestart(void){ u8 x=10; u8 y=30; u8 food_x,food_y; u8 stat=0; char buff[20]; oled_drawrectangle(0, 0, 127, 63);//绘制矩形 oled_drawrectangle(1, 1, 126, 62);//绘制矩形 //创建蛇身1 snake_info[node_cnt].x=x; snake_info[node_cnt].y=y; node_cnt++; //创建蛇身2 snake_info[node_cnt].x=x+5; snake_info[node_cnt].y=y; //保存蛇头坐标 x=snake_info[node_cnt].x; y=snake_info[node_cnt].y; node_cnt++; oled_drawsnakebody(snake_info,node_cnt,1);//绘制蛇身 //生成实物坐标 food_x=((rand()%115)/5)*5+5; food_y=((rand()%50)/5)*5+5; oled_drawsnake(food_x,food_y,1);//绘制实物 oled_refresh();//更新数据到屏幕 while(1) { if(snake_info[node_cnt-1].x>=125 || snake_info[node_cnt-1].y>=60)//判断是否撞墙 { snprintf(buff,sizeof(buff),mark:%d,node_cnt-2); oled_displaystr(36,8,8,16,buff);//字符串显示 oled_displaystr(10,28,12,24,game over);//字符串显示 oled_refresh();//更新数据到屏幕 key_val=0; node_cnt=0;//清空节点 break;//游戏结束 } if(snake_info[node_cnt-1].x==food_x && snake_info[node_cnt-1].y==food_y)//判断是否吃到食物 { if(stat&1<<0 || stat&1<<1)//向上或向下时y+5 { snake_info[node_cnt].x=food_x; snake_info[node_cnt].y=food_y+5; } else //向左或向右时x+5 { snake_info[node_cnt].x=food_x+5; snake_info[node_cnt].y=food_y; } node_cnt++; while(1)//保证重新生成的实物不再蛇身上 { food_x=((rand()%115)/5)*5+5; if(oled_getsnakefoodx(food_x,node_cnt)==0)break; } while(1) { food_y=((rand()%50)/5)*5+5; if(oled_getsnakefoody(food_y,node_cnt)==0)break; } oled_drawsnake(food_x,food_y,1); oled_refresh();//更新数据到屏幕 } switch(key_val) { case up://上 stat&=~(0x3<<2);//清除左右标志 if(stat&1<<1){}//向下时不能直接向上 else { stat|=1<<0;//向上 y-=5; snake_move(x,y); } break; case dowm://下 stat&=~(0x3<<2);//清除左右标志 if(stat&1<<0){}//在向上时不能直接向下 else { stat|=1<<1;//向下标志位 y+=5; snake_move(x,y); } break; case left://左 stat&=~(0x3<<0);//清除上下标志 if(stat&1<<3){}//向右时不能直接向左 else { stat|=1<<2;//向左 x-=5; snake_move(x,y); } break; case right://右 stat&=~(0x3<<0);//清除上下标志 if(stat&1<<2){}//向左时不能直接向右 else { stat|=1<<3; x+=5; snake_move(x,y); } break; } oled_refresh();//更新数据到屏幕 delay_ms(300); } return 0;} 7.主函数,硬件初始化,生成随机数种子,进入游戏


在工业4.0中大显身手的智能工业计算机
一加5最新消息:一加5发布会海报曝光确定6月15日上市发布,处理器、配置、摄像、续航、价格抢先看
Apple TV 4K拆解,与上一代 Apple TV大相径庭
任正非表示5G只是一个工具它本身就没有安全问题
如何在全新的AI时代取得胜利
采用STM32核心板制作贪吃蛇小游戏
额定电机怎么调速
联电订单大幅涌入,产能满载到明年上半年
防爆红外探测器的优势及特性
RS-485窄体隔离收发器
长芯半导体芯片研发及生产制造基地项目落户赣州经开区 总投资达10亿元
魅族在2019年有必要做的更好
Fitbit OS 5.0预装了新的Sense和Versa3
小米与摩托罗拉的隔空充电技术揭秘,辐射问题成隐忧?
SOC V2.0的Formal是什么?
汽车各种LED灯光产品的特性和优缺点分析
汽车电气接线盒的过载设计和验证方法浅析
厉害了我的华为p10,这手机玩游戏耍得溜溜溜的
Analog Devices ADCMP60x系列比较器的应用电路分析
中国移动携手华为打通首个煤矿井下5G网络,推进煤炭行业智能化升级