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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 15024|回復(fù): 18
打印 上一主題 下一主題
收起左側(cè)

Arduino UNO U8glib貪吃蛇游戲設(shè)計(jì)與制作 附程序

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
本次是以小實(shí)驗(yàn)的方式寫的,對(duì)于模塊不了解的,可以先看一下我們的模塊教程,了解掌握模塊使用方法后,再嘗試本小實(shí)驗(yàn)。該小實(shí)驗(yàn)僅供思維學(xué)習(xí)擴(kuò)展

所需材料:
UNO 主控版一塊
按鍵模塊6
0.96oled i2c ssd1306
==接線方式==
OLED顯示屏                       Arduino
VCC                                       5V
GND                                     GND
SDA                                        A4
SCL                                         A5

———————————————-
按鍵                                   Arduino
上                                         D5
下                                         D4
左                                         D3
右                                         D2
A(開(kāi)始/確定鍵)                 D8
B(暫無(wú),可不接)               D9
==操作說(shuō)明==
模塊上電后進(jìn)入歡迎界面,按方向鍵上或下,可以選擇snake或者player,按下A鍵,進(jìn)入相應(yīng)的界面。
snake:貪吃蛇游戲
player:按鍵信息(暫無(wú),可開(kāi)發(fā))。
貪吃蛇:通過(guò)上下左右控制方向,吃食物。觸壁會(huì)死!!!!


