標(biāo)題: arduino按鍵版本貪吃蛇程序 [打印本頁(yè)]

作者: 無(wú)痕1234    時(shí)間: 2018-1-23 13:07
標(biāo)題: arduino按鍵版本貪吃蛇程序
  1. /*==============================================================================================================
  2. *        @function_name:        貪吃蛇
  3. *        @描述:        MAX7219 8*8 點(diǎn)陣LED

  4. *        @作者:        @逝水無(wú)痕@
  5. *        @日期:        2018-01-02

  6. *----------------------------------------------------------------------------------------------------------------
  7. *        @修改人:
  8. *        @修改內(nèi)容:
  9. ================================================================================================================*/
  10. #include "LedControl.h"                                                                                        //點(diǎn)陣控制庫(kù)   
  11.                                     
  12. int SpeedS = 8;                                                                                                        // 貪吃蛇的初始速度
  13. int Socre;                                                                                                                // 游戲得分

  14. int Left;                                                                                                                //定義五個(gè)按鍵,上下左右
  15. int Right;
  16. int Up;
  17. int Down;
  18. int Res;                                                                                                                //游戲中用來(lái)加速,游戲結(jié)束用來(lái)重新開始游戲

  19. int Enabled;                                                                                                        // 重啟游戲使能
  20. int FX, FY;                                                                                                                // 食物的坐標(biāo)
  21. int SX, SY;                                                                                                                // 蛇頭的坐標(biāo)
  22. int KEY, K;                                                                                                                // 當(dāng)前按鍵碼和實(shí)際按鍵碼

  23. LedControl lc=LedControl(12,11,10,1);                                                        //初始化設(shè)備,引腳連接 (din,clk,cs,點(diǎn)陣個(gè)數(shù))

  24. char s[129] = {};                                                                                                // 蛇身體坐標(biāo)集合,一共64個(gè)點(diǎn),二維坐標(biāo)128個(gè)元素 其中0沒(méi)有用到 故為129個(gè)元素
  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,};        //標(biāo)準(zhǔn)臉

  38. /******************************************************************************************************************/
  39. void setup()
  40. {
  41.         //pinMode(zPin, INPUT);
  42.         RANDOM();                                                                                                        // 獲取一個(gè)隨機(jī)食物坐標(biāo)
  43.         K = 0;                                                                                                                // 初始化按鍵碼,實(shí)際上就是行進(jìn)方向 方向初始化為0 即在首次操作按鍵前 蛇不移動(dòng)
  44.   
  45.         s[1] = 2;                                                                                                        // x3        初始化蛇的身體坐標(biāo)
  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的初始設(shè)置
  54.         lc.shutdown(0,false);                                                                                //設(shè)置節(jié)電模式,設(shè)備號(hào)從0開始,false 不節(jié)電
  55.         lc.setIntensity(0,2);                                                                                //設(shè)置亮度
  56.         lc.clearDisplay(0);                                                                                        //清屏
  57.         printByte(smile);                                                                                        //顯示笑臉  
  58.         delay(2000);
  59.       
  60.         /*循環(huán)繪制蛇的身體,實(shí)際上就是3個(gè)點(diǎn) */
  61.         for(int i = 1; i <= 6; i += 2)                                                                // 從蛇頭開始繪制三個(gè)點(diǎn) s[1], s[3], s[5]為x坐標(biāo) s[2], s[4], s[6]為y坐標(biāo) 蛇身排序: {s[5],s[6]}  {s[3],s[4]}  {s[1],s[2]} (右側(cè)為蛇頭)
  62.         {
  63.                 lc.setLed(0,s[i],s[i + 1],1);                                                        //(設(shè)備號(hào) 行 列 亮)
  64.         }
  65. }

  66. /*****************************************************隨機(jī)食物獲取函數(shù) ***********************************************************************/  
  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)                    // 防止食物出現(xiàn)在蛇身上
  74.         {
  75.                 if( FX == s[i] and FY == s[i + 1])
  76.                 goto A;                              
  77.         }
  78. }

  79. /**************這個(gè)是延時(shí)函數(shù),實(shí)際上通過(guò)不斷閃現(xiàn)食物來(lái)完成延遲,這樣既可以做到精確延時(shí),也可以讓食物不斷閃動(dòng),來(lái)讓大家不斷的看到 ***************************/  
  80. void myDelay( int Time)                                                                         // 在蛇移動(dòng)的延時(shí)期間 我們要做一些事情 比如食物的閃爍和按鍵方向的讀取
  81. {                              
  82.         for(int t = 1; t <= Time; t++)
  83.         {
  84.                 lc.setLed(0,FX,FY,1);                                                                //設(shè)備號(hào) 行 列 亮
  85.                 delay(50);
  86.                 lc.setLed(0,FX,FY,0);                                                                //設(shè)備號(hào) 行 列 亮      
  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) // 這里是在比對(duì)按鍵方向是否和目前蛇的行進(jìn)方向相反,如果相反就放棄按鍵
  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.         {         // 首次操作按鍵前 不能向左移動(dòng)蛇
  110.                 K = 4;
  111.     }
  112.         else if(Right == 0 && KEY != 4)
  113.         {
  114.                 K = 6;
  115.         }
  116.         if(Res == LOW)                                                                         // 當(dāng)按下中央鍵后 速度變?yōu)?2  松開后 速度恢復(fù)到當(dāng)前值
  117.         SpeedS = 2;      
  118.         else  
  119.         SpeedS = 8 - Socre / 5;
  120. }
  121. /************************************GameOver函數(shù),顯示游戲結(jié)束和得分 ******************************************************************************/

  122. void gameover()                                                                                                        // 一旦執(zhí)行到Gameover 程序停止 需要按下重啟鍵后以重啟游戲
  123. {                                      
  124.         Enabled = 0;
  125.         while(Enabled == 0)
  126.         {
  127.                   lc.clearDisplay(0);                                                                                //清屏
  128.                 printByte(neutral);                                                                                //顯示標(biāo)準(zhǔn)臉  
  129.                 delay(1000);
  130.                
  131.                 lc.clearDisplay(0);                                                                                //清屏               
  132.                 printfSocre(Socre);                                                                                //顯示分?jǐn)?shù)
  133.                 delay(1000);
  134.                
  135.                 Res = digitalRead(6);                                                                        //如果重啟鍵按下,跳出循環(huán),重啟游戲
  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;               // 重置蛇的坐標(biāo)
  153.         Socre = 0;              // 重置游戲得分
  154. }

  155. /********************************************主函數(shù)***************************************************************************************/  
  156. void loop()
  157. {
  158.         KEY = K;                                      // 蛇每移動(dòng)一次 方向才能改變一次
  159.         lc.clearDisplay(0);
  160.       
  161.         if(KEY == 8)                                  // 蛇向上運(yùn)動(dòng)
  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)                                // 超出邊框的從另一邊繼續(xù)出現(xiàn)
  170.                 s[2] = 7;
  171.         }
  172.         else if(KEY == 5)                             // 蛇向下運(yùn)動(dòng)
  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)                                // 超出邊框的從另一邊繼續(xù)出現(xiàn)
  181.                 s[2] = 0;
  182.         }
  183.         else if(KEY == 4)                             // 蛇向左運(yùn)動(dòng)
  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)                                // 超出邊框的從另一邊繼續(xù)出現(xiàn)
  192.                 s[1] = 7;
  193.         }
  194.         else if(KEY == 6)                             // 蛇向右運(yùn)動(dòng)
  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)                                                                                        // 超出邊框的從另一邊繼續(xù)出現(xiàn)
  203.                 s[1] = 0;
  204.         }
  205.         // 根據(jù)按鍵來(lái)移動(dòng)蛇的身體
  206.   
  207.         for(int i = 1; i <= 6 + 2 * Socre; i+= 2)                                        // 從蛇頭開始繪制
  208.         {
  209.                 lc.setLed(0,s[i],s[i + 1],1);                                                        //設(shè)備號(hào) 行 列 亮      
  210.         }      
  211.         myDelay(SpeedS);                                                                                        //()內(nèi)為延時(shí)次數(shù) 延時(shí)一次為100ms  實(shí)測(cè)200ms速度很合適 故將加速時(shí)速度設(shè)置為 2  
  212.       
  213.         SX = s[1];
  214.         SY = s[2];
  215.         // 獲取蛇頭的坐標(biāo)
  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.         // 判斷蛇頭是否碰到自己的身體,碰到就跳轉(zhuǎn)到GameOver
  223.   
  224.         if(SY == FY && SX == FX)
  225.         {
  226.                 Socre ++;
  227.                 RANDOM();
  228.                 if( !(Socre % 5))                                                                 // 根據(jù)得分加快蛇的速度 每吃5個(gè)食物 速度快100ms
  229.                 {                       
  230.                         SpeedS --;
  231.                         if(SpeedS < 2)                                                                // 速度下限為200ms 如果速度小于200ms 速度值仍為200ms
  232.                                 SpeedS = 2;
  233.                 }
  234.         }                                                                                                        // 判斷是否吃到了食物~吃到了就會(huì)加分和重新隨機(jī)生成食物~
  235. }

  236. //點(diǎn)陣顯示函數(shù)  
  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. /************************************顯示分?jǐn)?shù)子函數(shù)******************************************************/      
  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. }
復(fù)制代碼

作者: 無(wú)痕1234    時(shí)間: 2018-1-23 13:12
說(shuō)好的黒幣呢,怎么沒(méi)給我,想下載的
作者: songxia8013    時(shí)間: 2018-12-23 21:29
這程序不全,沒(méi)有頭文件,也沒(méi)圖!感覺(jué)不怎么好!




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1