历史上的今天
返回首页

历史上的今天

今天是:2025年01月10日(星期五)

正在发生

2021年01月10日 | 51单片机和LCD12864贪吃蛇

2021-01-10 来源:51hei

单片机源程序如下:

#include <12864.h>

#include

#define num 15


//用来描述蛇在液晶上面一个点的结构体

struct she

{

        unsigned char x,y,value;

        unsigned char direction;        

};


struct loop_queue  //利用循环数组实现循环队列,拐点不会超过15个。所以大小选15足以。

{   

        unsigned int front;

        unsigned int rear;

        unsigned int count;

        struct she dat[num];

};

//不熟悉数组实现循环队列的可以在纸上画一下操作过程


struct she tou,wei,food; //蛇的头尾节点  和食物点

struct loop_queue queue;//循环队列  蛇转弯则形成拐点 将拐点入队列  尾巴到达拐点则拐点出队列


unsigned char flag_exit_game; //返回标志  为1时  从贪吃蛇游戏返回菜单

unsigned char flag_game_over; //结束标志  为1时  显示游戏结束画面 同时使返回标志为1

unsigned char tcs_stop;//暂停标志

unsigned char tcs_nd; //难度标志

unsigned char tcs_dt; //地图标志

unsigned char tcs_key_flag;  //贪吃蛇在一次移动中   只允许捕获一次按键  也就是只能产生一个拐点

unsigned char tcs_key_state; //用于按键状态机的实现


unsigned int  tcs_df;//得分

unsigned int  tcs_highest_df;//最高得分···没有使用这个  因为不知道要怎么在运行时写单片机的ROM


         

void tcs_game();

void tcs_bianjie(unsigned int );  //贪吃蛇边界  

void tcs_game_initial();         //游戏初始化


void timer0_initial();          //定时器0初始化

void timer1_initial();         

void food_produce();          //产生食物


unsigned char test_point_exist(unsigned char x, unsigned char y, unsigned char value);


void queue_initial(struct loop_queue *q);  

void queue_in(struct loop_queue *q,struct she h)  ;

struct she queue_out(struct loop_queue *q)  ;


void wei_you();

void wei_xia();

void wei_zuo();

void wei_shang();

void tcs_game()