Arduino源程序如下:
  1. #include "U8glib.h"//引用U8G頭文件
  2. U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE);//設(shè)置設(shè)備名稱:I2C-SSD1306-128*64(OLED)
  3. /***********************************************/
  4. #define UP 5//定義方向鍵上為Arduino上的D5號(hào)引腳
  5. #define DOWN 4//定義方向鍵上為Arduino上的D4號(hào)引腳
  6. #define LEFT 3//定義方向鍵上為Arduino上的D3號(hào)引腳
  7. #define RIGHT 2//定義方向鍵上為Arduino上的D2號(hào)引腳
  8. #define A 8//定義方向鍵上為Arduino上的D8號(hào)引腳
  9. #define B 9//定義方向鍵上為Arduino上的D9號(hào)引腳(暫時(shí)不用)
  10. /***********************************************/
  11. int box_x = 0;//定義變量
  12. int box_y = 0;//定義變量
  13. //int box_width = 2;
  14. int box_x_length = 98;//x方向32  0-31
  15. int box_y_length = 62;//y方向20  0-19
  16. int snake_max_length = 100; //蛇身體最大長(zhǎng)度
  17. int snake_x[100];//蛇身x坐標(biāo)
  18. int snake_y[100];//蛇身y坐標(biāo)
  19. int snake_body_width = 3; //蛇身方塊寬度(正方形)
  20. int food_x;//食物位置坐標(biāo)x
  21. int food_y;//食物位置坐標(biāo)y
  22. int snake_length = 3; //定義初始化蛇身長(zhǎng)度
  23. unsigned int game_speed;//設(shè)置游戲速度
  24. /***********************************************/
  25. void setup(void)
  26. {
  27.    pinMode(UP, INPUT_PULLUP);//定義方向UP引腳狀態(tài)
  28.    pinMode(DOWN, INPUT_PULLUP);//定義方向DOWN引腳狀態(tài)
  29.    pinMode(LEFT, INPUT_PULLUP);//定義方向LEFT引腳狀態(tài)
  30.    pinMode(RIGHT, INPUT_PULLUP);//定義方向RIGHT引腳狀態(tài)
  31.    pinMode(A, INPUT_PULLUP);//定義按鍵A引腳狀態(tài)
  32.    pinMode(B, INPUT_PULLUP);//定義按鍵B引腳狀態(tài)
  33.    welcome();//歡迎界面
  34.    delay(2500);
  35.    chose_game();//選擇界面
  36. }
  37. /***********************************************/
  38. void welcome()
  39. {
  40.    u8g.firstPage();//第一頁(yè)顯示
  41.    do
  42.    {
  43.      u8g.setFont(u8g_font_gdr14r);//坐標(biāo)函數(shù)
  44.      u8g.setPrintPos(0, 20);
  45.      u8g.print("Snake Game");
  46.      u8g.setPrintPos(0, 38);
  47.      u8g.print("             v2.0");
  48.      u8g.setFont(u8g_font_9x18);
  49.      u8g.setPrintPos(0, 55);
  50.      u8g.print("Formatmemory");
  51.    } while (u8g.nextPage());
  52. }
  53. /***********************************************/
  54. int chose_game()//對(duì)選擇界面進(jìn)行定義
  55. {
  56.    int flag = 1;
  57.    int temp = 1;
  58.    while (flag)
  59.    {
  60.      int key = read_key();
  61.      if (key == UP)
  62.      {
  63.        u8g.firstPage();
  64.        do
  65.        {
  66.          u8g.setFont(u8g_font_9x18);
  67.          u8g.setPrintPos(5, 20);
  68.          u8g.print("Snake  <");
  69.          u8g.setPrintPos(5, 40);
  70.          u8g.print("Player");
  71.        } while (u8g.nextPage());
  72.        temp = 1;
  73.      }
  74.      if (key == DOWN)
  75.      {
  76.        u8g.firstPage();
  77.        do
  78.        {
  79.          u8g.setFont(u8g_font_9x18);
  80.          u8g.setPrintPos(5, 20);
  81.          u8g.print("Snake");
  82.          u8g.setPrintPos(5, 40);
  83.          u8g.print("Player <");
  84.        } while (u8g.nextPage());
  85.        temp = 2;
  86.      }
  87.      if (key == A)
  88.      {
  89.        return temp;
  90.      }
  91.    }
  92. }
  93. /***********************************************/
  94. int read_key()//對(duì)按鍵進(jìn)行定義
  95. {
  96.    int key_temp;
  97.    if (digitalRead(UP) == LOW) {
  98.      key_temp = UP;
  99.      return key_temp;
  100.    }
  101.    if (digitalRead(DOWN) == LOW) {
  102.      key_temp = DOWN;
  103.      return key_temp;
  104.    }
  105.    if (digitalRead(LEFT) == LOW) {
  106.      key_temp = LEFT;
  107.      return key_temp;
  108.    }
  109.    if (digitalRead(RIGHT) == LOW) {
  110.      key_temp = RIGHT;
  111.      return key_temp;
  112.    }
  113.    if (digitalRead(A) == LOW) {
  114.      key_temp = A;
  115.      return key_temp;
  116.    }
  117.    if (digitalRead(B) == LOW) {
  118.      key_temp = B;
  119.      return key_temp;
  120.    }
  121.    return 0;
  122. }
  123. /***********************************************/
  124. void game_over()//對(duì)游戲結(jié)束進(jìn)行定義
  125. {
  126.    u8g.firstPage();
  127.    do
  128.    {
  129.      u8g.setFont(u8g_font_gdr14r);
  130.      u8g.setPrintPos(0, 40);
  131.      u8g.print(" GAME OVER!");
  132.      }
  133.       
  134.    while (u8g.nextPage());  
  135.    snake_length=3;
  136.    snake_x[0] = 15; snake_y[0] = 15;//snake起始坐標(biāo)
  137.    snake_x[1] = snake_x[0]  - 1; snake_y[1] = snake_y[0];//snake起始坐標(biāo)
  138.    snake_x[2] = snake_x[1]  - 1; snake_y[2] = snake_y[1];//snake起始坐標(biāo)
  139. }

  140. void snake()//對(duì)貪吃蛇參數(shù)進(jìn)行定義
  141. {
  142.    int flag = 1; //標(biāo)志
  143.    snake_x[0] = 15; snake_y[0] = 15;//snake起始坐標(biāo)
  144.    snake_x[1] = snake_x[0]  - 1; snake_y[1] = snake_y[0];//snake起始坐標(biāo)
  145.    snake_x[2] = snake_x[1]  - 1; snake_y[2] = snake_y[1];//snake起始坐標(biāo)
  146.    int snake_dir=RIGHT;//初始方向 right
  147.    game_speed=30;
  148.    int food_flag=1;
  149.    Serial.println("snake!");
  150.    food();
  151.    while (flag)
  152.    {
  153.      snake_frame(game_speed);
  154.      delay(game_speed);
  155.      switch(read_key())
  156.      {
  157.        case UP:
  158.          if(snake_dir!=DOWN)
  159.          {
  160.            snake_dir=UP;
  161.            break;
  162.          }
  163.        case DOWN:
  164.          if(snake_dir!=UP)
  165.          {
  166.            snake_dir=DOWN;
  167.            break;
  168.          }
  169.          case LEFT:
  170.          if(snake_dir!=RIGHT)
  171.          {
  172.            snake_dir=LEFT;
  173.            break;
  174.          }
  175.          case RIGHT:
  176.          if(snake_dir!=LEFT)
  177.          {
  178.            snake_dir=RIGHT;
  179.            break;
  180.          }
  181.          default:break;
  182.      }
  183.      if(snake_eat_food(snake_dir)==1)
  184.      {
  185.        food();
  186.        if(snake_length<10){game_speed=30;}
  187.        if(snake_length<30&&snake_length>=10){game_speed=20;}
  188.        if(snake_length<50&&snake_length>=30){game_speed=10;}
  189.        if(snake_length>=50){game_speed=0;}
  190.      }
  191.      else
  192.      {
  193.        if(snake_knock_wall(snake_dir==1))
  194.        {
  195.          game_over();
  196.          flag=0;
  197.        }
  198.        else
  199.        {
  200.          if(snake_eat_body(snake_dir)==1)
  201.          {
  202.            game_over();
  203.            flag=0;
  204.          }
  205.          else
  206.          {
  207.            change_con(snake_dir);
  208.          }
  209.        }
  210.      }
  211.    }
  212. }

  213. void snake_frame(int s)
  214. {
  215.    u8g.firstPage();
  216.    do
  217.    {
  218.      u8g.drawFrame(box_x, box_y, box_x_length, box_y_length);
  219.      u8g.setFont(u8g_font_5x8);
  220.      u8g.setPrintPos(box_x_length + 1, 12);
  221.      u8g.print("Score");
  222.      u8g.setPrintPos(box_x_length + 1, 22);
  223.      u8g.print((snake_length - 3) * 5);
  224.      u8g.setPrintPos(box_x_length + 1, 46);
  225.      u8g.print("Speed");
  226.      u8g.setPrintPos(box_x_length + 1, 56);
  227.      u8g.print(30-s);
  228.      u8g.drawFrame(food_x*snake_body_width+1, food_y*snake_body_width+1, snake_body_width, snake_body_width);//顯示食物
  229.      for (int i = 0; i < snake_length; i++)//顯示snake
  230.      {
  231.        if(i==0)
  232.        {
  233.          u8g.drawBox(snake_x[i]*snake_body_width+1, snake_y[i]*snake_body_width+1, snake_body_width, snake_body_width);
  234.        }
  235.        else
  236.        {
  237.          u8g.drawFrame(snake_x[i]*snake_body_width+1, snake_y[i]*snake_body_width+1, snake_body_width, snake_body_width);
  238.        }
  239.      }
  240.    } while (u8g.nextPage());
  241. }

  242. void food()//對(duì)實(shí)物進(jìn)行定義
  243. {
  244.    int flag = 1;
  245.    while (flag)
  246.    {
  247.      food_x = random(0,(box_x_length-2)/3);
  248.      food_y = random(0,(box_y_length-2)/3);
  249.      for (int i = 0; i < snake_length; i++)
  250.      {
  251.          if((food_x==snake_x[i])&&(food_y==snake_y[i]))
  252.          {
  253.            break;
  254.          }
  255.          flag=0;
  256.      }
  257.    }
  258. //  Serial.print("food_x:");
  259. //  Serial.print(food_x);
  260. //  Serial.print(" food_y:");
  261. //  Serial.println(food_y);m
  262. }

  263. void change_con(int DIR)//移動(dòng)坐標(biāo)函數(shù)
  264. {
  265.    int temp_x[snake_length+2];
  266.    int temp_y[snake_length+2];
  267.    for(int i=0;i<snake_length-1;i++)//將舊坐標(biāo)數(shù)據(jù)存放到temp數(shù)組  最后一位數(shù)據(jù)無(wú)效
  268.    {
  269.      temp_x[i]=snake_x[i];
  270.      temp_y[i]=snake_y[i];
  271.    }
  272.    switch(DIR)
  273.    {
  274.      case RIGHT: {snake_x[0]+=1;break;}
  275.      case LEFT: {snake_x[0]-=1;break;}
  276.      case UP: {snake_y[0]-=1;break;}
  277.      case DOWN: {snake_y[0]+=1;break;}
  278.    }
  279.    for(int i=1;i<snake_length;i++)
  280.    {
  281.      snake_x[i]=temp_x[i-1];
  282.      snake_y[i]=temp_y[i-1];
  283.    }
  284. }

  285. void change_pos()//吃到東西后移動(dòng)函數(shù)
  286. {
  287.    int temp_x[snake_length+2];
  288.    int temp_y[snake_length+2];
  289.    for(int i=0;i<snake_length-1;i++)//將舊坐標(biāo)數(shù)據(jù)存放到temp數(shù)組  最后一位數(shù)據(jù)無(wú)效
  290.    {
  291.      temp_x[i]=snake_x[i];
  292.      temp_y[i]=snake_y[i];
  293.    }
  294.    snake_x[0]=food_x;
  295.    snake_y[0]=food_y;
  296.    for(int i=1;i<snake_length;i++)
  297.    {
  298.      snake_x[i]=temp_x[i-1];
  299.      snake_y[i]=temp_y[i-1];
  300.    }
  301. }
  302. //判斷是否吃到食物 0-沒(méi)有吃到 1-吃到 2-無(wú)效
  303. int snake_eat_food(int dir)
  304. {
  305.    int x_temp=snake_x[0];
  306.    int y_temp=snake_y[0];
  307.    switch(dir)
  308.    {
  309.      case UP :y_temp-=1;break;
  310.      case DOWN :y_temp+=1;break;
  311.      case LEFT :x_temp-=1;break;
  312.      case RIGHT :x_temp+=1;break;
  313.    }
  314.    if((x_temp==food_x)&&(y_temp==food_y))
  315.    {
  316.        snake_length+=1;
  317.        change_pos();
  318.        return 1;
  319.    }
  320.    else
  321.    {
  322.      return 0;
  323.    }
  324. }
  325. //判斷是否撞墻 0-沒(méi)有撞到 1-撞到 2-無(wú)效
  326. int snake_knock_wall(int dir)
  327. {
  328. …………
  329. …………
  330. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
tanshishe.zip (2.59 KB, 下載次數(shù): 124)


評(píng)分

參與人數(shù) 2黑幣 +105 收起 理由
啦啦啦嘟嘟 + 5
admin + 100 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂2 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:295090 發(fā)表于 2018-3-27 10:41 | 只看該作者
兄弟,把你的代碼粘貼到Arduino中調(diào)試出現(xiàn)這個(gè)問(wèn)題,求解決

錯(cuò)誤.png (2.15 KB, 下載次數(shù): 177)

錯(cuò)誤.png
回復(fù)

使用道具 舉報(bào)

板凳
ID:255921 發(fā)表于 2018-3-29 20:20 | 只看該作者
ssss1234 發(fā)表于 2018-3-27 10:41
兄弟,把你的代碼粘貼到Arduino中調(diào)試出現(xiàn)這個(gè)問(wèn)題,求解決

你開(kāi)發(fā)板型號(hào)啊 選nano
回復(fù)

使用道具 舉報(bào)

地板
ID:313997 發(fā)表于 2018-4-25 00:24 | 只看該作者
按鍵腳怎么接
回復(fù)

使用道具 舉報(bào)

5#
ID:319356 發(fā)表于 2018-4-30 14:18 | 只看該作者
支持一下!!
回復(fù)

使用道具 舉報(bào)

6#
ID:317322 發(fā)表于 2018-5-1 09:40 | 只看該作者
學(xué)習(xí)一下,字?jǐn)?shù)補(bǔ)丁
回復(fù)

