STM32之贪吃蛇游戏

1.硬件平台

  • STM32开发板
  • 0.96寸OLED屏(SPI接口)

2.示例效果

基于STM32贪吃蛇游戏

3.软件设计

 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<<line;else oled_gram[page][x]&=~(1<<line);
}

 3.2 绘制贪吃蛇单个节点
  蛇身单个节点大小为4*4矩形填充。

/*绘制贪吃蛇单个节点*/
static void OLED_DrawSnake(u8 x,u8 y,u8 c)
{u16 i;u8 x0=x;for(i=0;i<4*4;i++){OLED_DrawPoint(x0,y,c);x0++;if(x0-x==4){x0=x;y++;}}
}

 3.3绘制贪吃蛇整个蛇身

//保存节点坐标结果体
struct SNAKE
{u8 x;//节点x坐标u8 y;//节点y坐标
};
struct SNAKE snake_info[50];//蛇节点最多50个
static u8 node_cnt=0;//蛇身长度
}
/*绘制蛇身节点个数
struct SNAKE *buff --保存蛇身节点结构体指针
cnt  --蛇身节点个数
c -- 1为绘制,0为取消绘制
*/
static void OLED_DrawSnakebody(struct SNAKE *buff,u8 cnt,u8 c)
{u8 i=0;for(i=0;i<cnt;i++){OLED_DrawSnake(buff[i].x,buff[i].y,c);}
}

 3.4判断食物位置坐标

/**************判断实物位置***************
**
**判断新生成的实物x坐标是否落在蛇身上
**形参:u8 x --实物光标位置
**      cnt  --蛇身节点个数
**返回值:1 --落在蛇身上,0 -- 没有
*******************************************/
static u8 OLED_GetSnakeFoodX(u8 x,u8 cnt)
{u8 i=0;for(i=0;i<cnt;i++){if(x==snake_info[i].x)break;}if(i==cnt)return 0;else return 1;
}
/**************判断实物位置***************
**
**判断新生成的实物y坐标是否落在蛇身上
**形参:u8 y --实物光标位置
**      cnt  --蛇身节点个数
**返回值:1 --落在蛇身上,0 -- 没有
*******************************************/
static u8 OLED_GetSnakeFoodY(u8 y,u8 cnt)
{u8 i=0;for(i=0;i<cnt;i++){if(y==snake_info[i].y)break;}if(i==cnt)return 0;else return 1;
}

 3.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<node_cnt-1;i++)//节点往前偏移{snake_info[i].x= snake_info[i+1].x;snake_info[i].y=snake_info[i+1].y;}/*蛇头节点坐标*/snake_info[node_cnt-1].x=x;  snake_info[node_cnt-1].y=y;OLED_DrawSnake(snake_info[node_cnt-1].x,snake_info[node_cnt-1].y,1);//显示蛇头节点
}

 3.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);//绘制矩形//创建蛇身1snake_info[node_cnt].x=x;snake_info[node_cnt].y=y;node_cnt++;//创建蛇身2snake_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;
}

 3.7 主函数

int main()
{LED_Init();//LED初始化USARTx_Init(USART1,115200,72);TIMx_Init(TIM2,72,20000);//定时器辅助串口1接收,计数一个周期时间为20msKEY_Init();//按键初始化EXTI_Init();Beep_Init();//蜂鸣器初始化OLED_Init();srand(1);//生成随机数种子AA:SnakeGameStart();while(1){if(key_val)//按任意键继续游戏{OLED_ClearGram();//清空缓冲区OLED_Refresh();//更新数据到屏幕key_val=0;goto AA;}}
}




  工程示例:https://download.csdn.net/download/weixin_44453694/20021273