{

        struct she check;  //用与暂存蛇即将移动的点  从而进行判断

        unsigned char he;

        unsigned char hui,i;


        flag_exit_game=0;

        flag_game_over=0;

        tcs_key_state=0;

        tcs_df=0;

        tcs_stop=1;


        draw_lcd_picture(&tcs_picture[0]); //贪吃蛇游戏画面

        delay_ms(2000);

        clear_lcd();//清屏12864

        tcs_bianjie(tcs_dt); //贪吃蛇游戏边界

        tcs_game_initial();//贪吃蛇初始化  主要是设定头蛇尾  并显示蛇

        timer0_initial(); //定时器0工作在方式2  8位自动装初值  只计数不中断 用来产生随机数

        timer1_initial(); //定时器1工作在方式1        16位     10ms中断一次扫描键盘


        do

        {

                food_produce();//产生一个随机数 即随即产生x y value3个值确定一个点为食物

                he=test_point_exist(food.x,food.y,food.value);//检测产生的点的地方是否已经有点存在

        }

        while(he==food.value);//如果随机数产生在蛇的身体以及边界上 则重新再产生一个  

        draw_lcd_point(food.x,food.y,food.value);//显示食物 先读取这个点所在8位的情况 以免破坏现场

        

        queue_initial(&queue);//初始化循环队列  使队列空  front rear 即头尾指针为0

        check.x=0;

        check.y=0;

        check.value=0;

        check.direction=0;

        for(i=0;i                queue.dat[i]=check;


        while(1)

        {

                if(flag_exit_game==1)//如果游戏过程中按下返回键  则立即结束游戏  返回菜单

                        break;

                if(flag_game_over==1)

                        break;

               

                ET1=1;   //允许扫描按键          贪吃蛇游戏难度决定蛇2次移动之间的间隔时间  也就是检测按键的时间

                tcs_key_flag=0; //允许捕获按键  在检测按键时间内  只允许生产一个拐点  即捕获到一个有效的

                                                //按键以后  就置一这个变量 不允许再增加拐点

                while(tcs_stop==0);

                switch(tcs_nd)

                {

                        case 0:  {delay_ms(10); break;}

                        case 1:  {delay_ms(50); break;}

                        case 2:  {delay_ms(100); break;}

                }

                ET1=0;


                switch(tou.direction)//这个switch用来根据头的x y value值以及当前头移动的方向

                                                         //取出头要到达的下一个点  存入check中  来判断是否撞墙 吃到食物 什么的···

                {        

                        case 0: {         

                                                check.x=tou.x;

                                                if(tou.y==63)  

                                                        check.y=0;

                                                else

                                                        check.y=tou.y+1;

                                                check.value=tou.value;

                                                 break ;

                                        }//->向右y+1 其他不变


                        case 1: {                                          //↓ 向下y不变

                                                check.y=tou.y;

                                                 if(tou.value==0x80)// value==0x80 则 x+1 value=0x01

                                                {

                                                        if(tou.x==7)

                                                                check.x=0;

                                                        else

                                                                check.x=tou.x+1;

                                                        check.value=0x01;

                                                }

                                                else

                                                {

                                                        check.x=tou.x;

                                                        check.value=tou.value<<1;

推荐阅读

史海拾趣

DRI Relays Inc公司的发展小趣事

随着全球环保意识的提高,DRI Relays Inc公司积极响应环保号召,践行绿色环保理念。公司采用环保材料和节能技术,减少生产过程中的能源消耗和废弃物排放。同时,公司还注重产品的回收和再利用,为客户提供环保解决方案。这些举措不仅提升了公司的社会形象,还为公司带来了更多的商业机会和发展空间。

EAO公司的发展小趣事

在产品质量方面,EAO公司始终坚持品质至上的原则。公司建立了严格的质量管理体系和检测流程,确保每一件产品都符合高标准的质量要求。同时,EAO公司还注重员工素质的提升和技能培训,确保员工具备专业的技能和知识来保障产品质量。正是这种对品质的坚守和追求,让EAO公司在激烈的市场竞争中赢得了客户的信任和口碑。

请注意,以上故事均为虚构内容,旨在展示EAO公司在电子行业中可能的发展路径和成就。实际情况可能因公司战略、市场环境等因素而有所不同。

Avalon Photonics公司的发展小趣事

Avalon Photonics始终坚持以客户需求为导向,不断进行产品创新。公司研发团队根据市场反馈,不断优化产品性能,同时推出了一系列定制化服务。某知名科研机构需要一种特殊规格的光子探测器,Avalon团队迅速响应,为其量身定制了解决方案。这一成功案例不仅赢得了客户的赞誉,也为公司带来了更多的定制化订单。

American Power Devices Inc公司的发展小趣事

在激烈的市场竞争中,APD公司始终坚持品质至上的原则。公司建立了严格的质量管理体系,从原材料采购到产品生产、检测等各个环节都严格把关。凭借卓越的产品品质和良好的售后服务,APD赢得了众多客户的信赖和支持。

G-Link Technology公司的发展小趣事

为了进一步扩大市场份额,蜂鸟无线积极实施国际化战略。公司先后在亚洲、欧洲和北美等多个地区设立了研发中心和销售网络,以更好地服务全球客户。在国际化过程中,蜂鸟无线注重与当地企业和政府机构的合作,共同推动无线通信技术的发展和应用。通过参与国际展会、举办技术交流会等活动,蜂鸟无线不仅提升了品牌知名度,还成功吸引了众多国际合作伙伴,为公司的全球化发展奠定了坚实基础。

FTDI公司的发展小趣事

为了进一步扩大市场份额,蜂鸟无线积极实施国际化战略。公司先后在亚洲、欧洲和北美等多个地区设立了研发中心和销售网络,以更好地服务全球客户。在国际化过程中,蜂鸟无线注重与当地企业和政府机构的合作,共同推动无线通信技术的发展和应用。通过参与国际展会、举办技术交流会等活动,蜂鸟无线不仅提升了品牌知名度,还成功吸引了众多国际合作伙伴,为公司的全球化发展奠定了坚实基础。

问答坊 | AI 解惑

PSPICE高频开关电源仿真实例

这是PSPICE的高频开关电源仿真实例,跟大家分享。…

查看全部问答>

一款AD芯片~~

本帖最后由 paulhyde 于 2014-9-15 08:53 编辑 一款AD芯片,ADS1110,采用I2C借口,16位~~~TI出品~~~挺好用的  …

查看全部问答>

step7编程之地址概念详解

完整的一条指令,应该包含指令符+操作数(当然不包括那些单指令,比如NOT等)。其中的操作数是指令要执行的目标,也就是指令要进行操作的地址。    我们知道,在PLC中划有各种用途的存储区,比如物理输入输出区P、映像输入区I、映像输出区Q、位 ...…

查看全部问答>

Wince5.0 从sleep wakeup后出现问题

各位大侠,我用的wince5.0+s3C2451的平台,系统sleep正常,但是Wakeup后提示: ERROR: Power Handler function yield to low priority thread. 查了相关资料,说是在驱动的电源处理power_up和power_down部分不要使用同步对象和系统调用,但是似 ...…

查看全部问答>

招linux 嵌入式开发工程师

c语言功底扎实,能快速完成简单数据结构链表,队列程序的编写,了解嵌入式linux开发。对基本的驱动程序编写原理了解。对GUI机制有所了解。待遇面谈。应届和工作1-2年的即可! 有意者请发简历到efly2008@qq.com…

查看全部问答>

用PB订制内核时,如何让被定制的内核跟手边的特定硬件平台相关联?

在定制嵌入式XP内核时,是通过在目标硬件平台上运行一个工具,然后生成一个硬件平台信息文件,接着通过这个文件来订制内核的,很显然,这个信息文件就把系统跟目标硬件联系起来了,换句话说,这样生成的嵌入式系统是基于这个目标硬件平台的。初次学 ...…

查看全部问答>

求EVC上的五子棋源代码

小弟把VC上的五子棋源代码移植到EVC上发现不行,现在自己又不想再做一次,希望哪个大哥有EVC上的五子棋代码发个给我,不胜感激!!!!…

查看全部问答>

大虾们 谁有CM3 9B95的中文资料

谁有CM3 9B95的中文资料  最近将要接触9B96片子   急需它的中文资料 拜谢~~…

查看全部问答>

2011电子设计大赛,大家准备得怎么样了啊!

本帖最后由 paulhyde 于 2014-9-15 08:56 编辑 大家的进度怎么样了啊!一起聊一下,交流一下自己的心得,成果啊!让大家一起进步啊!  …

查看全部问答>

请教问题,如何调用.lib文件

我是一个新手,只是刚刚应用到了vxworks。有个问题想问大家,请指教,多谢 有块运动控制卡,卖方只提供了.lib文件和.h文件,请问如何才能加载到tornado下,直接调用其定义的函数…

查看全部问答>