历史上的今天
返回首页

历史上的今天

今天是:2025年03月24日(星期一)

正在发生

2020年03月24日 | 51单片机的8x8点阵贪吃蛇

2020-03-24 来源:eefocus

如今用8x8LED点阵制作的贪吃蛇游戏在网上的源码已经多不胜数了,由于闲得蛋疼,也搞了搞,不过因为Me很懒,又穷,所以硬件就木有搞,只是用proteus仿真了一下。。。 

源码工程及仿真在这:https://pan.baidu.com/s/1i5tyOtv 

顺便也唠叨一下这个贪吃蛇的源码吧,有图有真相,上图 

 这里写图片描述

画面简单清晰明了,perfect! 

贪吃蛇游戏主要包含几个程式:画蛇、画食物、蛇行走、蛇吃食物、蛇长身体、蛇撞墙dead、蛇自杀dead。 

简约流程:界面初始化(画蛇、画食物)—->蛇行走—->蛇吃食物—->蛇长身体—->刷新显示页面 

Let’s see the program。 

在initSnake()这个函数中主要就是对蛇的一些初始化(如游戏开始时蛇在什么位置呀等等)


//****************初始化蛇、食物等***********************//

static void initSnake()

{

    //********清除内存数据**********//

    unsigned char i;

    for(i=0; i    {

        snake.x[i]=-1;

        snake.y[i]=-1;

    }


    //********蛇的一些参数初始化**********//

    snake.Long=2;   // 默认蛇的长度为2段

    snake.Life=1;   // 蛇的生命

    snake.Dir=right;

    snake.x[1]=0;   // 蛇开始时的坐标位置[0]是蛇头位置

    snake.y[1]=2;

    snake.x[0]=1;

    snake.y[0]=2;

    createFood();   // 创建食物

}


接下来就是一条行走的贪吃蛇的关键了,runSnake()函数主要是为蛇行走时坐标位置改变而做的一些处理,第一个for的作用就是·······举例吧:假如我的蛇开始时是这样的[1][0],[0]是蛇头,那么当我向右移动1格的时候,此时[1]是不是就要到[0]的位置了,而[0]则要到一个新的位置(也就是在下面的switch中重新获得的蛇头位置)。当蛇头的位置和食物的位置吻合时,也就是说吃到食物了,此时蛇的长度增长,食物也需要重新创建了。另外提一提在createFood()函数中只用了rand()来产生随机数而rand()函数产生的是一个伪随机数(每次执行同一个程序,调用rand得到的随机数序列是固定的(不是真正的“随机”,所以我们每次开始仿真是都会发现食物的位置都是和上次仿真时一样的),如果想得到真正的随机数,网上有些源码的做法就是使用定时器,调用srand(定时器计数值)设置随机数种子,从而产生随机数,不过在这里我并没有使用。


//****************蛇行走、吃食物*******************//

static void runSnake()

{

    unsigned char i;


    // 蛇要移动,坐标也会发生改变,蛇头方向坐标会逐渐向蛇尾方向移动

    for(i=snake.Long; i>0; i--)

    {   

        snake.y[i]=snake.y[i-1];

        snake.x[i]=snake.x[i-1];

    }


    // 重新获得蛇头的位置

    switch(snake.Dir)

    {   

        case up:    snake.y[0]-=1; break;

        case down:  snake.y[0]+=1; break;

        case left:  snake.x[0]-=1; break;

        case right: snake.x[0]+=1; break;

        default: break;

    }


    // 蛇吃到食物

    if(snake.x[0]==food.x && snake.y[0]==food.y)

    {

        snake.Long++;    // 长身体

        createFood();    // 只是创建食物的坐标位置

    }

}


Last,提一提这个刷新函数drawSnake(),for循环是将同一行的所有坐标点整合成一个8位的数(一行就相当于一个8位数值的二进制数,如初始化时蛇在第2行(0~7)显示的是00000011这样的一个8位数),从而可以在点阵上显示,点阵的显示是低位在前,从左到右坐标是01234567,scanDisplay(DispRAM)是将整合后的点真正地显示在点阵上,drawPoint(food.x, food.y)是真正地在点阵上画食物的点。


//********************刷新界面*******************//

static void drawSnake()

{

    unsigned char i=0;

    for(i=0; i<8; i++) DispRAM[i]=0;   //清空缓存

    for(i=0; i        DispRAM[snake.y[i]] |= 1<    scanDisplay(DispRAM);

    drawPoint(food.x, food.y);   // 食物有了坐标就可以画点了

}


Fine,还有一些其他的函数可以查看源码,应该来说是相对比较容易理解的。 

The end,Thanks!

推荐阅读

史海拾趣

AMI Semiconductor公司的发展小趣事

AMI Semiconductor,全称为Analog Mixed-Signal Interface Semiconductor,是一家在模拟、混合信号和接口领域提供集成电路解决方案的公司。以下是关于AMI Semiconductor公司发展的五个相关故事:

  1. 公司成立与初期发展:AMI Semiconductor公司成立于1966年,总部位于美国爱达荷州普克斯。公司最初专注于生产模拟集成电路和混合信号集成电路,为各种应用领域提供解决方案。在成立初期,AMI Semiconductor致力于技术创新和产品质量,赢得了客户的信任和认可。

  2. 技术创新和产品多样化:AMI Semiconductor不断进行技术创新,推出了一系列高性能、高可靠性的集成电路产品。公司的产品涵盖了模拟信号处理、数据转换、传感器接口、通信接口等多个领域,广泛应用于汽车电子、工业自动化、医疗设备等行业。

  3. 公司并购与扩张:为了拓展业务和加强市场竞争力,AMI Semiconductor进行了一系列并购和合并。这些并购使得公司能够快速扩大规模、拓展产品线,并进入新的市场领域。例如,2008年,AMI Semiconductor被ON Semiconductor收购,成为其子公司,加强了在模拟和混合信号领域的领先地位。

  4. 全球布局与市场拓展:AMI Semiconductor在全球范围内建立了广泛的销售网络和生产基地,实现了全球化发展战略。公司在美国、欧洲、亚洲等地设有研发中心、生产基地和销售办事处,为客户提供及时的技术支持和服务。这种全球布局有助于拓展市场份额,满足不同地区客户的需求。

  5. 持续创新与发展:AMI Semiconductor持续致力于技术创新和产品研发,以满足不断变化的市场需求。公司不断投入资金和人力资源,加强与客户的合作,开发定制化的解决方案,提升产品性能和竞争力。AMI Semiconductor不断追求卓越,致力于成为行业领先的模拟和混合信号集成电路供应商。

这些故事展示了AMI Semiconductor公司从成立初期到如今在技术创新、产品多样化、并购与扩张、全球布局和持续发展等方面取得的重要进展。

EECO Switch公司的发展小趣事

为了满足全球客户的需求,EECO Switch公司积极实施全球化战略。公司在墨西哥、台湾和中国等地设立了制造工厂,并在英国剑桥设立了销售办事处。这些海外机构不仅为公司提供了更广阔的市场空间,还帮助公司更好地了解当地市场的需求和趋势。展望未来,EECO Switch将继续秉承创新、质量、服务的核心价值观,致力于成为全球领先的人机界面产品提供商。

ARCOTRONICS公司的发展小趣事

ARCOTRONICS公司一直将产品质量视为企业的生命线。公司建立了严格的质量管理体系,从原材料采购到生产过程的每一个环节都进行严格把控。同时,公司还注重售后服务,为客户提供及时、专业的技术支持和解决方案。这些举措使ARCOTRONICS公司的产品赢得了客户的广泛信赖和好评。

Easy Magnet Corp公司的发展小趣事

随着环保意识的提高,Easy Magnet Corp公司开始关注产品的环保性能。公司采用环保材料和生产工艺,减少了对环境的污染。同时,公司还积极参与环保公益活动,倡导绿色消费理念。这些举措不仅提升了公司的社会形象,也吸引了更多注重环保的消费者。

Fremont_Micro_Devices_USA公司的发展小趣事

Easy Magnet Corp公司深知人才是企业发展的核心动力。因此,公司注重人才培养和引进,建立了一支高素质、专业化的研发团队。同时,公司还为员工提供了良好的工作环境和福利待遇,激发了员工的工作热情和创造力。这些举措为公司的发展提供了坚实的人才保障。

Eris Technology Corp公司的发展小趣事

在当今日新月异的科技时代,Eris Tech始终坚持以创新驱动为发展动力。公司不断加大研发投入力度,积极引进新技术、新材料和新工艺,推动产品升级和产业升级。同时,Eris Tech还注重人才培养和团队建设,吸引了一批高素质的人才加入公司。随着技术的不断创新和人才的不断积累,Eris Tech将在未来电子行业中继续发挥重要作用。

请注意,以上故事为虚构内容,旨在展示Eris Technology Corp公司可能的发展路径和成就。实际情况可能因市场变化、技术演进和公司策略调整而有所不同。

问答坊 | AI 解惑

请问 STM32芯片外部时钟能用有源晶振吗?谢谢

我现在做的一个板子上面用到AD652芯片,也需要外部时钟输入。现在对时钟感到很困惑,希望大家能给点意见。我的想法是: 1.stm32用石英晶振,AD652用有源晶振,但是1-2M的有源晶振很难买。 2.只用有源晶振,通过分频器分别给stm32、AD652提供时钟 ...…

查看全部问答>

ds1302读取只有三个能显示正确,怎么回事,实在检查不出问题所在

Write_Ds1302Byte(0x8f,0); 1。 sec = BCDToDEC(Read_DS1302Byte(SEC_READ));       Delay(100); 2。 min = BCDToDEC(Read_DS1302Byte(MIN_READ));               & ...…

查看全部问答>

移动网络的动态检测

TD-SCDMA 网络的动态检测 我们开发的产品用了TD模块,当网络信号好时,正常用应没关系。当网络信号不好时(没有网络时)连不TD网络。 别人是如何处理这些网络变化的情况的(有网络-->没有网络-->有网络). …

查看全部问答>

keil Debug里面的view为什么用不了?

我是新手,现在输出hello 教材上说Debug理的VIEW能看输出结果,但是我的为什么用不了啊》?…

查看全部问答>

PB订制wince问题?

用PB订制wince5,是不是必须用同时生成的eboot? 用别人的eboot行吗? 为什么我订制完wince后,用PB生成的eboot启动,就停在“Starting eboot ...”不动了。 平台是pxa270,eboot要做什么修改吗?…

查看全部问答>

找不到具有OpenAdapter入口函数的Dll,驱动版本显示是nv4_disp.dll

       我最近在学习WDD的一点开发,根据帮助文档说,所有Directo3D要用到的调用函数都是从相应Dll里的OpenAdapter或者OpenAdapter10接口,一步步导出来的。我在有些人的机器上找到了Dll,比如nvd3dum.dll,  但是有 ...…

查看全部问答>

突然connect不上了?help me

刚开始还用着挺好的,新建了一个工程后,连了好多次,怎么也connect不上。 挺急的,还请大家多帮忙,非常感谢。 Error connecting to the target: Error 0x80001240/-1072 Fatal Error during: Initialization, OCS, Target,  Device d ...…

查看全部问答>

求助:430C语言问题

while((ADC12IFG&BIT2)==0);可以判断2位是否置位吗?…

查看全部问答>

求教:Xbee S2组建的zigbee网络与iris mote传感器网络能否通信?

小弟接触zigbee不久,请大大们指教。 我现在有两个网络,一个XBee S2组起来的zigbee网络,Xbee使用的固件是X-ctu中的XB24-ZB,还有一个是crossbow的iris mote组建的传感器网络。我现在需要使两个网络之间互相通信。 我的想法是根据zigbee网络的协 ...…

查看全部问答>