久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2831|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩在线视频一区 | 男人天堂视频在线观看 | 免费啪啪| 九九热这里只有精品在线观看 | 精品欧美一区二区三区精品久久 | 欧美日韩国产精品一区二区 | 91大片| 久久国产电影 | 91在线网站 | 国产精品99久久久久久久久久久久 | 91日日| 狠狠艹| 国产精品中文字幕一区二区三区 | 国产在线观看一区二区 | 99资源| 91欧美精品成人综合在线观看 | 欧美成人精品二区三区99精品 | 日本精品视频 | 欧州一区二区 | 国产专区在线 | 久久日本 | 视频一二区 | 国产成人免费视频网站视频社区 | av在线二区| 91一区二区三区在线观看 | 亚洲精品视频三区 | 欧美精品中文字幕久久二区 | 少妇精品久久久久久久久久 | 成人久草 | 久久99国产精一区二区三区 | 毛片综合| 久久精品国产一区二区电影 | 国产精品视频在线观看 | 午夜国产一级片 | 日韩欧美中文在线 | 狠狠干天天干 | 精品久久av| 国产午夜精品久久 | av久久| 不卡一区二区在线观看 | 亚洲一区二区三区在线免费 |