这是基于51单片机的贪吃蛇小游戏,用四个独立按键控制上下左右,用8*8点阵作为显示

程序如下:

#include <reg52.h>
#include <intrins.h>
#include <stdlib.h>#define SNAKE 20unsigned char x[SNAKE];        //存放蛇的X轴坐标
unsigned char y[SNAKE];        //存放蛇的Y轴坐标unsigned char point_x;         //存放果实的X轴坐标
unsigned char point_y;         //存放果实的Y轴坐标
/*
//点阵模块接口定义
sbit LEDARRAY_LAT = P3^6;//储存寄存器是时钟
sbit LEDARRAY_CLK = P3^5;//移位寄存器时钟输入端
sbit LEDARRAY_DI = P3^4;//串行数据输入端
sbit up    = P3^0;
sbit down  = P3^1;
sbit left  = P3^2;
sbit right = P3^3;
unsigned char num[8][8]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//定义8*8数组作为清屏数据(有点走弯路,也就不改了自己有能力可以自己改)unsigned char move_flag=0;        //移动标志, 1 上,2 下,3 左,4 右;
unsigned char snake=3;            //蛇身长度
unsigned int flag=1;              //是否需要生成果实//SPI通信函数 发送一个直接数据给点阵模块
void Send_Byte( unsigned char dat)
{unsigned char i;//循环次数数变量LEDARRAY_CLK = 0;//拉低移位时钟_nop_();    LEDARRAY_LAT = 0;//拉低储存时钟_nop_();for( i = 0 ; i < 8 ; i++ ) //?循环8次写入一个字节数据{if( dat&0x01 ){LEDARRAY_DI = 1; }else{LEDARRAY_DI = 0;}LEDARRAY_CLK = 1;              //上升沿发送数据//             _nop_();LEDARRAY_CLK = 0;//                _nop_();dat >>= 1;           }
}void chang_num()            //这个函数用来转码,把8*8数组中的‘0’,‘1’按列写成十六进制
{   int i,j;for(j=0;j<8;j++) {for(i=7;i>=0;i--)    {  Dis_num[j]*=2;  Dis_num[j]+=num[i][j]&0x01;  }  }
}void Display(unsigned char* Dis_dat,delay)     //显示函数
{unsigned char k, temp;unsigned int i;for(i = 0 ; i < delay ; i++){temp = 0x7f;for(k = 0 ; k < 8 ; k++)        //一个字节8byte{Send_Byte(temp);            //列选择Send_Byte(Dis_dat[k]);         //行数据LEDARRAY_LAT =1;              //锁存数据_nop_();LEDARRAY_LAT = 0;_nop_();temp = (temp>>1)|0x80;}}
}
void key()
{if(move_flag!=2&&(!up)){move_flag=1;}if(move_flag!=1&&(!down)){move_flag=2;}if(move_flag!=4&&(!left)){move_flag=3;}if(move_flag!=3&&(!right)){move_flag=4;}
}void move()       //这个函数是让蛇走起来的,如果蛇现在向上走就把蛇尾所在坐标改为0,把蛇头上方所在坐标改为1.其他同理
{unsigned int i;if(move_flag==1){for(i=snake;i>0;i--){x[i+1]=x[i];y[i+1]=y[i];}x[1]=x[1]-1;y[1]=y[1]; }if(move_flag==2){for(i=snake;i>0;i--){x[i+1]=x[i];y[i+1]=y[i];}x[1]=x[1]+1;y[1]=y[1]; }if(move_flag==3){for(i=snake;i>0;i--){x[i+1]=x[i];y[i+1]=y[i];}x[1]=x[1];y[1]=y[1]-1; }if(move_flag==4){for(i=snake;i>0;i--){x[i+1]=x[i];y[i+1]=y[i];}x[1]=x[1];y[1]=y[1]+1; }}void bulid_point()        //生成果实函数
{unsigned int i;  if((x[1]==point_x)&&(y[1]==point_y))        //判断吃到果实{ snake++;        //蛇的长度加1flag=1;         //标志需要生成果实}while(flag)            //生成果实{point_x=(unsigned char)(rand()%8);point_y=(unsigned char)(rand()%8);for(i=1;i<snake+1&&flag;i++){if(point_x !=x[i]&&point_y!=y[i])flag=0;}}
}  bit eat()
{}
void assign ()     //画蛇函数,在8*8二维数组中画出蛇,把蛇所在的每个坐标改为1
{unsigned int i,j;for(i=0;i<8;i++){for(j=0;j<8;j++){num[i][j]=0;}}for(i=1;i<snake+1;i++){num[x[i]][y[i]]=1;}num[point_x][point_y]=1;
}void main()
{snake=3;//x[0]=4;y[0]=3;x[1]=4;y[1]=4;x[2]=4;y[2]=5;x[3]=4;y[3]=6;while(1){key();move();bulid_point();//eat();assign ();chang_num();Display(Dis_num,200);if(x[1]>7||y[1]>7){while(1){num[x[1]][y[1]]=0;chang_num();Display(Dis_num,200);}}}
}

基于51单片机的点阵贪吃蛇相关推荐

  1. 基于51单片机3208LED点阵电子钟C程序工程全套资料,毕业设计参考资料

    感兴趣者请联系本人微信号:Wsf18729286646.共同探讨!谢谢!

  2. 单片机设计_贪吃蛇游戏(AT89C51)

    51单片机游戏(贪吃蛇) 想要更多项目私wo!!! 一.电路设计 此电路由AT89C51最小系统.74HC595位移缓存器.8*8点阵LED屏和按键组成. 74HC595位移缓存器 74HC595是一 ...

  3. 基于51单片机的贪吃蛇小程序(8*8LED点阵实现)by_jy

    ** 基于51单片机的贪吃蛇小程序(8*8LED点阵实现)by_jy ** 一直很想写一个贪吃蛇的小程序,这两天终于抽空完成了,这里把我的思路分享给大家,仅供参考! 代码如下: 先放段主函数压压惊 v ...

  4. 基于51单片机点阵汉字显示程序设计

    文章目录 基于51单片机点阵汉字显示程序设计 一.实践目的 二.实践依托的实验设备与软件 1.设备 2.软件 二. 系统或装置的设计 1. 硬件原理图设计 2.印制板图绘制 三.程序框架及主要算法流程 ...

  5. 基于51单片机的16X64点阵仿真

    目录 一.项目需求 二.仿真图 三.代码 四.资料清单 资料下载地址:基于51单片机的16X64点阵仿真 一.项目需求 16X64点阵上显示汉子,并且可以左右移动. 二.仿真图 左移 右移 三.代码 ...

  6. 基于51单片机的简易游戏机

    基于51单片机的简易游戏机 目录 基于51单片机的简易游戏机 一.绪论 二.设计方案 三.系统原理框图及模块的作用 四.硬件设计及说明 五.实际的程序流程图,写清楚程序模块的功能 六.系统使用说明 七 ...

  7. at89c52串口通信c语言程序,AT89C52DEMO 基于51单片机的(89C51/52)C语言源码例程 - 下载 - 搜珍网...

    例程与源码/12864带字库测试程序/12864 例程与源码/12864带字库测试程序/12864.hex 例程与源码/12864带字库测试程序/12864.lnp 例程与源码/12864带字库测试程 ...

  8. 基于51单片机的电子万年历的设计-源代码

    电子万年历的设计目录 电子万年历的设计 电子万年历的系统整体设计框图 所需要的元件 DS18B20模块 DS18B20的特点 DS18B20内部结构 DS18B20管脚排列 DS1302模块 SPI时 ...

  9. 基于51单片机的简易雷达定位装置

    简易超声波雷达 任务: 一. 摘要: 超声波测距广泛运用于各类电子产品精确距离测量,如汽车尾部的倒车雷达对倒车时的障碍物进行精确判断,反馈到驾驶员,使驾驶员能做出准确的判断和操作:各类航模中当即将触地 ...

最新文章

  1. Windows 10 不能安装更新 (0x8024402f)
  2. jQuery mobile 之三
  3. 【Ubuntu-Tensorflow】程序结束掉GPU显存没有释放的问题
  4. python struct pack string_struct (String) – Python 中文开发手册
  5. 精读《如何编译前端项目与组件》
  6. Windows安全加固系列
  7. 淘宝双十一火爆下的暗礁?
  8. 【转】【Linux】Linux 命令行快捷键
  9. clion使用之如何在编译运行多个程序(以cpp为例)
  10. php序列化 与json_PHP中serializen()与json_encode()的性能差异
  11. 黑客比程序员高在哪里?
  12. 在记事本中无限循环_意外空间:比恐怖游轮更无解的循环迷宫
  13. 在Ubuntu上安装MySQL8.0数据库并使用Navicat远程访问
  14. 迁移学习概述(Transfer Learning)
  15. golang与手机如何实现一些自动化操作?
  16. 《java与模式》笔记-----抽象类和接口
  17. Codeforces Round #495 C. Sonya and Robots
  18. 2019HDU多校第七场 HDU6656 Kejin Player H 【期望递归】
  19. echarts:silent:true去掉markline label的tooltip
  20. ubuntu 17.10 wifi 网速慢的解决办法

热门文章

  1. 主宰互联网的超强10大算法!
  2. 【Linux进程概念——上】冯 • 诺依曼体系结构 | 操作系统 | 进程 | fork | 进程状态 | 优先级
  3. Unity打开Windows虚拟键盘
  4. 六爻排盘php源码,六爻排盘-六爻在线排盘-六爻在线起卦-纳甲六爻起局-六爻在线摇卦-元亨利贞网在线六爻排盘系统...
  5. 支付宝公布2019集五福攻略,准备好薅羊毛的正确姿势
  6. 无限极分类php实现—查子孙树、家谱树
  7. 20189230杨 2018-2019-2 《密码与安全新技术专题》第3周作业
  8. 【180622】VC++不规则窗体编程跳棋游戏实例
  9. Centos 7 硬盘扩容
  10. 影响工程项目进度的因素有哪些