使用道具 舉報(bào)

7#
ID:322213 發(fā)表于 2018-5-4 16:45 | 只看該作者
謝謝樓主分享
回復(fù)

使用道具 舉報(bào)

8#
ID:330315 發(fā)表于 2018-5-15 13:22 | 只看該作者
好東東呀
回復(fù)

使用道具 舉報(bào)

9#
ID:349602 發(fā)表于 2018-6-20 15:14 | 只看該作者
henlihai henyoubangzhu
回復(fù)

使用道具 舉報(bào)

10#
ID:355570 發(fā)表于 2018-6-20 22:10 | 只看該作者
鏈接:https://pan.baidu.com/s/1shSINmNxyEVF92AIvrIKjQ 密碼:qeyb
樓主分享的文件,后來(lái)人,沒(méi)有黒幣的,這個(gè)下載
回復(fù)

使用道具 舉報(bào)

11#
ID:356931 發(fā)表于 2018-8-19 18:00 | 只看該作者
請(qǐng)問(wèn)整個(gè)線路怎么連啊?開(kāi)關(guān)什么的
回復(fù)

使用道具 舉報(bào)

12#
ID:539976 發(fā)表于 2019-5-16 16:44 | 只看該作者
葉耀雷 發(fā)表于 2018-6-20 22:10
鏈接:https://pan.baidu.com/s/1shSINmNxyEVF92AIvrIKjQ 密碼:qeyb
樓主分享的文件,后來(lái)人,沒(méi)有黒幣的 ...

