本帖最后由 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实现贪吃蛇相关推荐

  1. 贪吃蛇c加加代码_C语言实现的贪吃蛇小游戏

    学习完C语言基础后,当然要做点小东西来巩固一下知识啦~~,之前做的学生信息管理系统是比较小的,搞定之后决定还是做个贪吃蛇的小游戏,这是学习C语言的经典入门小程序,下面简单地说下用C语言开发这个需要用到 ...

  2. c语言字符蛇代码,C语言实现贪吃蛇代码

    本文实例为大家分享了C语言实现贪吃蛇代码的具体代码,供大家参考,具体内容如下 #include"stdafx.h" #include #include #include #incl ...

  3. 贪吃的猴子c语言的思路,贪吃的猴子(贪吃的猴子?C语言)

    洛奇贪吃的猴子什么时候出现 还有特定时间吗..?不是在凯利营地那边的火山温泉里..?和几只普通的温泉猴子在一起.基本每个泉坑都有. 硬要说个时间的话..周四中午1点多的时候看到过.. 不知道是不是限时 ...

  4. bat贪吃蛇游戏代码_C语言写个贪吃蛇游戏

    贪吃蛇是个非常经典的游戏,用C语言来实现也是一个好玩的事情.这个游戏我写完后放在知乎,竟然点赞的人数超级多.我觉得大家喜欢,一个方面是因为写得简单,大家都能看得懂,一个可扩展性还是非常强的. 我试了说 ...

  5. 贪吃蛇面向对象c语言,面向对象案例——贪吃蛇游戏(示例代码)

    最近项目上线,近一个星期没更博了,今天来写一个经典的游戏案例--贪吃蛇.在这个简单的案例里可以体会javaScript 面向对象开发相关模式,学习使用面向对象的方式分析问题. 1.功能实现 1.1 搭 ...

  6. 贪吃蛇代码c语言改分,刚学C语言,想写一个贪吃蛇的代码

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include #include #include typedef struct snake { int a; int b; stru ...

  7. 贪吃蛇代码c 语言,刚学C语言,想写一个贪吃蛇的代码

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include #include #include typedef struct snake { int a; int b; stru ...

  8. java贪吃蛇代码idea_IntelliJ idea使用笔记 - 贪吃蛇学院-专业IT技术平台

    从eclipse切换到Idea有一周时间了,真真实实感受到了idea的强大,我曾经想从eclipse切换到idea,因为使用习惯的问题放弃了,这次狠下心使用了一周,慢慢熟悉了这个强大的开发工具.在此记 ...

  9. 基于stm32、0.96寸OLED实现的贪吃蛇小游戏(详细源码注释)

    简介:本实验基于stm32最小系统.0.96寸OLED(68*128)和摇杆实现一个经典的贪吃蛇小游戏.项目源码地址:点击下载. 硬件设计: 普通摇杆,0.96寸OLED 单色屏幕(SPI协议通讯), ...

最新文章

  1. python中的set类型
  2. python除号的乘法加括号_乘除法添加括号规则
  3. Flink 1.11 SQL 十余项革新大揭秘,哪些演变在便捷你的使用体验?
  4. java期末项目实验答辩毕业设计工程项目源码
  5. python爬虫之---------------cookie和session
  6. Codeforces Beta Round #97 (Div. 1) C. Zero-One 数学
  7. java fork join demo_Fork/Join框架 demo
  8. 欠薪的公司,不要做任何犹豫!
  9. 别人改出了新BUG,怎么看?
  10. 【干货】移动APP测试用例设计实践经验分享
  11. 聚合支付系统如何开发?
  12. ajax日期格式,ajax读取的日期的格式转换
  13. 计算机网络-网络安全
  14. 全球与中国粒子测量系统市场现状及未来发展趋势
  15. 使用 Parity 建立Proof-of-Authority (PoA) Ethereum Chain
  16. 【Python全栈测试开发实战1】搭建测试开发环境
  17. Kubernetes pod的生命周期
  18. 一个困扰程序员很多年的问题:微服务领域SpringCloud这么火,为何还要学习SpringCloud Alibaba?
  19. 【每日进步一点点】C语言刷题技巧及训练1
  20. 书单分享:阅读应该是一种享受

热门文章

  1. 语义鸿沟、异构鸿沟、数据缺失,多模态技术如何跨过这些坎?
  2. 百度网盘Mac版如何生成链接分享和密码?Mac版创建百度网盘分享链接的方法
  3. 一个有趣的配色方案在线生成工具
  4. pandas 第十章 时序数据
  5. JAVA毕业设计WEB儿童运动馆业务信息系统计算机源码+lw文档+系统+调试部署+数据库
  6. 打包ios程序成ipa
  7. 微服务架构下的分布式数据存储-技术之家
  8. 这 6 款在线 PDF 转换工具,得试
  9. css sprites介绍
  10. 视联网四方面优势引领行业技术