找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 14739|回复: 28
收起左侧

8X8点阵贪吃蛇DIY制作 附单片机源码

  [复制链接]
ID:168133 发表于 2017-5-6 22:31 | 显示全部楼层 |阅读模式
分享一个8X8点阵贪吃蛇 看图:
1.gif 2.gif
整体
0.png

按右键开始、

中间可以选择速度1最慢9最快(飞一般的感觉)

速度2和9




哎呀呀,自己撞死了(可以穿墙,撞到自己的身体死亡)

按中间确定可查看吃到了多少


暂停
0.png 0.png 0.png 0.png 0.png 0.png 0.png 0.png 0.png 0.png 0.png 0.png 0.png 0.png 0.png 0.png

单片机源程序:
  1. #include"reg52.h"
  2. sbit d=P2^4;
  3. sbit a=P2^0;
  4. sbit w=P2^2;
  5. sbit s=P2^6;
  6. sbit key=P2^7;
  7. unsigned char code n[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01},n0[8]={0x08,0x04,0x02,0x01,0x10,0x20,0x40,0x80};
  8. unsigned char snake[8][8],xmax,ymax,xmin,ymin,max=0,min=200,eat=0,ch='d',num=0,f=0,cun=0,food=1,hz=0,n1=0,v=2;
  9. void late(unsigned int i)
  10. {
  11.         for(;i>0;i--);
  12. }
  13. void xian(unsigned char y0,unsigned char x0,unsigned char y1,unsigned char x1,unsigned char on)
  14. //在数组snake[][]中绘直线的函数,(x0,y0)to(x1,y1)   on,0:off  1:长亮  2:以1:1亮灭时间比闪烁
  15. {
  16.         char i,j,nx,ny;

  17.         if(x0>x1)
  18.                 nx=-1;
  19.         else if(x0==x1)
  20.                 nx=0;
  21.         else
  22.                 nx=1;
  23.         if(y0>y1)
  24.                 ny=-1;
  25.         else if(y0==y1)
  26.                 ny=0;
  27.         else
  28.                 ny=1;
  29.         for(i=y0,j=x0;i!=y1+ny||j!=x1+nx;i=ny+i,j=nx+j)
  30.                 snake[j][i]=on;

  31. }
  32. void print(void)//把二维数组snake[][]转换点阵的函数,数组某元素为0时,对应的led灭,1为亮,2为闪烁。(以后用多色led点阵时也可以用这种方法控制颜色)
  33. {
  34.                 unsigned char i,j;
  35.                 P3=0x00;
  36.                 P1=0x00;
  37.                 for(i=0;i<8;i++)
  38.                 {
  39.                         P3=0x00;
  40.                         P1=~n[i];        
  41.                         for(j=0;j<8;j++)
  42.                         {
  43.                                 if(snake[j][i]==1)
  44.                                 {
  45.                                         P3|=n0[j];
  46.                                 }
  47.                                 else if(snake[j][i]==2)
  48.                                 {
  49.                                         if(hz%125>=60)
  50.                                                 P3|=n0[j];
  51.                                         else
  52.                                                 P3&=~n0[j];        
  53.                                 }
  54.                                 else if(snake[j][i]==0)
  55.                                         P3&=~n0[j];
  56.                         }
  57.                         late(10);        
  58.                 }

  59. }
  60. void number(unsigned char su,unsigned char x,unsigned char y,unsigned char on,unsigned char in)
  61. { //在数组snake[][]从某坐标起绘数字的函数,on:显示样式,in:背景样式
  62.         xian(x+2,y,x+2,y+4,on);
  63.         if(su==7||su==4||su==1)
  64.         {
  65.                
  66.                 if(su==7)
  67.                         xian(x,y,x+2,y,on);
  68.                 if(su==4)
  69.                         {
  70.                                 xian(x,y,x,y+2,on);
  71.                                 snake[y+2][x+1]=on;
  72.                         }
  73.         }
  74.         else
  75.         {        
  76.                 xian(x,y,x+2,y,on);
  77.                 if(su!=0)
  78.                         xian(x,y+2,x+2,y+2,on);
  79.                 xian(x,y+4,x+2,y+4,on);
  80.                 xian(x,y,x,y+4,on);
  81.                 switch(su)
  82.                 {
  83.                 case 5:snake[y+3][x]=in;
  84.                 case 6:snake[y+1][x+2]=in;break;
  85.                 case 9:snake[y+3][x]=in;break;
  86.                 case 2:snake[y+1][x]=snake[y+3][x+2]=in;break;
  87.                 case 3:snake[y+1][x]=snake[y+3][x]=in;
  88.                 }
  89.         }
  90. }
  91. void main(void)
  92. {
  93.         unsigned int i,j;
  94.         TMOD=0x01;
  95.         TH0=(65536-10000)/256;
  96.         TL0=(65536-10000)%256;//每10000微秒中断一次(每0.01秒执行一次中断函数)
  97.         EA=1;
  98.         ET0=1;
  99.         TR0=1;
  100.         //以上是有关时间中断的设置

  101.         start:
  102.         P3=0x00;
  103.         P1=0x00;
  104.                         
  105.                
  106.         f=1;
  107.         cun=1;
  108.         while(cun)//等待开始
  109.         {
  110.                 n1++;
  111.                 if(n1==240)
  112.                 n1=0;
  113.                
  114.                 for(i=0;i<8;i++)
  115.                 for(j=0;j<8;j++)
  116.                         snake[j][i]=0;


  117.                 switch(f)
  118.                 {
  119.                         case 1://主界面:开>
  120.                         xian(0,1,4,1,1);
  121.                         xian(0,3,4,3,1);
  122.                         xian(1,1,1,5,1);
  123.                         xian(3,1,3,6,1);
  124.                         xian(6,2,6,4,2);
  125.                         snake[3][7]=2;
  126.                         snake[6][0]=1;
  127.                         print();
  128.                         P3=0x00;
  129.                         P1=0x00;
  130.                         if(d==0)
  131.                                 cun=0;
  132.                         break;

  133.                         case 2://选择速度等级的界面
  134.                         number(v,2,1,1,0);
  135.                         snake[3][6]=2;
  136.                         snake[3][0]=2;
  137.                         if(d==0&&v<9)
  138.                         {
  139.                                 v++;
  140.                                 while(!d);
  141.                         }
  142.                         if(a==0&&v>1)
  143.                         {
  144.                                 v--;
  145.                                 while(!a);
  146.                         }
  147.                         print();
  148.                 }

  149.                 if(key==0)
  150.                 {
  151.                         while(!key);
  152.                         if(f==2)
  153.                                 f=1;
  154.                         else
  155.                                 f++;
  156.                 }
  157.         }
  158.         f=0;
  159.         cun=0;
  160.         for(i=0;i<8;i++)//snake[][]数组的初始化
  161.                 for(j=0;j<8;j++)
  162.                         snake[j][i]=100;//100代表空
  163.                         snake[0][0]=101;snake[0][1]=102;snake[0][2]=103;//大于100代表蛇身,其中最大值代表蛇头,101代表蛇尾。
  164.         
  165.         
  166.         for(;;)//游戏运行部分
  167.         {
  168.                 for(i=0;i<8;i++)
  169.                 {
  170.                         P3=0x00;
  171.                         P1=~n[i];        
  172.                         for(j=0;j<8;j++)
  173.                         {
  174.                                 if(snake[j][i]>100)
  175.                                 {
  176.                                         P3|=n0[j];
  177.                                            if(f==1&&eat==0)
  178.                                                 {
  179.                                                 snake[j][i]--;
  180.                                                 }
  181.                                 }
  182.                                 else if(snake[j][i]==100)
  183.                                         P3&=~n0[j];
  184.                                 else if(snake[j][i]==50)//值为50的点代表食物
  185.                                 {
  186.                                         cun++;//统计现在存在的食物数
  187.                                         if(hz%25<10)
  188.                                                 P3|=n0[j];
  189.                                         else
  190.                                                 P3&=~n0[j];
  191.                                         if(hz>120)
  192.                                                 hz=0;
  193.                                                 //以上几行:闪烁显示食物
  194.                                 }

  195.                                    if(snake[j][i]>max)//以下:把蛇头和蛇尾及其坐标找出来,以便后面对蛇移动的操作
  196.                 {
  197.                                         max=snake[j][i];
  198.                                         xmax=j;
  199.                                         ymax=i;
  200.                                 }
  201.                                 if(snake[j][i]<min&&snake[j][i]>100)
  202.                                 {
  203.                                     min=snake[j][i];
  204.                                         xmin=j;
  205.                                         ymin=i;
  206.                                 }
  207.                         }
  208.                         late(10);
  209.                         n1++;
  210.                 }

  211.                 if(f==1)
  212.                         f=0;
  213.                
  214.                 if(d==0)//方向按键的识别
  215.                 {
  216.                         if(ch!='a')
  217.                                 ch='d';
  218.                 }
  219.                 else if(a==0)
  220.                 {
  221.                         if(ch!='d')
  222.                                 ch='a';
  223.                 }        
  224.                 else if(w==0)
  225.                 {
  226.                         if(ch!='s')
  227.                                 ch='w';
  228.                 }        
  229.                 else if(s==0)
  230.                 {        
  231.                         if(ch!='w')
  232.                                 ch='s';
  233.                  }         
  234.                 if(key==0)//暂停功能
  235.                 {
  236.                         while(!key);
  237.                         late(200);
  238.                         P1=~0x24;
  239.                         while(key)
  240.                         {                        
  241.                                 if(hz%125>60)
  242.                                         P3=n0[2]+n0[3]+n0[4]+n0[5];
  243.                                 else
  244.                                         P3=0x00;
  245.                         }
  246.                         while(!key);
  247.                 }


  248.                         //下面:食物坐标的生成(用以时间为种子的随机数%8得到)
  249.                            if(cun<food)//如果存在的食物数<food
  250.                 {
  251.                      sui:
  252.                          i=hz%8;
  253.                      j=n1%8;
  254.                      if(snake[j][i]==100)//如果该坐标点为空(没有蛇身,障碍物和食物)
  255.                          snake[j][i]=50;//该坐标点生成食物
  256.                      else                                 //否则回到sui,重新生成食物坐标
  257.                              goto sui;
  258.             }
  259.             cun=0;//初始化食物数为0,以便下一次循环的统计


  260.                 if(num==0)
  261.                 {
  262.                         num=1;
  263.                         f=1;
  264.                         eat=0;


  265.                         switch(ch)
  266.                         {
  267.                             case 'a'://贪吃蛇左走
  268.                                     if(ymax<1)
  269.                                         {
  270.                                                 if(snake[xmax][ymax+7]>100)
  271.                                                     goto end;
  272.                                                 else if(snake[xmax][ymax+7]==50)
  273.                                             {
  274.                                                     eat++;
  275.                                                     goto b72;
  276.                                             }
  277.                                                 else
  278.                                                     b72:snake[xmax][ymax+7]=max+1;
  279.                                         }
  280.                                         else
  281.                                         {
  282.                                             if(snake[xmax][ymax-1]>100)
  283.                                                 goto end;
  284.                                                     else if(snake[xmax][ymax-1]==50)
  285.                                             {
  286.                                                         eat++;
  287.                                                         goto o72;
  288.                                                 }
  289.                                             else        
  290.                                                     o72:snake[xmax][ymax-1]=max+1;
  291.                                         }
  292.                                         break;
  293.                             case 'd'://右走
  294.                                     if(ymax+1>=8)
  295.                                         {
  296.                                                 if(snake[xmax][ymax+1-8]>100)
  297.                                                     goto end;
  298.                                                 else if(snake[xmax][ymax+1-8]==50)
  299.                                             {
  300.                                                     eat++;
  301.                                                     goto b80;
  302.                                             }
  303.                                                 else
  304.                                                     b80:snake[xmax][ymax+1-8]=max+1;
  305.                                         }
  306.                                         else
  307.                                         {
  308.                                             if(snake[xmax][ymax+1]>100)
  309.                                                 goto end;        
  310.                                             else if(snake[xmax][ymax+1]==50)
  311.                                             {
  312.                                                         eat++;
  313.                                                         goto o80;
  314.                                                 }
  315.                                                 else        
  316.                                                     o80:snake[xmax][ymax+1]=max+1;
  317.                                         }
  318.                                         break;
  319.                             case 'w'://上走
  320.                                     if(xmax<1)
  321.                                         {
  322.                                                 if(snake[xmax+7][ymax]>100)
  323.                                                     goto end;
  324.                                                 else if(snake[xmax+7][ymax]==50)
  325.                                             {
  326.                                                     eat++;
  327.                                                     goto b75;
  328.                                             }
  329.                                                 else
  330.                                                     b75:snake[xmax+7][ymax]=max+1;
  331.                                         }
  332.                                         else
  333.                                         {
  334.                                             if(snake[xmax-1][ymax]>100)
  335.                                                 goto end;        
  336.                                             else if(snake[xmax-1][ymax]==50)
  337.                                             {
  338.                                                         eat++;
  339.                                                         goto o75;
  340.                                                 }
  341.                                                 else        
  342.                                                     o75:snake[xmax-1][ymax]=max+1;
  343.                                         }
  344.                                         break;
  345.                                 case 's'://下走
  346.                                         if(xmax+1>=8)
  347.                                         {
  348.                                                 if(snake[xmax+1-8][ymax]>100)
  349.                                                     goto end;
  350.                                                 else if(snake[xmax+1-8][ymax]==50)
  351.                                             {
  352.                                                     eat++;
  353.                                                             goto b77;
  354.                                             }
  355.                                                 else
  356.                                                     b77:snake[xmax+1-8][ymax]=max+1;
  357.                                         }
  358.                                         else
  359.                                         {
  360.                                             if(snake[xmax+1][ymax]>100)
  361.                                                 goto end;        
  362.                                             else if(snake[xmax+1][ymax]==50)
  363.                                             {
  364.                                                         eat++;
  365.                                                         goto o77;
  366.                                                 }
  367.                                                 else        
  368.                                                             o77:snake[xmax+1][ymax]=max+1;
  369.                                         }
  370.                                     break;
  371.                     }
  372.                     max=0;min=200;
  373.                 }
  374.                         
  375.         }
  376.         end:
  377.         f=0;
  378.         while(key)//游戏结束,显示“X”
  379.         {
  380.                 xian(0,0,7,7,1);
  381.                 xian(0,7,7,0,1);
  382.                 print();
  383.         }
  384.         while(!key);
  385.         for(i=0;i<8;i++)
  386.                 for(j=0;j<8;j++)
  387.                         snake[j][i]=0;
  388.         while(key)//显示游戏得分
  389.         {
  390.                 number((max-103)/10,0,2,1,0);
  391.                 number((max-103)%10,4,2,1,0);
  392.                 print();


  393. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码


0.png

下载:
8x8点阵贪吃蛇.rar (2.68 KB, 下载次数: 250)

评分

参与人数 5黑币 +25 收起 理由
darkie + 5 很给力!
ccrstc + 5
5760985 + 5 很给力!
oniii + 5 绝世好帖!
卡啦小晨 + 5 绝世好帖!

查看全部评分

回复

使用道具 举报

ID:168911 发表于 2017-5-7 10:19 | 显示全部楼层
非常感谢,你这个是真正的可玩贪吃蛇,已经仿真成功,食物能够随机出现,能够闪烁提醒,能够选关,能够记分,能够暂停,有空马上做个实物。况且代码正确,没有错误警告。非常好。
回复

使用道具 举报

ID:197157 发表于 2017-5-8 05:04 来自手机 | 显示全部楼层
老当益壮 发表于 2017-5-7 10:19
非常感谢,你这个是真正的可玩贪吃蛇,已经仿真成功,食物能够随机出现,能够闪烁提醒,能够选关,能够记分 ...

您好,能分享个仿真文件吗
回复

使用道具 举报

ID:168911 发表于 2017-5-8 10:07 | 显示全部楼层
程序不改的话放个8050 ,增加亮度,要不然要在夜里玩
回复

使用道具 举报

ID:89286 发表于 2017-5-8 15:20 | 显示全部楼层
thanks for sharing
回复

使用道具 举报

ID:60656 发表于 2017-5-9 10:04 | 显示全部楼层
老当益壮 发表于 2017-5-8 10:07
程序不改的话放个8050 ,增加亮度,要不然要在夜里玩

加个573增大驱动能里,亮度会提高点
回复

使用道具 举报

ID:60656 发表于 2017-5-9 10:05 | 显示全部楼层
能加上点声音就更好了
回复

使用道具 举报

ID:228834 发表于 2017-8-22 21:41 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:229390 发表于 2017-8-25 21:15 | 显示全部楼层

谢谢分享
回复

使用道具 举报

ID:240652 发表于 2017-11-30 13:14 | 显示全部楼层
666666,下载下来学习一下
回复

使用道具 举报

ID:285742 发表于 2018-2-26 20:26 | 显示全部楼层
PHP文件怎么看啊?
回复

使用道具 举报

ID:307425 发表于 2018-4-13 19:09 | 显示全部楼层
楼主我想问一下你的点阵用的是什么类型的,4个口接的哪啊
回复

使用道具 举报

ID:301898 发表于 2018-5-15 23:50 | 显示全部楼层
666666666666666666666
回复

使用道具 举报

ID:340028 发表于 2018-5-28 20:10 | 显示全部楼层
绝世好贴!
回复

使用道具 举报

ID:343482 发表于 2018-6-2 14:54 | 显示全部楼层
Hi 麻烦能把贪吃蛇的源代码发给我一下吗?刚注册没法下载。。。
houwenjie@live.com
回复

使用道具 举报

ID:343482 发表于 2018-6-3 21:13 | 显示全部楼层
能不能把接线原理图也放一下?
回复

使用道具 举报

ID:357956 发表于 2018-6-24 19:34 | 显示全部楼层
绝世好帖!
回复

使用道具 举报

ID:366554 发表于 2018-7-6 21:33 | 显示全部楼层
很好很强大!
回复

使用道具 举报

ID:380389 发表于 2018-7-29 10:14 来自手机 | 显示全部楼层
好厉害
回复

使用道具 举报

ID:432280 发表于 2018-11-24 11:21 | 显示全部楼层
厉害啊老哥
回复

使用道具 举报

ID:448174 发表于 2018-12-19 22:05 来自手机 | 显示全部楼层
TimelessStar 发表于 2018-4-13 19:09
楼主我想问一下你的点阵用的是什么类型的,4个口接的哪啊

楼主有回你吗
回复

使用道具 举报

ID:448174 发表于 2018-12-19 22:06 来自手机 | 显示全部楼层
老当益壮 发表于 2017-5-7 10:19
非常感谢,你这个是真正的可玩贪吃蛇,已经仿真成功,食物能够随机出现,能够闪烁提醒,能够选关,能够记分 ...

你好 请问怎么能告诉下在开发板上的连线图吗
回复

使用道具 举报

ID:481641 发表于 2019-3-11 20:05 来自手机 | 显示全部楼层
请问点阵如何接
回复

使用道具 举报

ID:437764 发表于 2019-4-2 10:47 来自手机 | 显示全部楼层
对我学习非常有用
回复

使用道具 举报

ID:643857 发表于 2019-11-17 20:03 | 显示全部楼层
太强了
回复

使用道具 举报

ID:228834 发表于 2020-2-29 19:04 | 显示全部楼层
有没有电路图?
回复

使用道具 举报

ID:700364 发表于 2020-3-1 14:29 | 显示全部楼层
程序运行完美,谢谢!
回复

使用道具 举报

ID:733580 发表于 2020-4-20 15:23 | 显示全部楼层
给大神跪了
回复

使用道具 举报

ID:704585 发表于 2020-6-2 14:35 | 显示全部楼层
感谢楼主分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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