找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4352|回复: 8
收起左侧

51单片机8*8点阵做贪吃蛇游戏代码

[复制链接]
ID:500421 发表于 2019-4-29 10:29 | 显示全部楼层 |阅读模式
51单片机8*8点阵做贪吃蛇游戏,这个蛇所吃的食物是完全随机的!注意!不是伪随机数,是完全随机的。注意::我是用摇杆控制蛇的移动!

144954u5arlkm5r6wll8mz.jpg



开始我是用摁键来控制的,都可以,只需改一小部分就行了!!
在原程序里我保留了一点摁键的程序,实在不知道可以问我(评论就行了,看见了就会回复的!)
大家应该都会建多文件格式吧……就是  .c    .h  这样的(不会可以问我)
大概如下:


多文件模式(不是贪吃蛇的文件)

多文件模式(不是贪吃蛇的文件)






我的这个程序(贪吃蛇)里有4个文件。



贪吃蛇的4个文件

贪吃蛇的4个文件

我再说一遍哈!我是用摇杆控制蛇的,所以我采用12芯片。这个程序可以改成用摁键来控制(用摁键控制的话就用51就行了,两芯片相差不大,程序只用改一点!!)
就这样吧,有问题尽管问吧!!!

全部资料51hei下载地址:
贪吃蛇.rar (4.43 KB, 下载次数: 35)

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:290266 发表于 2019-4-29 16:22 | 显示全部楼层
楼主的代码:
  1. #include "reg52.h"
  2. #include "stdlib.h"
  3. #include "intrins.h"
  4. #include "12.h"
  5. typedef unsigned char u8;
  6. typedef unsigned int u16;       
  7. //*******函数声明***********//
  8. void T0_Init(void);          // 定时器初始化函数
  9. void snake_Move(void);       // 蛇前行函数
  10. void delay(u16 i);
  11.            // 软件延时函数,不精确
  12. void creatFood();            // 创建食物
  13. void snake_Grow(void);       // 蛇成长函数
  14. void Send_Byte(u8 dat);  // 595发送数据函数
  15. void JudgeDeath(void);       // 判断是否死亡函数
  16. void TurnDirection(void);
  17. // 改变方向函数
  18. /*sbit UP = P3 ^ 1;
  19. sbit DOWN = P3 ^ 0;   
  20. sbit LEFT = P3 ^ 2;
  21. sbit RIGHT = P3 ^ 3;*/
  22. sbit LEDARRAY_LAT = P3^6;
  23. sbit LEDARRAY_CLK = P3^5;
  24. sbit LEDARRAY_DI = P3^4;
  25. sbit sw=P1^2;
  26. u16 i,j,n,temp,w,heng,shu;
  27. unsigned char code Display_word[5][8] = {
  28. 0x0C,0x1E,0x3E,0x7C,0x7C,0x3E,0x1E,0x0C, //心
  29. 0x18,0x3C,0x7C,0xF8,0xF8,0x7C,0x3C,0x18,//心
  30. 0x00,0x44,0x86,0x92,0x92,0x9E,0x6C,0x00,//3
  31. 0x00,0xC4,0xC6,0xA2,0xA2,0x92,0x8C,0x00,//2
  32. 0x00,0x80,0x82,0xFF,0xFF,0x80,0x80,0x00,//1
  33. };

  34. //画桃心的码表
  35. unsigned char code Display_xin[16][8] = {
  36. 0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,//未命名文件0
  37. 0x00,0x00,0x02,0x04,0x00,0x00,0x00,0x00,//未命名文件0
  38. 0x00,0x02,0x02,0x04,0x00,0x00,0x00,0x00,//未命名文件0
  39. 0x04,0x02,0x02,0x04,0x00,0x00,0x00,0x00,//未命名文件0
  40. 0x0C,0x02,0x02,0x04,0x00,0x00,0x00,0x00,//未命名文件0
  41. 0x0C,0x12,0x02,0x04,0x00,0x00,0x00,0x00,//未命名文件0
  42. 0x0C,0x12,0x22,0x04,0x00,0x00,0x00,0x00,//未命名文件0
  43. 0x0C,0x12,0x22,0x44,0x00,0x00,0x00,0x00,//未命名文件0
  44. 0x0C,0x12,0x22,0x44,0x40,0x00,0x00,0x00,//未命名文件0
  45. 0x0C,0x12,0x22,0x44,0x40,0x20,0x00,0x00,//未命名文件0
  46. 0x0C,0x12,0x22,0x44,0x40,0x20,0x10,0x00,//未命名文件0
  47. 0x0C,0x12,0x22,0x44,0x40,0x20,0x10,0x08,//未命名文件0
  48. 0x0C,0x12,0x22,0x44,0x40,0x20,0x10,0x0C,//未命名文件0
  49. 0x0C,0x12,0x22,0x44,0x40,0x20,0x12,0x0C,//未命名文件0
  50. 0x0C,0x12,0x22,0x44,0x40,0x22,0x12,0x0C,//未命名文件0
  51. 0x0C,0x12,0x22,0x44,0x44,0x22,0x12,0x0C,//未命名文件0
  52. };
  53. u8 count;        // 移动速度
  54. u8 foodx,foody;  // 食物坐标
  55. u8 snake_Len=4;  // 蛇的总长度
  56. u8 direction=1;
  57. // 蛇的移动方向  1, 向上;2, 向下;3, 向左; 4, 向右
  58. // 设置开发板上8*8点阵 右下角为坐标原点
  59. // 向上为Y轴,向左为X轴
  60. u8 code Hc595_Coordx[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
  61. // 0111 1111
  62. u8 code Hc595_Coordy[8] = {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
  63. // 1000 0000
  64. ///////////////////////////////////////////////////////////
  65. // 51内核单片机内存较小,蛇的总长度暂定最大40
  66. // 可予以忽略,重点是效果
  67. // 初始化蛇长为4,如下数组中定义
  68. u8 snake_Coordx[40]= {1, 1, 1, 1}; // 蛇的每一点的横坐标
  69. u8 snake_Coordy[40]= {3, 2, 1, 0}; // 蛇的每一点的纵坐标

  70. /*******************************************************************************
  71. * 函 数 名      : T0_Init(void)
  72. * 函数功能                  : 定时器T0初始化函数
  73. * 输    入      : None
  74. * 输    出      : None
  75. * 相关说明                        :None
  76. *******************************************************************************/
  77. void T0_Init(void)
  78. {
  79.     TMOD = 0X01;
  80.     TL0 = (65535-50000)%256;
  81.     TH0 = (65535-50000)/256;
  82.     ET0 = 1;
  83.     TR0 = 1;
  84.     EA = 1;
  85. }

  86. /*******************************************************************************
  87. * 函 数 名      : interrupt_T0(void)
  88. * 函数功能                  : 定时器T0中断服务函数
  89. * 输    入      : None
  90. * 输    出      : None
  91. * 相关说明                        :None
  92. *******************************************************************************/
  93. void interrupt_T0() interrupt 1
  94. {

  95.     TL0 = (65535-50000)%256;  // 50ms定时
  96.     TH0 = (65535-50000)/256;
  97.     count++;
  98.     if(count == 15)  //15
  99.     {
  100.         count = 0;
  101.         snake_Move();
  102.     }
  103. }

  104. /*******************************************************************************
  105. * 函 数 名      : delay(u16 i)
  106. * 函数功能                  : 软件延时函数
  107. * 输    入      : u16 i
  108. * 输    出      : None
  109. * 相关说明                        :软件延时,不精确
  110. *******************************************************************************/
  111. void delay (u16 i)
  112. {
  113.     while(i--);
  114. }

  115. void Send_Byte(u8 dat)
  116. {
  117.         unsigned char i;
  118.         LEDARRAY_CLK = 0;
  119.         _nop_();       
  120.         LEDARRAY_LAT = 0;
  121.         _nop_();

  122.         for( i = 0 ; i < 8 ; i++ )
  123.         {
  124.                 if( dat&0x01 )
  125.                 {
  126.                         LEDARRAY_DI = 1;       
  127.                 }
  128.                 else
  129.                 {
  130.                         LEDARRAY_DI = 0;
  131.                 }
  132.                
  133.                 LEDARRAY_CLK = 1;                                //上升沿发送数据
  134.                 //                                _nop_();
  135.                 LEDARRAY_CLK = 0;
  136.                 //                                _nop_();
  137.                                
  138.                 dat >>= 1;                       
  139.         }               
  140. }



  141.        
  142. void xin(void)
  143. {
  144.        
  145.         for(j = 0 ; j < 16 ; j++)
  146.         {
  147.                 for(i = 0 ; i < 10 ; i++)
  148.                 {
  149.                         temp = 0x7f;
  150.                         for(w = 0 ; w < 8 ; w++)                //一个字母8BYTE
  151.                         {
  152.                                 Send_Byte(temp);                        //列选择
  153.                                 Send_Byte(Display_xin[j][w]);                        //行数据
  154.                                 LEDARRAY_LAT = 1;                                        //锁存数据
  155.                                 _nop_();
  156.                                 LEDARRAY_LAT = 0;
  157.                                 _nop_();
  158.                                 temp = (temp>>1)|0x80;
  159.                         }
  160.                 }
  161.         }
  162. while(1)
  163.         {
  164.                 //H心
  165.                 for(i = 0 ; i < 900 ; i++)
  166.                 {
  167.                         temp = 0x7f;
  168.                         for(w = 0 ; w < 8 ; w++)                //一个字母8BYTE
  169.                         {
  170.                                 Send_Byte(temp);                        //列选择
  171.                                 Send_Byte(Display_word[0][w]);                        //行数据
  172.                                 LEDARRAY_LAT = 1;                                        //锁存数据
  173.                                 _nop_();
  174.                        
  175.                                 LEDARRAY_LAT = 0;
  176.                                 _nop_();
  177.                                 temp = (temp>>1)|0x80;
  178.                         }
  179.                 }
  180.                 //L心
  181.                 for(i = 0 ; i < 400 ; i++)
  182.                 {
  183.                         temp = 0x7f;
  184.                         for(w = 0 ; w < 8 ; w++)                //一个字母8BYTE
  185.                         {
  186.                                 Send_Byte(temp);                        //列选择
  187.                                 Send_Byte(Display_word[1][w]);                        //行数据
  188.                                 LEDARRAY_LAT = 1;                                        //锁存数据
  189.                                 _nop_();
  190.                        
  191.                                 LEDARRAY_LAT = 0;
  192.                                 _nop_();
  193.                                 temp = (temp>>1)|0x80;
  194.                         }
  195.                 }
  196.                                                        
  197.         }}
  198. /*******************************************************************************
  199. * 函 数 名      : snake_Move(void)
  200. * 函数功能                  : 蛇前进函数
  201. * 输    入      : None
  202. * 输    出      : None
  203. * 相关说明                        :None
  204. *******************************************************************************/
  205. void snake_Move(void)
  206. {
  207.     u8 len = snake_Len - 1;
  208.     for(len; len > 0; len--)
  209.     {
  210.         snake_Coordx[len] = snake_Coordx[len - 1];
  211.         snake_Coordy[len] = snake_Coordy[len - 1];
  212.     }
  213.     switch(direction)
  214.     {
  215.     case 1:
  216.         snake_Coordy[0]++;
  217.         break;
  218.     case 2:
  219.         snake_Coordy[0]--;
  220.         break;
  221.     case 3:
  222.         snake_Coordx[0]++;
  223.         break;
  224.     case 4:
  225.         snake_Coordx[0]--;
  226.         break;
  227.     default:
  228.         break;
  229.     }
  230. }

  231. /*******************************************************************************
  232. * 函 数 名      : Hc595SendByte(u8 dat)
  233. * 函数功能                  : 74HC595发送数据函数
  234. * 输    入      : dat 8位数据
  235. * 输    出      : None
  236. * 相关说明                        :None
  237. *******************************************************************************/


  238. void Clear_LEDmatrix()
  239. {               
  240.         char i,temp;
  241.         temp = 0x7f;
  242.         for(i = 0 ; i < 8 ; i++)                //一个字母8BYTE
  243.         {
  244.                 Send_Byte(temp);                        //列选择
  245.                 Send_Byte(0);                        //行数据
  246.                 LEDARRAY_LAT = 1;                                        //锁存数据
  247.                 _nop_();
  248.        
  249.                 LEDARRAY_LAT = 0;
  250.                 _nop_();
  251.                 temp = (temp>>1)|0x80;
  252.         }       
  253. }
  254. /*******************************************************************************
  255. * 函 数 名      : creatFood()
  256. * 函数功能                  : 创建食物函数
  257. * 输    入      : None
  258. * 输    出      : None
  259. * 相关说明                        :None
  260. *******************************************************************************/
  261. void creatFood()
  262. {
  263.     u8 i;
  264.     foodx=rand()%8;
  265.     foody=rand()%8;
  266.        
  267.        
  268.        
  269.     for(i=0; i<snake_Len; i++)
  270.     {
  271.         if((foodx==snake_Coordx[i])&&(foody==snake_Coordy[i]))
  272.                                 {
  273.                                     creatFood();
  274.                                 }      
  275.     }
  276. }

  277. /*******************************************************************************
  278. * 函 数 名      : JudgeDeath()
  279. * 函数功能                  : 判断死亡函数
  280. * 输    入      : None
  281. * 输    出      : None
  282. * 相关说明                        :None
  283. *******************************************************************************/
  284. void JudgeDeath(void)
  285. {
  286.     u8 i;

  287.     // 判断蛇撞墙死亡
  288.     if((snake_Coordx[0]>7)||(snake_Coordy[0]>7))
  289.     {
  290.         xin();
  291.     }

  292.     // 判断蛇撞到自身死亡
  293.     for(i=4; i<snake_Len; i++)
  294.     {
  295.         if((snake_Coordx[0]==snake_Coordx[i])&&(snake_Coordy[0]==snake_Coordy[i]))
  296.         {
  297.             xin();
  298.         }
  299.     }
  300. }

  301. /*******************************************************************************
  302. * 函 数 名      : void TurnDirection(void)
  303. * 函数功能                  : 方向改变函数
  304. * 输    入      : None
  305. * 输    出      : None
  306. * 相关说明                        :None
  307. *******************************************************************************/
  308. void TurnDirection(void)
  309. {
  310.                    initadc();
  311.                 //inituart();
  312.                 heng=getadcresult(0);
  313.                 shu=getadcresult(1);
  314.         if(shu<70)
  315.         {
  316.             if(direction==3||direction==4)
  317.             {
  318.                 direction=2;
  319.             }
  320.         }
  321.    
  322.    
  323.         if(shu>225)
  324.         {
  325.             if(direction==3||direction==4)
  326.             {
  327.                 direction=1;
  328.             }
  329.         }
  330.    
  331.    
  332.         if(heng>225)
  333.         {
  334.             if(direction==1||direction==2)
  335.             {
  336.                 direction=3;
  337.             }
  338.         }
  339.    
  340.    
  341.         if(heng<70)
  342.         {
  343.             if(direction==1||direction==2)
  344.             {
  345.                 direction=4;
  346.             }
  347.         }
  348.    
  349. }

  350. /*******************************************************************************
  351. * 函 数 名      : void snake_Grow(void)
  352. * 函数功能                  : 蛇成长函数
  353. * 输    入      : None
  354. * 输    出      : None
  355. * 相关说明                        :None
  356. *******************************************************************************/
  357. void snake_Grow(void)
  358. {
  359.     if(snake_Coordx[0] == foodx && snake_Coordy[0] == foody)
  360.     {
  361.         creatFood();
  362.         snake_Coordx[snake_Len] = snake_Coordx[snake_Len - 1];
  363.         snake_Coordy[snake_Len] = snake_Coordy[snake_Len - 1];
  364.         snake_Len++;
  365.     }
  366. }







  367.        


  368. /*******************************************************************************
  369. * 函 数 名      : main(void)
  370. * 函数功能                  : 主程序
  371. * 输    入      : None
  372. * 输    出      : None
  373. * 相关说明                        :None
  374. *******************************************************************************/
  375. void main()
  376. {
  377.     u16 q,k;
  378.         Clear_LEDmatrix();
  379. for(q = 0 ; q < 2000 ; q++)
  380.         {
  381.                 temp = 0x7f;
  382.                 for(k = 0 ; k < 8 ; k++)                //一个字母8BYTE
  383.                 {
  384.                         Send_Byte(temp);                        //列选择
  385.                         Send_Byte(Display_word[2][k]);                        //行数据
  386.                         LEDARRAY_LAT = 1;                                        //锁存数据
  387.                         _nop_();
  388.                
  389.                         LEDARRAY_LAT = 0;
  390.                         _nop_();
  391.                         temp = (temp>>1)|0x80;
  392.                 }
  393.         }
  394.                 //2
  395.         for(q = 0 ; q < 2000 ; q++)
  396.         {
  397.                 temp = 0x7f;
  398.                 for(k = 0 ; k < 8 ; k++)                //一个字母8BYTE
  399.                 {
  400.                         Send_Byte(temp);                        //列选择
  401.                         Send_Byte(Display_word[3][k]);                        //行数据
  402.                         LEDARRAY_LAT = 1;                                        //锁存数据
  403.                         _nop_();
  404.                
  405.                         LEDARRAY_LAT = 0;
  406.                         _nop_();
  407.                         temp = (temp>>1)|0x80;
  408.                 }
  409.         }
  410.                 //1
  411.         for(q = 0 ; q < 2000 ; q++)
  412.         {
  413.                 temp = 0x7f;
  414.                 for(k = 0 ; k < 8 ; k++)                //一个字母8BYTE
  415.                 {
  416.                         Send_Byte(temp);                        //列选择
  417.                         Send_Byte(Display_word[4][k]);                        //行数据
  418.                         LEDARRAY_LAT = 1;                                        //锁存数据
  419.                         _nop_();
  420.                
  421.                         LEDARRAY_LAT = 0;
  422.                         _nop_();
  423.                         temp = (temp>>1)|0x80;
  424.                 }
  425.         }

  426.         Clear_LEDmatrix();
  427.     T0_Init();
  428.     creatFood();
  429. while(1)
  430. {

  431.         if(sw==0)
  432.         {
  433.         for(i=10;i>0;i--)
  434.         for(j=110;j>0;j--);
  435.         if(sw==0)
  436.         TR0=~TR0;
  437.         while(!sw);
  438.         }

  439.         for(i=0; i<snake_Len; i++)
  440.         {
  441.             // 在点阵屏幕上显示蛇的位置
  442.                     Send_Byte(Hc595_Coordx[snake_Coordx[i]]);
  443.                     Send_Byte(Hc595_Coordy[snake_Coordy[i]]);
  444.                                 LEDARRAY_LAT = 1;                                        //锁存数据
  445.                         _nop_();
  446.                
  447.                         LEDARRAY_LAT = 0;
  448.                         _nop_();
  449.                 }
  450.             delay(20);            
  451.                    Send_Byte(Hc595_Coordx[foodx]);
  452.             Send_Byte(Hc595_Coordy[foody]);
  453.                         LEDARRAY_LAT = 1;                                        //锁存数据
  454.                         _nop_();
  455.                
  456.                         LEDARRAY_LAT = 0;
  457.                         _nop_();
  458.             delay(20);            
  459.          
  460.          
  461.         
  462.         TurnDirection();  // 是否改变方向
  463.         JudgeDeath();     // 判断是否死亡
  464.         snake_Grow();     // 判断是否成长

  465.     }
  466. }
复制代码
回复

使用道具 举报

ID:500421 发表于 2019-4-29 21:34 | 显示全部楼层
大家有问题可以问哈!
回复

使用道具 举报

ID:500421 发表于 2019-5-1 08:53 | 显示全部楼层
那个oledmain.h是我不小心加进去的。。。。。
大家可以把那个删了。
回复

使用道具 举报

ID:526100 发表于 2019-5-4 15:13 | 显示全部楼层
可以给我一下按键的代码吗?我不知道这么改
回复

使用道具 举报

ID:526100 发表于 2019-5-4 15:27 | 显示全部楼层
怎么才能修改成按键控制的?
回复

使用道具 举报

ID:526100 发表于 2019-5-4 15:33 | 显示全部楼层
怎么修改成按键控制?
回复

使用道具 举报

ID:500421 发表于 2019-5-5 14:05 | 显示全部楼层
wyl004 发表于 2019-5-4 15:33
怎么修改成按键控制?

你现在有没有建成多文件格式.c  .h这样的, 先把TurnDirection函数中heng=getadcresult(0);
                shu=getadcresult(1);去掉,再把4个if改成摁键的模式(if(key1=0))这样的。
然后把有关12芯片的函数,定义删了就行了,就像getadcresult函数。
回复

使用道具 举报

ID:526100 发表于 2019-5-18 11:37 | 显示全部楼层
可以给我一份完整的代码吗?我改了几次不成功,谢谢!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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