找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9362|回复: 12
打印 上一主题 下一主题
收起左侧

自己做的用单片机控制8*8点阵的贪吃蛇

[复制链接]
跳转到指定楼层
楼主
ID:63839 发表于 2014-8-27 18:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include<stc12.h>      //用六个按键四个方向键 一个暂停键 一个重新开始健
  2. #include<stdlib.h>      //P1控制正极 P0控制负极
  3. #define uint unsigned int    //
  4. #define uchar unsigned char
  5. int addx,addy,n,s1,s2,e,a,b,c,d,k;   //addx addy位移改变量  n蛇身长度 s1,s2新果实的位置
  6. uchar x[21];       //a重新开始标志 b暂停标志 e代表蛇身运动速度大小
  7. uchar y[21];       //两个数组用来储存蛇身的地址
  8. void key();
  9. void deal();
  10. void move(int);
  11. uchar mux(int);
  12. void delay(uint);
  13. void main()
  14. {
  15. n=3,e=300,addx=0,addy=0,k=0;        //最初游戏设定
  16. x[0]=7;y[0]=2;          //果实
  17. x[1]=7;y[1]=7;               //蛇尾
  18. x[2]=7;y[2]=6;          //蛇身
  19.   x[n]=7;y[n]=5;             //蛇头
  20. P0=0x7f;P1=0xe4;
  21. while(1)
  22. {
  23.   key();
  24.   if(b==0)
  25.   {
  26.   key();
  27.   move(e);
  28.   deal();
  29.   }
  30.   if(b==1)
  31.   { uint i;             //
  32.       for(i=0;i<=n;i++)         //
  33.         {             //
  34.        P0=255-mux(x[i]);P1=mux(y[i]);     //
  35.        delay(5);          //
  36.        P0=0xff;P1=0x00;              //和数码管的消影差不多的作用
  37.    }
  38.   }
  39. }
  40. }
  41. void move(int e)  //实现移动
  42. {
  43. uint i;
  44. if(k>0)
  45. {
  46.   while(e--)            //
  47.   {              //
  48.      for(i=0;i<=n;i++)          //
  49.        {              //
  50.       P0=255-mux(x[i]);P1=mux(y[i]);      //
  51.       key();            //
  52.       delay(5);           //
  53.       P0=0xff;P1=0x00;                  //和数码管的消影差不多的作用
  54.       }
  55.   }                 //
  56.   for(i=1;i<n;i++)          //
  57.   {x[i]=x[i+1];y[i]=y[i+1];}        //
  58.   x[n]=x[i]+addx;y[n]=y[i]+addy;       //              
  59. }
  60. }
  61. void deal()             //判断函数
  62. {
  63. uint i;
  64. if(x[n]>7|x[n]<0|y[n]>7|y[n]<0)       //撞墙而死
  65. {
  66.   P0=0xef;P1=0x5e;delay(10000);      //游戏结束标志         
  67.   n=3,e=300,addx=0,addy=0,a=0,b=0,k=0;     //最初游戏设定
  68.   x[0]=7;y[0]=2;          //果实
  69.   x[1]=7;y[1]=7;               //蛇尾
  70.   x[2]=7;y[2]=6;          //蛇身
  71.    x[n]=7;y[n]=5;             //蛇头
  72.   P0=0x7f;P1=0xe4;      
  73. }
  74. for(i=1;i<n;i++)          //撞自己而死
  75. {
  76.   if(x[i]==x[n]&y[i]==y[n])
  77.   {
  78.    P0=0xef;P1=0x5e;delay(30000);      //游戏结束标志
  79.    n=3,e=300,addx=0,addy=0,a=0,b=0,k=0;   //回到最初游戏设定
  80.    x[1]=7;y[1]=7;            //蛇尾
  81.    x[2]=7;y[2]=6;
  82.       x[n]=7;y[n]=5;          //蛇头
  83.    P0=0x7f;P1=0xe4;
  84.   }         
  85. }
  86. if((x[0]==x[n]+addx)&(y[0]==y[n]+addy))   //判断是否吃到果实
  87. {
  88.   n=n+1;
  89.   x[n]=x[0];y[n]=y[0];
  90.   if(n==13)         //判断是否过关
  91.   { e=e-50;          //
  92.    P0=0x00;P1=0xff;delay(30000);      //游戏结束标志
  93.    n=3,addx=0,addy=0,a=0,b=0,k=0;      //回到最初游戏设定
  94.    x[1]=7;y[1]=7;            //蛇尾
  95.    x[2]=7;y[2]=6;
  96.       x[n]=7;y[n]=5;          //蛇头
  97.    P0=0x7f;P1=0xe0;         
  98.   }
  99.   c=rand(); s1=c%10000%1000%100%10;
  100.   d=rand(); s2=d%10000%1000%100%10;   // 新的果实
  101.   if(s1>6)  s1=s1-3;
  102.   if(s2>6)  s2=s2-3;
  103.   x[0]=s1;y[0]=s2;       //
  104.   for(i=1;i<n;i++)       //判断是否与蛇身重合
  105.   {
  106.     if((x[0]==x[i])&(y[0]==y[i]))
  107.     {
  108.      c=rand(); s1=c%10000%1000%100%10;
  109.    d=rand(); s2=d%10000%1000%100%10;  
  110.    if(s1>6)  s1=s1-3;
  111.    if(s2>6)  s2=s2-3;
  112.    x[0]=s1;y[0]=s2;      // 新的果实
  113.    i=1;
  114.     }
  115.     }
  116. }
  117. }
  118. void key()             //矩阵按键扫描
  119. {
  120. uchar t;
  121. P3=0xdf;
  122. t=P3;
  123. t=t&0x1c;
  124. if(t!=0x1c)
  125. {
  126.   delay(10);
  127.   t=P3;
  128.   t=t&0x1c;
  129.   if(t!=0x1c)
  130.    {
  131.     t=P3;
  132.    switch(t)
  133.    {
  134.     case 0xdb:a=1;break;
  135.     case 0xd7:k=1;break;
  136.     case 0xcf:b++;break;
  137.     default:  break;
  138.    }
  139.    while(t!=0x1c)
  140.    {
  141.     t=P3;
  142.     t=t&0x1c;
  143.    }
  144.    }
  145. }
  146. P3=0xbf;
  147. t=P3;
  148. t=t&0x1c;
  149. if(t!=0x1c)
  150. {
  151.   delay(10);
  152.   t=P3;
  153.   t=t&0x1c;
  154.   if(t!=0x1c)
  155.    {
  156.     t=P3;
  157.    switch(t)
  158.    {
  159.     case 0xbb:k=2;break;
  160.     case 0xb7:k=3;break;
  161.     case 0xaf:k=4;break;
  162.     default:  break;
  163.    }
  164.    while(t!=0x1c)
  165.    {
  166.     t=P3;
  167.     t=t&0x1c;
  168.    }
  169.    }
  170. }
  171. b=b%2;
  172. switch(k)
  173. {
  174.   case 1: addy=-1,addx=0;break;
  175.   case 2: addx=1,addy=0;break;
  176.   case 3: addy=1,addx=0;break;
  177.   case 4: addx=-1,addy=0;break;
  178. }
  179. }
  180. uchar mux(int temp)      //十进制转化为十六进制
  181. {
  182. if(temp==7)return 128;
  183. if(temp==6)return 64;
  184. if(temp==5)return 32;
  185. if(temp==4)return 16;
  186. if(temp==3)return 8;
  187. if(temp==2)return 4;
  188. if(temp==1)return 2;
  189. if(temp==0)return 1;
  190.            return 0;
  191. }
  192. void delay(uint z)
  193. {
  194. uint x,y;
  195. for(x=z;x>0;x--)
  196.   for(y=110;y>0;y--);
  197. }