STM32之贪吃蛇游戏相关推荐

  1. 【STM32单片机】贪吃蛇游戏设计

    文章目录 一.主要功能 二.硬件资源 1.硬件准备 2.硬件连接 四.软件设计 1.软件结构 2.主要代码 五.实验现象 联系作者 一.主要功能 系统运行后,TFTLCD触摸屏显示游戏界面,通过按键任 ...

  2. 基于STM32的贪吃蛇小游戏

    基于STM32的贪吃蛇小游戏 初学32一个月,学的并不多,便想着做一个贪吃蛇小游戏,因为有51单片机做贪吃蛇的经验,所以实现出来并不困难. 作品简介 游戏面版将在4.3寸480*800)液晶上显示,初 ...

  3. Java项目:贪吃蛇游戏(java+swing)

    源码获取:博客首页 "资源" 里下载! 功能简介: 贪吃蛇游戏 大嘴鱼洁面类.完成大嘴鱼的界面的绘制: /*** 大嘴鱼洁面类.完成大嘴鱼的界面的绘制.*/ public clas ...

  4. Python制作当年第一款手机游戏-贪吃蛇游戏(练习)

    前言: 文章利用Python pygame做一个贪吃蛇的小游戏而且讲清楚每一段代码是用来干嘛的. 据说是贪吃蛇游戏是1976年,Gremlin公司推出的经典街机游戏,那我们今天用Python制作的这个 ...

  5. java贪吃蛇不能回头,儿时回忆!泪流满面,Java 实现贪吃蛇游戏的示例(附代码)...

    image.png image.png java实现贪吃蛇游戏需要创建一个桌面窗口出来,此时就需要使用java中的swing控件 创建一个新窗口 JFrame frame = new JFrame(& ...

  6. 手把手教你使用 Python 制作贪吃蛇游戏

    贪吃蛇游戏是有史以来最受欢迎的街机游戏之一.在这个游戏中,玩家的主要目标是在不撞墙或不撞墙的情况下抓住最大数量的水果.在学习 Python 或 Pygame 时,可以将创建蛇游戏视为一项挑战.这是每个 ...

  7. 利用python实现简易版的贪吃蛇游戏(面向python小白)

    前言 这篇文章主要给大家介绍了关于如何利用python实现简易版的贪吃蛇游戏的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学 ...

  8. jquery实现上下左右键盘监听_python 使用pygame工具包实现贪吃蛇游戏(多彩版)

    今天我们用python和python的工具包pygame来编写一个贪吃蛇的小游戏 贪吃蛇游戏功能介绍 贪吃蛇的游戏规则如下: 通过上下左右键或者WASD键来移动蛇来,让它吃到食物,每吃到食物,蛇的长度 ...

  9. python小游戏代码大全-python贪吃蛇游戏代码

    本文实例为大家分享了python贪吃蛇游戏的具体代码,供大家参考,具体内容如下 贪吃蛇游戏截图: 首先安装pygame,可以使用pip安装pygame: pip install pygame 运行以下 ...

最新文章

  1. java initcause_Java 异常
  2. 智慧城市丨智能时代的城市设计新策略
  3. python3怎么使用pyrex_Win Python Pyrex 扩展
  4. 织梦配置多个mysql_一台机器,多个mysqld服务
  5. 4.4. Config file
  6. new 一个结构体数组_每天一个IDA小技巧(四):结构体识别
  7. 复制集配置文件linux,mongodb的复制集实现
  8. 深度学习项目-人脸表情识别
  9. leetcode 上的Counting Bits 总结
  10. maven 可执行 jar_Maven提示:有关可执行jar的所有信息
  11. java json 返回null,[] Spring4 MVC 返回json格式时候 设置不返回null值属性的有关问题...
  12. varnish-cache使用
  13. matlab采集网口数据,使用Signal Tap II采集到的数据进行Matlab仿真(转载)
  14. Python之程序执行时间计算
  15. LeetCode动态规划系列教程(上)
  16. LightMapping和LightProbe
  17. 容器监控cadvisor
  18. This relative module was not found: Error: Can‘t resolve ‘../assets/bg.jpg‘
  19. github上关于iOS的各种开源项目集合 (转载)
  20. 个人支付宝h5支付源码,即时到个人账户

热门文章

  1. 制作自己的图片数据集(附代码)
  2. 【CTSC2016】时空旅行
  3. 【面试准备】MySQL索引篇
  4. iOS10全新方法实现推送+deviceToken无法获取或无效的解决
  5. 2 Sets HDD200 Drilling Mud Recycling System for CPP
  6. 【一个故事讲完https】聊聊https的诞生
  7. 小米air2se耳机只有一边有声音怎么办_2020高颜值游戏低延迟蓝牙耳机,高音质听声辨位非这五款蓝牙耳机莫属...
  8. 金属结构保温板的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  9. 在线下载离线地图瓦片 (支持百度、高德和谷歌地图)
  10. 详解 C/C++ 各大编程规范