stm32贪吃蛇代码c语言,STM32实现贪吃蛇
本帖最后由 akwkevin2011 于 2012-7-14 14:47 编辑
STM32学习笔记二 竹天笑
呵呵,界面非常简单
要点:1、触摸屏校准信息保存在SD卡,不必每次开机都校准。(读写SD卡,请参阅野火SD的教程,触摸屏校准信息保存在SD卡,请参阅定点原子SD的教程。)
2、随机函数的实现,一般都是用定时器实现随机种子,我用的是时钟实现随机种子。(请百度随机函数。)
3、蛇的算法。(自己想的,可能有BUG,蛇是一个数组,每次移动时候,头移动,尾消去,中间的不变。)
4、触摸按键的实现。(按键检测本来想放在外部中断中(触摸中断),但是发现怎么也搞不定,最后只好放在延时程序中,求大神指教。)
5、测试用:截屏函数的实现。(请参照野火SD的教程,本人用的是红牛三代的屏,如果屏要读屏数据点的话,初始化的读数据时序要放长一些,不然会读出花点,如果只是显示,那么写时序可以短一点。)
6、画界面:界面的范围是x:0-239,y:0-239。由于蛇点的大小是4*4个像素点组成,因此,将坐标缩小到x/y:0-59。除去外框0和59,因此蛇可以出现的位置是x/y:1-58。同样随机点(是不是应该称为食物?)出现的位置是x/y:1-58。
废话少说,还是直接上程序。
随机函数:
uint8_t rand_dot(void)
{
uint8_t r;
srand(RTC_GetCounter()); //产生随机种子,实现真正的随机函数,如果没有此句就是伪随机函数。
r=rand()%58+1;//将随机函数产生点的范围放到1-58
return r;
}
RTC的初始化是固定格式,不在此处贴出。
画点函数:(将一个点扩展成4*4,另外除去四个角上的点,就类似于圆形了。)
void My_DrawPoint(uint8_t x,uint8_t y)
{
uint8_t i;
GUI_SetPenSize(1);
for(i=0;i<2;i++)
{
GUI_DrawPoint(x*4+i+1,y*4);
}
for(i=0;i<4;i++)
{
GUI_DrawPoint(x*4+i,y*4+1);
}
for(i=0;i<4;i++)
{
GUI_DrawPoint(x*4+i,y*4+2);
}
for(i=0;i<2;i++)
{
GUI_DrawPoint(x*4+i+1,y*4+3);
}
}
全局参数
#define snake_MaxLength 20//最大长度
int8_t snake_xDiv=1;//0上,0下,-1左,1右
int8_t snake_yDiv=0;//-1上,1下,0左,0右
uint8_t snake_OK;//确定
uint8_t snake_Length=1;//蛇的长度,初始化为1
uint8_t xPos[snake_MaxLength];//存蛇每个数据点的x轴坐标
uint8_t yPos[snake_MaxLength];//存蛇每个数据点的y轴坐标
uint8_t i,flag;//标志量
uint8_t rand_x,rand_y;//随机点的坐标
uint16_t snake_Speed=1000;//蛇的速度,延时函数的参数:1000最慢,100最快
uint8_t snake_Score=0;//分数
//注意,防止数据截断,u8:0-255,有正有负时要用符号。一不小心就出错了。
初始化界面的参数:
#define countof(Array) (sizeof(Array)/sizeof(Array[0]))
//画外框,从x:0-239,y:0-239,外框厚度4.
const GUI_POINT aPoints[]={{0,0},{239,0},{239,239},{0,239}};
const GUI_POINT bPoints[]={{1,1},{238,1},{238,238},{1,238}};
const GUI_POINT cPoints[]={{2,2},{237,2},{237,237},{2,237}};
const GUI_POINT dPoints[]={{3,3},{236,3},{236,236},{3,236}};
//画按键,按键大小长20,宽20.
const GUI_POINT aButtons[]={{0,0},{20,0},{20,20},{0,20}};
初始化界面:
void snake_Init(void)
{
GUI_SetBkColor(GUI_RED);
GUI_SetColor(GUI_YELLOW);
GUI_Clear();
GUI_SetPenSize(1);
//画外框
GUI_DrawPolygon(aPoints,countof(aPoints),0,0);
GUI_DrawPolygon(bPoints,countof(bPoints),0,0);
GUI_DrawPolygon(cPoints,countof(cPoints),0,0);
GUI_DrawPolygon(dPoints,countof(dPoints),0,0);
GUI_SetColor(GUI_BLUE);
//画分数
GUI_SetFont(&GUI_FontHZ_SimSun_16);
GUI_DispStringAt("分数:",250,20);
GUI_DispDec(snake_Score,3);
//画速度
GUI_DispStringAt("速度:",250,40);
switch(snake_Speed)//将速度参数转化成习惯显示形式
{
case 1000:GUI_DispString("1");break;
case 900:GUI_DispString("2");break;
case 800:GUI_DispString("3");break;
case 700:GUI_DispString("4");break;
case 600:GUI_DispString("5");break;
case 500:GUI_DispString("6");break;
case 400:GUI_DispString("7");break;
case 300:GUI_DispString("8");break;
case 200:GUI_DispString("9");break;
case 100:GUI_DispString("10");break;
}
//画按键
GUI_FillPolygon(aButtons,countof(aButtons),270,155);//上
GUI_FillPolygon(aButtons,countof(aButtons),245,180);//左
GUI_FillPolygon(aButtons,countof(aButtons),295,180);//右
GUI_FillPolygon(aButtons,countof(aButtons),270,205);//下
GUI_FillPolygon(aButtons,countof(aButtons),270,180);//确认
//初始化蛇出现的点
xPos[0]=29;
yPos[0]=29;
GUI_SetColor(GUI_YELLOW);
My_DrawPoint(xPos[snake_Length-1],yPos[snake_Length-1]);
//开始按钮
while(1)
{
delay_ms(10);
if(snake_OK==1)
{
snake_OK=0;
break;
}
}
//随机食物的点,不能出现在蛇身上
rand_x=rand_dot();
rand_y=rand_dot();
i=0;
while(i<1)
{
if(rand_x==xPos[0]&&rand_y==xPos[0])
{
flag=1;//如果出现在蛇身上,重新取点
}
i++;
if(flag==1)
{
rand_x=rand_dot();//重新取点
rand_y=rand_dot(); //重新取点
flag=0; //标志量清零
i=0;
}
}
GUI_SetColor(GUI_BLUE);
My_DrawPoint(rand_x,rand_y);
}
//延时函数:请参照定点原子的systick的例程。
void delay_ms(uint16_t nms)
{
uint32_t temp = delay_fac_ms * nms;
if (temp > 0x00ffffff)
{
temp = 0x00ffffff;
}
SysTick_SetReload(temp); /* 时间加载 */
SysTick_CounterCmd(SysTick_Counter_Clear); /* 清空计数器 */
SysTick_CounterCmd(SysTick_Counter_Enable); /* 开始倒数 */
do
{
//将按键检测放在延时循环中
if(touch_flag == 1) /*如果触笔按下了*/
{
if(getDisplayPoint(&display, Read_Ads7846(), &matrix )!=DISABLE)
{
Move_Div(display.x,display.y);//按键检测程序
}
}
//
Status = SysTick_GetFlagStatus(SysTick_FLAG_COUNT);
}while (Status != SET); /* 等待时间到达 */
SysTick_CounterCmd(SysTick_Counter_Disable); /* 关闭计数器 */
SysTick_CounterCmd(SysTick_Counter_Clear); /* 清空计数器 */
}
按键检测程序
void Move_Div(uint16_t Xpos,uint16_t Ypos)
{
if(Xpos>=270&&Xpos<=290&&Ypos>=155&&Ypos<=175)//上
{
snake_xDiv=0;
snake_yDiv=-1;
}
else if(Xpos>=245&&Xpos<=265&&Ypos>=180&&Ypos<=200)//左
{
snake_xDiv=-1;
snake_yDiv=0;
}
else if(Xpos>=295&&Xpos<=315&&Ypos>=180&&Ypos<=200)//右
{
snake_xDiv=1;
snake_yDiv=0;
}
else if(Xpos>=270&&Xpos<=290&&Ypos>=205&&Ypos<=225)//下
{
snake_xDiv=0;
snake_yDiv=1;
}
else if(Xpos>=270&&Xpos<=290&&Ypos>=180&&Ypos<=200)//确定
{
snake_OK=1;
}
}
主程序:
int main(void)
{
TP_Init(); //触摸屏初始化
delay_init();//延时初始化
GUI_Init();//UCGUI初始化
FSMC_Configuration();//读触摸屏初始化
RTC_Init();//时钟初始化
while(TouchPanel_Calibrate()!=0);//触摸屏校准,只需一次校准即可。参数存在SD卡中。
snake_Init();//界面初始化
while(1)
{
//如果蛇吃到了食物
if(((xPos[snake_Length-1]+snake_xDiv)==rand_x)&&((yPos[snake_Length-1]+snake_yDiv)==rand_y))
{
snake_Length++;//长度增加
xPos[snake_Length-1]=xPos[snake_Length-2]+snake_xDiv;//新增加的蛇点
yPos[snake_Length-1]=yPos[snake_Length-2]+snake_yDiv;
GUI_SetColor(GUI_YELLOW);
My_DrawPoint(xPos[snake_Length-1],yPos[snake_Length-1]);
rand_x=rand_dot();//产生新的食物
rand_y=rand_dot();
i=0;
while(i
{
if(rand_x==xPos&&rand_y==xPos)
{
flag=1;
}
i++;
if(flag==1)
{
rand_x=rand_dot();
rand_y=rand_dot();
flag=0;
i=0;
}
}
GUI_SetColor(GUI_BLUE);
My_DrawPoint(rand_x,rand_y);
snake_Score++;//分数增加
GUI_SetColor(GUI_WHITE);
GUI_SetFont(&GUI_FontHZ_SimSun_16);
GUI_DispStringAt("分数:",250,20);//显示分数
GUI_DispDec(snake_Score,3);
if(snake_Length==snake_MaxLength)//过关长度
{
GUI_SetColor(GUI_WHITE);
GUI_SetFont(&GUI_Font6x8);
GUI_DispStringAt("Passed",100,110);
delay_ms(5000);
switch(snake_Speed)//速度增加
{
case 1000:snake_Speed=900;break;
case 900:snake_Speed=800;break;
case 800:snake_Speed=700;break;
case 700:snake_Speed=600;break;
case 600:snake_Speed=500;break;
case 500:snake_Speed=400;break;
case 400:snake_Speed=300;break;
case 300:snake_Speed=200;break;
case 200:snake_Speed=100;break;
case 100:snake_Speed=1000;break;
}
snake_Length=1;//重置蛇长度
snake_Init();//界面初始化
}
}
else
{
flag=0;//置蛇没撞物体标志量
if((xPos[snake_Length-1]+snake_xDiv>58)||(xPos[snake_Length-1]+snake_xDiv<1)||(yPos[snake_Length-1]+snake_yDiv>58)||(yPos[snake_Length-1]+snake_yDiv<1))//判断蛇有没有撞墙
{
flag=1;
}
for(i=0;i
{ //if((xPos[snake_Length-1]+snake_xDiv==xPos)&&(yPos[snake_Length-1]+snake_yDiv==yPos))
if(((xPos[snake_Length-1]+snake_xDiv)==xPos)&&((yPos[snake_Length-1]+snake_yDiv)==yPos))
{
flag=1;
}
}
GUI_SetColor(GUI_RED);
My_DrawPoint(xPos[0],yPos[0]);
for(i=0;i
{
xPos=xPos[i+1];
yPos=yPos[i+1];
}
xPos[snake_Length-1]=xPos[snake_Length-1]+snake_xDiv;//蛇头移动
yPos[snake_Length-1]=yPos[snake_Length-1]+snake_yDiv;
GUI_SetColor(GUI_YELLOW);
My_DrawPoint(xPos[snake_Length-1],yPos[snake_Length-1]);
if(flag==1)//如果撞到物体,重新开始
{
GUI_SetColor(GUI_WHITE);
GUI_SetFont(&GUI_Font6x8);
GUI_DispStringAt("Game Over",100,110);
while(1)
{
delay_ms(10);
if(snake_OK==1)
{
snake_OK=0;
break;
}
}
snake_Speed=1000;
snake_Score=0;
snake_Length=1;
snake_Init();
}
}
if(snake_OK==1)//截屏函数,测试用。
{
snake_OK=0;
Screen_shot(0, 0, 320, 240, "/myScreen");//截屏函数,参照野火LCD教程。
}
delay_ms(snake_Speed);//延时,也就是速度。
}
}
程序包下载地址:http://115.com/file/c2c7dh9p#
UCGUI_贪吃蛇.rar
说明文档下载地址:http://115.com/file/c2c7du8a#
STM32实现贪吃蛇.doc
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
stm32贪吃蛇代码c语言,STM32实现贪吃蛇相关推荐
- 贪吃蛇c加加代码_C语言实现的贪吃蛇小游戏
学习完C语言基础后,当然要做点小东西来巩固一下知识啦~~,之前做的学生信息管理系统是比较小的,搞定之后决定还是做个贪吃蛇的小游戏,这是学习C语言的经典入门小程序,下面简单地说下用C语言开发这个需要用到 ...
- c语言字符蛇代码,C语言实现贪吃蛇代码
本文实例为大家分享了C语言实现贪吃蛇代码的具体代码,供大家参考,具体内容如下 #include"stdafx.h" #include #include #include #incl ...
- 贪吃的猴子c语言的思路,贪吃的猴子(贪吃的猴子?C语言)
洛奇贪吃的猴子什么时候出现 还有特定时间吗..?不是在凯利营地那边的火山温泉里..?和几只普通的温泉猴子在一起.基本每个泉坑都有. 硬要说个时间的话..周四中午1点多的时候看到过.. 不知道是不是限时 ...
- bat贪吃蛇游戏代码_C语言写个贪吃蛇游戏
贪吃蛇是个非常经典的游戏,用C语言来实现也是一个好玩的事情.这个游戏我写完后放在知乎,竟然点赞的人数超级多.我觉得大家喜欢,一个方面是因为写得简单,大家都能看得懂,一个可扩展性还是非常强的. 我试了说 ...
- 贪吃蛇面向对象c语言,面向对象案例——贪吃蛇游戏(示例代码)
最近项目上线,近一个星期没更博了,今天来写一个经典的游戏案例--贪吃蛇.在这个简单的案例里可以体会javaScript 面向对象开发相关模式,学习使用面向对象的方式分析问题. 1.功能实现 1.1 搭 ...
- 贪吃蛇代码c语言改分,刚学C语言,想写一个贪吃蛇的代码
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include #include #include typedef struct snake { int a; int b; stru ...
- 贪吃蛇代码c 语言,刚学C语言,想写一个贪吃蛇的代码
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include #include #include typedef struct snake { int a; int b; stru ...
- java贪吃蛇代码idea_IntelliJ idea使用笔记 - 贪吃蛇学院-专业IT技术平台
从eclipse切换到Idea有一周时间了,真真实实感受到了idea的强大,我曾经想从eclipse切换到idea,因为使用习惯的问题放弃了,这次狠下心使用了一周,慢慢熟悉了这个强大的开发工具.在此记 ...
- 基于stm32、0.96寸OLED实现的贪吃蛇小游戏(详细源码注释)
简介:本实验基于stm32最小系统.0.96寸OLED(68*128)和摇杆实现一个经典的贪吃蛇小游戏.项目源码地址:点击下载. 硬件设计: 普通摇杆,0.96寸OLED 单色屏幕(SPI协议通讯), ...
最新文章
- python中的set类型
- python除号的乘法加括号_乘除法添加括号规则
- Flink 1.11 SQL 十余项革新大揭秘,哪些演变在便捷你的使用体验?
- java期末项目实验答辩毕业设计工程项目源码
- python爬虫之---------------cookie和session
- Codeforces Beta Round #97 (Div. 1) C. Zero-One 数学
- java fork join demo_Fork/Join框架 demo
- 欠薪的公司,不要做任何犹豫!
- 别人改出了新BUG,怎么看?
- 【干货】移动APP测试用例设计实践经验分享
- 聚合支付系统如何开发?
- ajax日期格式,ajax读取的日期的格式转换
- 计算机网络-网络安全
- 全球与中国粒子测量系统市场现状及未来发展趋势
- 使用 Parity 建立Proof-of-Authority (PoA) Ethereum Chain
- 【Python全栈测试开发实战1】搭建测试开发环境
- Kubernetes pod的生命周期
- 一个困扰程序员很多年的问题:微服务领域SpringCloud这么火,为何还要学习SpringCloud Alibaba?
- 【每日进步一点点】C语言刷题技巧及训练1
- 书单分享:阅读应该是一种享受