兄弟打不開(kāi),能再發(fā)一下嗎
回復(fù)

使用道具 舉報(bào)

13#
ID:603158 發(fā)表于 2019-8-27 11:44 | 只看該作者

謝謝樓主分享
回復(fù)

使用道具 舉報(bào)

14#
ID:411959 發(fā)表于 2019-9-23 20:37 | 只看該作者
我編譯有問(wèn)題,,,難受
回復(fù)

使用道具 舉報(bào)

15#
ID:618235 發(fā)表于 2019-9-30 08:57 | 只看該作者
感謝分享
回復(fù)

使用道具 舉報(bào)

16#
ID:671876 發(fā)表于 2019-12-23 22:46 來(lái)自手機(jī) | 只看該作者
正好需要,謝謝樓主分享。
回復(fù)

使用道具 舉報(bào)

17#
ID:526888 發(fā)表于 2020-1-3 09:01 | 只看該作者
謝謝分享,不過(guò)型號(hào)要對(duì)應(yīng)!!!!
回復(fù)

使用道具 舉報(bào)

18#
ID:742604 發(fā)表于 2020-5-2 00:59 | 只看該作者
請(qǐng)問(wèn)proteus上要怎么接線呀
回復(fù)

使用道具 舉報(bào)

19#
ID:235954 發(fā)表于 2021-1-20 09:42 | 只看該作者
     //判斷當(dāng)前的位置跟食物的位置,掃描蛇身,有只相同會(huì)繼續(xù)掃描。      for (int i = 0; i < snake_length; i++)      {           flag=0;          if((food_x==snake_x[i])&&(food_y==snake_y[i]))          {             flag=1;//相同繼續(xù)循環(huán)          // break;          }               }          }
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日韩在线视频一区二区三区 | 99久久精品国产毛片 | 欧美日韩亚洲在线 | 精品国产伦一区二区三区观看说明 | 国产精品国产三级国产aⅴ入口 | 国产伦一区二区三区四区 | 亚洲精品无 | 亚洲精选久久 | 国产ts人妖另类 | 国产日韩一区二区三区 | 亚洲精品在线视频 | 成人在线日韩 | 午夜激情视频 | 中文字幕在线一区二区三区 | 成人av片在线观看 | 午夜欧美一区二区三区在线播放 | 久久9热 | 欧美三区| 91日日| 欧美aⅴ在线观看 | 91精品久久久久久久久中文字幕 | 成人国产精品久久 | 国产成人一区二 | 国产成人在线一区二区 | 成人毛片在线观看 | 亚洲视频免费一区 | 国产二区精品视频 | 亚洲一区二区在线视频 | 在线观看国产wwwa级羞羞视频 | av在线播放免费 | 一区二区三区视频在线 | 精品欧美一区二区三区 | 精品1区2区| 天天操天天干天天爽 | 成人三级视频在线观看 | 精品欧美一区二区三区精品久久 | 久久久久黄色 | 日韩中文字幕网 | 国产福利在线小视频 | 欧美日韩不卡合集视频 | 欧美中文字幕一区二区三区 |