找回密码
 立即注册

QQ登录

只需一步,快速开始

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

arduino按键版本贪吃蛇程序

[复制链接]
跳转到指定楼层
楼主
ID:235676 发表于 2018-1-23 13:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. /*==============================================================================================================
  2. *        @function_name:        贪吃蛇
  3. *        @描述:        MAX7219 8*8 点阵LED

  4. *        @作者:        @逝水无痕@
  5. *        @日期:        2018-01-02

  6. *----------------------------------------------------------------------------------------------------------------
  7. *        @修改人:
  8. *        @修改内容:
  9. ================================================================================================================*/
  10. #include "LedControl.h"                                                                                        //点阵控制库   
  11.                                     
  12. int SpeedS = 8;                                                                                                        // 贪吃蛇的初始速度
  13. int Socre;                                                                                                                // 游戏得分

  14. int Left;                                                                                                                //定义五个按键,上下左右
  15. int Right;
  16. int Up;
  17. int Down;
  18. int Res;                                                                                                                //游戏中用来加速,游戏结束用来重新开始游戏

  19. int Enabled;                                                                                                        // 重启游戏使能
  20. int FX, FY;                                                                                                                // 食物的坐标
  21. int SX, SY;                                                                                                                // 蛇头的坐标
  22. int KEY, K;                                                                                                                // 当前按键码和实际按键码

  23. LedControl lc=LedControl(12,11,10,1);                                                        //初始化设备,引脚连接 (din,clk,cs,点阵个数)

  24. char s[129] = {};                                                                                                // 蛇身体坐标集合,一共64个点,二维坐标128个元素 其中0没有用到 故为129个元素
  25. //字符的模
  26. byte zero[8] = {0x18,0x24,0x42,0x42,0x42,0x42,0x24,0x18,};                //0  
  27. byte one[8]  = {0x10,0x18,0x14,0x10,0x10,0x10,0x10,0x38,};                //1
  28. byte two[8]  = {0x18,0x24,0x20,0x20,0x10,0x08,0x04,0x3C,};                //2  
  29. byte three[8]= {0x18,0x24,0x20,0x38,0x38,0x20,0x24,0x18,};                //3  
  30. byte four[8] = {0x10,0x18,0x14,0x12,0x3E,0x10,0x10,0x10,};                //4  
  31. byte five[8] = {0x3C,0x04,0x0C,0x10,0x20,0x20,0x24,0x18,};                //5  
  32. byte six[8]  = {0x1C,0x22,0x02,0x1E,0x22,0x22,0x22,0x1C,};                //6  
  33. byte seven[8]= {0x7E,0x20,0x10,0x08,0x08,0x08,0x08,0x08,};                //7  
  34. byte eight[8]= {0x18,0x24,0x24,0x24,0x18,0x24,0x24,0x18,};                //8  
  35. byte nine[8] = {0x18,0x24,0x24,0x24,0x38,0x10,0x08,0x04,};                //9
  36. byte smile[8]= {0x3C,0x42,0xA5,0x81,0xA5,0x99,0x42,0x3C,};                //笑脸
  37. byte neutral[8]=  {0x3C,0x42,0xA5,0x81,0xBD,0x81,0x42,0x3C,};        //标准脸

  38. /******************************************************************************************************************/
  39. void setup()
  40. {
  41.         //pinMode(zPin, INPUT);
  42.         RANDOM();                                                                                                        // 获取一个随机食物坐标
  43.         K = 0;                                                                                                                // 初始化按键码,实际上就是行进方向 方向初始化为0 即在首次操作按键前 蛇不移动
  44.   
  45.         s[1] = 2;                                                                                                        // x3        初始化蛇的身体坐标
  46.         s[2] = 2;                                                                                                        // y3
  47.         s[3] = 1;                                                                                                        // x2
  48.         s[4] = 2;                                                                                                        // y2
  49.         s[5] = 0;                                                                                                        // x1
  50.         s[6] = 2;                                                                                                        // y1
  51.   
  52.         Socre = 0;                                                                                                        // 游戏起始得分
  53.         //MAX7219的初始设置
  54.         lc.shutdown(0,false);                                                                                //设置节电模式,设备号从0开始,false 不节电
  55.         lc.setIntensity(0,2);                                                                                //设置亮度
  56.         lc.clearDisplay(0);                                                                                        //清屏
  57.         printByte(smile);                                                                                        //显示笑脸  
  58.         delay(2000);
  59.       
  60.         /*循环绘制蛇的身体,实际上就是3个点 */
  61.         for(int i = 1; i <= 6; i += 2)                                                                // 从蛇头开始绘制三个点 s[1], s[3], s[5]为x坐标 s[2], s[4], s[6]为y坐标 蛇身排序: {s[5],s[6]}  {s[3],s[4]}  {s[1],s[2]} (右侧为蛇头)
  62.         {
  63.                 lc.setLed(0,s[i],s[i + 1],1);                                                        //(设备号 行 列 亮)
  64.         }
  65. }

  66. /*****************************************************随机食物获取函数 ***********************************************************************/  
  67. void RANDOM()
  68. {
  69.         A:   
  70.                 FX = random(0, 7);
  71.                 FY = random(0, 7);
  72.   
  73.         for(int i = 1; i <= 6 + 2 * Socre; i+= 2)                    // 防止食物出现在蛇身上
  74.         {
  75.                 if( FX == s[i] and FY == s[i + 1])
  76.                 goto A;                              
  77.         }
  78. }

  79. /**************这个是延时函数,实际上通过不断闪现食物来完成延迟,这样既可以做到精确延时,也可以让食物不断闪动,来让大家不断的看到 ***************************/  
  80. void myDelay( int Time)                                                                         // 在蛇移动的延时期间 我们要做一些事情 比如食物的闪烁和按键方向的读取
  81. {                              
  82.         for(int t = 1; t <= Time; t++)
  83.         {
  84.                 lc.setLed(0,FX,FY,1);                                                                //设备号 行 列 亮
  85.                 delay(50);
  86.                 lc.setLed(0,FX,FY,0);                                                                //设备号 行 列 亮      
  87.                 delay(50);
  88.                 Button();                                                                                        // 读取摇杆方向        
  89.   }
  90. }

  91. // /***************************************************************************************************************************************************************************************************************/

  92. void Button()
  93. {
  94.         Up   = digitalRead(2);                                                                        //读取按键的值
  95.         Down = digitalRead(3);
  96.         Left = digitalRead(4);
  97.         Right= digitalRead(5);
  98.         Res  = digitalRead(6);
  99.       
  100.         if(Up == 0 && KEY != 5) // 这里是在比对按键方向是否和目前蛇的行进方向相反,如果相反就放弃按键
  101.         {
  102.                 K = 8;
  103.         }
  104.         else if(Down == 0 && KEY != 8)
  105.         {
  106.                 K = 5;
  107.     }
  108.         else if(Left == 0 && KEY != 6 && K != 0)
  109.         {         // 首次操作按键前 不能向左移动蛇
  110.                 K = 4;
  111.     }
  112.         else if(Right == 0 && KEY != 4)
  113.         {
  114.                 K = 6;
  115.         }
  116.         if(Res == LOW)                                                                         // 当按下中央键后 速度变为 2  松开后 速度恢复到当前值
  117.         SpeedS = 2;      
  118.         else  
  119.         SpeedS = 8 - Socre / 5;
  120. }
  121. /************************************GameOver函数,显示游戏结束和得分 ******************************************************************************/

  122. void gameover()                                                                                                        // 一旦执行到Gameover 程序停止 需要按下重启键后以重启游戏
  123. {                                      
  124.         Enabled = 0;
  125.         while(Enabled == 0)
  126.         {
  127.                   lc.clearDisplay(0);                                                                                //清屏
  128.                 printByte(neutral);                                                                                //显示标准脸  
  129.                 delay(1000);
  130.                
  131.                 lc.clearDisplay(0);                                                                                //清屏               
  132.                 printfSocre(Socre);                                                                                //显示分数
  133.                 delay(1000);
  134.                
  135.                 Res = digitalRead(6);                                                                        //如果重启键按下,跳出循环,重启游戏
  136.                 if(Res == 0)
  137.                 {
  138.                         Enabled=1;
  139.                 }
  140.     }

  141.         lc.clearDisplay(0);                                //清屏
  142.         for(int i = 0; i < 129; i++)
  143.         {
  144.                 s[i] = 0;
  145.         }
  146.         K = 0;                  // 重置方向
  147.         s[1] = 2;
  148.         s[2] = 2;
  149.         s[3] = 1;
  150.         s[4] = 2;
  151.         s[5] = 0;
  152.         s[6] = 2;               // 重置蛇的坐标
  153.         Socre = 0;              // 重置游戏得分
  154. }

  155. /********************************************主函数***************************************************************************************/  
  156. void loop()
  157. {
  158.         KEY = K;                                      // 蛇每移动一次 方向才能改变一次
  159.         lc.clearDisplay(0);
  160.       
  161.         if(KEY == 8)                                  // 蛇向上运动
  162.         {
  163.                 for(int i = 6 + 2 * Socre; i > 3; i= i - 2)
  164.                 {
  165.                         s[i] = s[i - 2];
  166.                         s[i - 1] = s[i - 3];
  167.                 }
  168.                 s[2] = s[2] - 1;
  169.                 if(s[2] < 0)                                // 超出边框的从另一边继续出现
  170.                 s[2] = 7;
  171.         }
  172.         else if(KEY == 5)                             // 蛇向下运动
  173.         {
  174.                 for(int i = 6 + 2 * Socre; i > 3; i= i - 2)
  175.                 {
  176.                         s[i] = s[i - 2];
  177.                         s[i - 1] = s[i - 3];
  178.                 }
  179.                 s[2] = s[2] + 1;
  180.                 if(s[2] > 7)                                // 超出边框的从另一边继续出现
  181.                 s[2] = 0;
  182.         }
  183.         else if(KEY == 4)                             // 蛇向左运动
  184.         {
  185.                 for(int i = 6 + 2 * Socre; i > 3; i= i - 2)
  186.                 {
  187.                         s[i] = s[i - 2];
  188.                         s[i - 1] = s[i - 3];
  189.                 }
  190.                 s[1] = s[1] - 1;
  191.                 if(s[1] < 0)                                // 超出边框的从另一边继续出现
  192.                 s[1] = 7;
  193.         }
  194.         else if(KEY == 6)                             // 蛇向右运动
  195.         {
  196.                 for(int i = 6 + 2 * Socre; i > 3; i= i - 2)
  197.                 {
  198.                         s[i] = s[i - 2];
  199.                         s[i - 1] = s[i - 3];
  200.                 }
  201.                 s[1] = s[1] + 1;
  202.                 if(s[1] > 7)                                                                                        // 超出边框的从另一边继续出现
  203.                 s[1] = 0;
  204.         }
  205.         // 根据按键来移动蛇的身体
  206.   
  207.         for(int i = 1; i <= 6 + 2 * Socre; i+= 2)                                        // 从蛇头开始绘制
  208.         {
  209.                 lc.setLed(0,s[i],s[i + 1],1);                                                        //设备号 行 列 亮      
  210.         }      
  211.         myDelay(SpeedS);                                                                                        //()内为延时次数 延时一次为100ms  实测200ms速度很合适 故将加速时速度设置为 2  
  212.       
  213.         SX = s[1];
  214.         SY = s[2];
  215.         // 获取蛇头的坐标
  216.   
  217.         for(int i = 3; i <= 6 + 2 * Socre; i+= 2)
  218.         {
  219.                 if( SX == s[i] && SY == s[i + 1])
  220.                 gameover();                              
  221.         }
  222.         // 判断蛇头是否碰到自己的身体,碰到就跳转到GameOver
  223.   
  224.         if(SY == FY && SX == FX)
  225.         {
  226.                 Socre ++;
  227.                 RANDOM();
  228.                 if( !(Socre % 5))                                                                 // 根据得分加快蛇的速度 每吃5个食物 速度快100ms
  229.                 {                       
  230.                         SpeedS --;
  231.                         if(SpeedS < 2)                                                                // 速度下限为200ms 如果速度小于200ms 速度值仍为200ms
  232.                                 SpeedS = 2;
  233.                 }
  234.         }                                                                                                        // 判断是否吃到了食物~吃到了就会加分和重新随机生成食物~
  235. }

  236. //点阵显示函数  
  237. void printByte(byte character [])  
  238. {  
  239.         int i = 0;  
  240.         for(i=0;i<8;i++)  
  241.         {  
  242.                 lc.setRow(0,i,character[i]);  
  243.         }  
  244. }
  245. /************************************显示分数子函数******************************************************/      
  246. void printfSocre(int socre)
  247. {
  248.         int tens_place = socre/10;
  249.         int ones_place = socre%10;
  250.         switch(tens_place)
  251.         {
  252.                 //case 0:printByte(zero);delay(1000);        break;                                                                                                //十位不显示0
  253.                 case 1:printByte(one);        delay(1000);        break;
  254.                 case 2:printByte(two);        delay(1000);        break;
  255.                 case 3:printByte(three);delay(1000);        break;
  256.                 case 4:printByte(four);        delay(1000);        break;
  257.                 case 5:printByte(five);        delay(1000);        break;
  258.                 case 6:printByte(six);        delay(1000);        break;
  259.                 case 7:printByte(seven);delay(1000);        break;
  260.                 case 8:printByte(eight);delay(1000);        break;
  261.                 case 9:printByte(nine);        delay(1000);        break;
  262.                 default:break;
  263.         }
  264.       
  265.         switch(ones_place)
  266.         {
  267.                 case 0:printByte(zero);        delay(1000);        break;
  268.                 case 1:printByte(one);        delay(1000);        break;
  269.                 case 2:printByte(two);        delay(1000);        break;
  270.                 case 3:printByte(three);delay(1000);        break;
  271.                 case 4:printByte(four);        delay(1000);        break;
  272.                 case 5:printByte(five);        delay(1000);        break;
  273.                 case 6:printByte(six);        delay(1000);        break;
  274.                 case 7:printByte(seven);delay(1000);        break;
  275.                 case 8:printByte(eight);delay(1000);        break;
  276.                 case 9:printByte(nine);        delay(1000);        break;
  277.                 default:break;
  278.         }               
  279.       
  280. }
复制代码

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:235676 发表于 2018-1-23 13:12 | 只看该作者
说好的黒币呢,怎么没给我,想下载的
回复

使用道具 举报

板凳
ID:102963 发表于 2018-12-23 21:29 | 只看该作者
这程序不全,没有头文件,也没图!感觉不怎么好啊!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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