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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 15018|回復: 18
收起左側

Arduino UNO U8glib貪吃蛇游戲設計與制作 附程序

  [復制鏈接]
ID:255921 發表于 2018-1-18 20:45 | 顯示全部樓層 |閱讀模式
本次是以小實驗的方式寫的,對于模塊不了解的,可以先看一下我們的模塊教程,了解掌握模塊使用方法后,再嘗試本小實驗。該小實驗僅供思維學習擴展
Open-Live-WriterArduino_81C420171223151414_11_thumb.jpg
所需材料:
UNO 主控版一塊
按鍵模塊6
0.96oled i2c ssd1306
==接線方式==
OLED顯示屏                       Arduino
VCC                                       5V
GND                                     GND
SDA                                        A4
SCL                                         A5

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


Arduino源程序如下:
  1. #include "U8glib.h"//引用U8G頭文件
  2. U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE);//設置設備名稱:I2C-SSD1306-128*64(OLED)
  3. /***********************************************/
  4. #define UP 5//定義方向鍵上為Arduino上的D5號引腳
  5. #define DOWN 4//定義方向鍵上為Arduino上的D4號引腳
  6. #define LEFT 3//定義方向鍵上為Arduino上的D3號引腳
  7. #define RIGHT 2//定義方向鍵上為Arduino上的D2號引腳
  8. #define A 8//定義方向鍵上為Arduino上的D8號引腳
  9. #define B 9//定義方向鍵上為Arduino上的D9號引腳(暫時不用)
  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; //蛇身體最大長度
  17. int snake_x[100];//蛇身x坐標
  18. int snake_y[100];//蛇身y坐標
  19. int snake_body_width = 3; //蛇身方塊寬度(正方形)
  20. int food_x;//食物位置坐標x
  21. int food_y;//食物位置坐標y
  22. int snake_length = 3; //定義初始化蛇身長度
  23. unsigned int game_speed;//設置游戲速度
  24. /***********************************************/
  25. void setup(void)
  26. {
  27.    pinMode(UP, INPUT_PULLUP);//定義方向UP引腳狀態
  28.    pinMode(DOWN, INPUT_PULLUP);//定義方向DOWN引腳狀態
  29.    pinMode(LEFT, INPUT_PULLUP);//定義方向LEFT引腳狀態
  30.    pinMode(RIGHT, INPUT_PULLUP);//定義方向RIGHT引腳狀態
  31.    pinMode(A, INPUT_PULLUP);//定義按鍵A引腳狀態
  32.    pinMode(B, INPUT_PULLUP);//定義按鍵B引腳狀態
  33.    welcome();//歡迎界面
  34.    delay(2500);
  35.    chose_game();//選擇界面
  36. }
  37. /***********************************************/
  38. void welcome()
  39. {
  40.    u8g.firstPage();//第一頁顯示
  41.    do
  42.    {
  43.      u8g.setFont(u8g_font_gdr14r);//坐標函數
  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()//對選擇界面進行定義
  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()//對按鍵進行定義
  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()//對游戲結束進行定義
  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起始坐標
  137.    snake_x[1] = snake_x[0]  - 1; snake_y[1] = snake_y[0];//snake起始坐標
  138.    snake_x[2] = snake_x[1]  - 1; snake_y[2] = snake_y[1];//snake起始坐標
  139. }

  140. void snake()//對貪吃蛇參數進行定義
  141. {
  142.    int flag = 1; //標志
  143.    snake_x[0] = 15; snake_y[0] = 15;//snake起始坐標
  144.    snake_x[1] = snake_x[0]  - 1; snake_y[1] = snake_y[0];//snake起始坐標
  145.    snake_x[2] = snake_x[1]  - 1; snake_y[2] = snake_y[1];//snake起始坐標
  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()//對實物進行定義
  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)//移動坐標函數
  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++)//將舊坐標數據存放到temp數組  最后一位數據無效
  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()//吃到東西后移動函數
  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++)//將舊坐標數據存放到temp數組  最后一位數據無效
  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-沒有吃到 1-吃到 2-無效
  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-沒有撞到 1-撞到 2-無效
  326. int snake_knock_wall(int dir)
  327. {
  328. …………
  329. …………
  330. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

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


評分

參與人數 2黑幣 +105 收起 理由
啦啦啦嘟嘟 + 5
admin + 100 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:295090 發表于 2018-3-27 10:41 | 顯示全部樓層
兄弟,把你的代碼粘貼到Arduino中調試出現這個問題,求解決
錯誤.png
回復

使用道具 舉報

ID:255921 發表于 2018-3-29 20:20 | 顯示全部樓層
ssss1234 發表于 2018-3-27 10:41
兄弟,把你的代碼粘貼到Arduino中調試出現這個問題,求解決

你開發板型號啊 選nano
回復

使用道具 舉報

ID:313997 發表于 2018-4-25 00:24 | 顯示全部樓層
按鍵腳怎么接
回復

使用道具 舉報

ID:319356 發表于 2018-4-30 14:18 | 顯示全部樓層
支持一下!!
回復

使用道具 舉報

ID:317322 發表于 2018-5-1 09:40 | 顯示全部樓層
學習一下,字數補丁
回復

使用道具 舉報

ID:322213 發表于 2018-5-4 16:45 | 顯示全部樓層
謝謝樓主分享
回復

使用道具 舉報

ID:330315 發表于 2018-5-15 13:22 | 顯示全部樓層
好東東呀
回復

使用道具 舉報

ID:349602 發表于 2018-6-20 15:14 | 顯示全部樓層
henlihai henyoubangzhu
回復

使用道具 舉報

ID:355570 發表于 2018-6-20 22:10 | 顯示全部樓層
鏈接:https://pan.baidu.com/s/1shSINmNxyEVF92AIvrIKjQ 密碼:qeyb
樓主分享的文件,后來人,沒有黒幣的,這個下載
回復

使用道具 舉報

ID:356931 發表于 2018-8-19 18:00 | 顯示全部樓層
請問整個線路怎么連啊?開關什么的
回復

使用道具 舉報

ID:539976 發表于 2019-5-16 16:44 | 顯示全部樓層
葉耀雷 發表于 2018-6-20 22:10
鏈接:https://pan.baidu.com/s/1shSINmNxyEVF92AIvrIKjQ 密碼:qeyb
樓主分享的文件,后來人,沒有黒幣的 ...

兄弟打不開,能再發一下嗎
回復

使用道具 舉報

ID:603158 發表于 2019-8-27 11:44 | 顯示全部樓層

謝謝樓主分享
回復

使用道具 舉報

ID:411959 發表于 2019-9-23 20:37 | 顯示全部樓層
我編譯有問題,,,難受
回復

使用道具 舉報

ID:618235 發表于 2019-9-30 08:57 | 顯示全部樓層
感謝分享
回復

使用道具 舉報

ID:671876 發表于 2019-12-23 22:46 來自手機 | 顯示全部樓層
正好需要,謝謝樓主分享。
回復

使用道具 舉報

ID:526888 發表于 2020-1-3 09:01 | 顯示全部樓層
謝謝分享,不過型號要對應!!!!
回復

使用道具 舉報

ID:742604 發表于 2020-5-2 00:59 | 顯示全部樓層
請問proteus上要怎么接線呀
回復

使用道具 舉報

ID:235954 發表于 2021-1-20 09:42 | 顯示全部樓層
     //判斷當前的位置跟食物的位置,掃描蛇身,有只相同會繼續掃描。      for (int i = 0; i < snake_length; i++)      {           flag=0;          if((food_x==snake_x[i])&&(food_y==snake_y[i]))          {             flag=1;//相同繼續循環          // break;          }               }          }
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: av中文网| 精品久久久久一区二区国产 | 天天弄 | 四虎影院美女 | 欧美久久久久 | 欧美久久一区 | 成人精品鲁一区一区二区 | 久久99久久99久久 | 国产午夜在线 | av福利网| 日韩在线播放一区 | 欧美在线一区二区三区 | 一区二区三区四区视频 | 在线中文字幕亚洲 | 精品一区二区三区四区外站 | 国产精品www | 欧美精品成人 | av大片| 日韩中文在线观看 | 久久高清免费视频 | 一区二区中文字幕 | 91私密视频 | 午夜视频免费在线观看 | 日本aa毛片a级毛片免费观看 | 久久久国产一区 | 亚洲一区二区三区四区五区中文 | 日韩激情网 | 国产在线一区二区三区 | 天天夜干 | 成人做爰69片免费观看 | 日韩电影一区二区三区 | 亚洲看片 | 日韩一二区在线 | 97国产在线观看 | 国家一级黄色片 | 亚洲精品一区二区三区在线观看 | 午夜天堂精品久久久久 | 久久久久久国模大尺度人体 | 欧美6一10sex性hd | 91啪亚洲精品 | 国产色爽 |