复制代码

评分

参与人数 2威望 +30 黑币 +25 收起 理由
jiege + 5 + 5 赞一个!
admin + 25 + 20 绝世好帖!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:51088 发表于 2014-8-27 21:01 | 只看该作者

回帖奖励 +1

楼主能发一个完整的工程文件吗  好像还差头文件  最好有电路图
回复

使用道具 举报

板凳
ID:63839 发表于 2014-8-28 13:03 | 只看该作者
jiege 发表于 2014-8-27 21:01
楼主能发一个完整的工程文件吗  好像还差头文件  最好有电路图

我不知道如何穿文件 头文件是根据自己的单片机型号而修改 P1控制点阵的正极 P0控制负极 其他的I/O口可以用作键盘
回复

使用道具 举报

地板
ID:63839 发表于 2014-8-28 13:07 | 只看该作者
我用的键盘是矩阵键盘 大家可以用独立键盘 我是在我之前的单片机上外接一个8*8的点阵 并没有做出来实物  但是在面包板上调试一切正常 我就是想暑假无聊做些东西 既然程序ok 就没必要一定做出硬件
回复

使用道具 举报

5#
ID:1 发表于 2014-8-28 15:52 | 只看该作者
按照这个步骤即可在回帖的时候上传图片(上传附件就在图片的旁边 方法一样)


选择图片的时候可以多选,这样就能一次性上传很多图片(上传附件就在图片的旁边 方法一样)
回复

使用道具 举报

6#
ID:63839 发表于 2014-8-28 16:00 | 只看该作者
admin 发表于 2014-8-28 15:52
按照这个步骤即可在回帖的时候上传图片(上传附件就在图片的旁边 方法一样)

谢啦 thanks
回复

使用道具 举报

7#
ID:63839 发表于 2014-9-1 13:39 | 只看该作者
大家觉得好就给点分
回复

使用道具 举报

8#
ID:94279 发表于 2015-11-1 12:48 | 只看该作者
看看怎么样
回复

使用道具 举报

9#
ID:111188 发表于 2016-3-28 23:02 | 只看该作者
学习一下
回复

使用道具 举报

10#
ID:148621 发表于 2016-12-1 21:23 | 只看该作者
实际运行的时候它怎么不动呀QAQ
回复

使用道具 举报

11#
ID:155589 发表于 2016-12-18 18:36 | 只看该作者
只有程序呀
回复

使用道具 举报

12#
ID:183929 发表于 2017-3-28 18:55 | 只看该作者
赞一个
回复

使用道具 举报

13#
ID:139785 发表于 2017-5-12 10:42 来自手机 | 只看该作者
我做的 比你做的好玩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表