找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4510|回复: 3
收起左侧

PS2游戏杆控制的游戏代码以及连接线

[复制链接]
ID:235954 发表于 2021-1-23 15:02 | 显示全部楼层 |阅读模式
#include "U8glib.h"//引用U8G头文件
//PS2
int JoyStick_X = A0; //定义PS2摇杆的X轴,ANALOG IN的A0,上下
int JoyStick_Y = A1; //定义PS2摇杆的Y轴,ANALOG IN的A1,左右
int JoyStick_Z = A2; //定义PS2摇杆的Z轴,ANALOG IN的A2,确认/开始
//I2C_OLED
SCL,ANALOG IN的A4
SDA,
ANALOG IN的A5

1.png

接好线,信号的线就五根,接在ARDUINO的A0-A5上。

视频下载:
视频.7z (2.11 MB, 下载次数: 5)
51hei.png
回复

使用道具 举报

ID:328014 发表于 2021-1-23 17:55 | 显示全部楼层
缺少代码啊,楼主能分享一下代码吗?
回复

使用道具 举报

ID:235954 发表于 2021-1-24 17:26 | 显示全部楼层
  1. #include "U8glib.h"//引用U8G头文件
  2. U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE);//设置设备名称:I2C-SSD1306-128*64(OLED)
  3. #define UP    5//定义方向键上
  4. #define DOWN  4//定义方向键下
  5. #define LEFT  3//定义方向键左
  6. #define RIGHT 2//定义方向键右
  7. #define A 8    //定义开始确定按键
  8. //PS2
  9. int JoyStick_X = A0; //定义PS2摇杆的X轴,ANALOG IN的A0
  10. int JoyStick_Y = A1; //定义PS2摇杆的Y轴,ANALOG IN的A1
  11. int JoyStick_Z = A2; //定义PS2摇杆的Z轴,ANALOG IN的A2

  12. /***********************************************/
  13. int box_x = 0;//定义变量
  14. int box_y = 0;//定义变量
  15. //int box_width = 2;
  16. int box_x_length = 98;//x方向32  0-31
  17. int box_y_length = 62;//y方向20  0-19
  18. int snake_max_length = 100; //蛇身体最大长度
  19. int snake_x[100];//蛇身x坐标
  20. int snake_y[100];//蛇身y坐标
  21. int snake_body_width = 3; //蛇身方块宽度(正方形)
  22. int food_x;//食物位置坐标x
  23. int food_y;//食物位置坐标y
  24. int snake_length = 3; //定义初始化蛇身长度
  25. unsigned int game_speed;//设置游戏速度
  26. /***********************************************/
  27. void setup(void)
  28. {
  29.   
  30.   pinMode(JoyStick_X, INPUT);
  31.   pinMode(JoyStick_Y, INPUT);
  32.   pinMode(JoyStick_Z, INPUT);
  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.   int   x=analogRead(JoyStick_X);
  98.   int   y=analogRead(JoyStick_Y);
  99.   int   z=digitalRead(JoyStick_Z);
  100.    if (x>850) {
  101.      key_temp = DOWN;
  102.      return key_temp;
  103.    }
  104.    if (x<250) {
  105.      key_temp = UP;
  106.      return key_temp;
  107.    }
  108.    if (y>850) {
  109.      key_temp = LEFT;
  110.      return key_temp;
  111.    }
  112.    if (y<250) {
  113.      key_temp = RIGHT;
  114.      return key_temp;
  115.    }889888888888888I888888888888888888888888888888888888888888888888888888888888I8I88888888I8II
  116.    if (z == HIGH) {
  117.      key_temp = A;
  118.      return key_temp;
  119.    }
  120.    return 0;
  121. }
  122. /***********************************************/
  123. void game_over()//对游戏结束进行定义
  124. {
  125.    u8g.firstPage();
  126.    do
  127.    {
  128.      u8g.setFont(u8g_font_gdr14r);
  129.      u8g.setPrintPos(0, 40);
  130.      u8g.print(" GAME OVER!");
  131.      }
  132.       
  133.    while (u8g.nextPage());  
  134.    snake_length=3;
  135.    snake_x[0] = 15; snake_y[0] = 15;//snake起始坐标
  136.    snake_x[1] = snake_x[0]  - 1; snake_y[1] = snake_y[0];//snake起始坐标
  137.    snake_x[2] = snake_x[1]  - 1; snake_y[2] = snake_y[1];//snake起始坐标
  138. }

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

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

  241. void food()//对实物进行定义
  242. {
  243.    int flag = 1;
  244.    while (flag)
  245.    {
  246.      food_x = random(0,(box_x_length-2)/3);
  247.      food_y = random(0,(box_y_length-2)/3);
  248.      for (int i = 0; i < snake_length; i++)
  249.      {
  250.          if((food_x==snake_x[i])&&(food_y==snake_y[i]))
  251.          {
  252.            break;
  253.          }
  254.          flag=0;
  255.      }
  256.    }
  257. //  Serial.print("food_x:");
  258. //  Serial.print(food_x);
  259. //  Serial.print(" food_y:");
  260. //  Serial.println(food_y);
  261. }

  262. void change_con(int DIR)//移动坐标函数
  263. {
  264.    int temp_x[snake_length+2];
  265.    int temp_y[snake_length+2];
  266.    for(int i=0;i<snake_length-1;i++)//将旧坐标数据存放到temp数组  最后一位数据无效
  267.    {
  268.      temp_x[i]=snake_x[i];
  269.      temp_y[i]=snake_y[i];
  270.    }
  271.    switch(DIR)
  272.    {
  273.      case RIGHT: {snake_x[0]+=1;break;}
  274.      case LEFT: {snake_x[0]-=1;break;}
  275.      case UP: {snake_y[0]-=1;break;}
  276.      case DOWN: {snake_y[0]+=1;break;}
  277.    }
  278.    for(int i=1;i<snake_length;i++)
  279.    {
  280.      snake_x[i]=temp_x[i-1];
  281.      snake_y[i]=temp_y[i-1];
  282.    }
  283. }

  284. void change_pos()//吃到东西后移动函数
  285. {
  286.    int temp_x[snake_length+2];
  287.    int temp_y[snake_length+2];
  288.    for(int i=0;i<snake_length-1;i++)//将旧坐标数据存放到temp数组  最后一位数据无效
  289.    {
  290.      temp_x[i]=snake_x[i];
  291.      temp_y[i]=snake_y[i];
  292.    }
  293.    snake_x[0]=food_x;
  294.    snake_y[0]=food_y;
  295.    for(int i=1;i<snake_length;i++)
  296.    {
  297.      snake_x[i]=temp_x[i-1];
  298.      snake_y[i]=temp_y[i-1];
  299.    }
  300. }
  301. //判断是否吃到食物 0-没有吃到 1-吃到 2-无效
  302. int snake_eat_food(int dir)
  303. {
  304.    int x_temp=snake_x[0];
  305.    int y_temp=snake_y[0];
  306.    switch(dir)
  307.    {
  308.      case UP :y_temp-=1;break;
  309.      case DOWN :y_temp+=1;break;
  310.      case LEFT :x_temp-=1;break;
  311.      case RIGHT :x_temp+=1;break;
  312.    }
  313.    if((x_temp==food_x)&&(y_temp==food_y))
  314.    {
  315.        snake_length+=1;
  316.        change_pos();
  317.        return 1;
  318.    }
  319.    else
  320.    {
  321.      return 0;
  322.    }
  323. }
  324. //判断是否撞墙 0-没有撞到 1-撞到 2-无效
  325. int snake_knock_wall(int dir)
  326. {
  327.    int x_temp=snake_x[0];
  328.    int y_temp=snake_y[0];
  329.    switch(dir)
  330.    {
  331.      case UP :y_temp-=1;break;
  332.      case DOWN :y_temp+=1;break;
  333.      case LEFT :x_temp-=1;break;
  334.      case RIGHT :x_temp+=1;break;
  335.    }
  336.    if(x_temp<0||x_temp>31||y_temp<0||y_temp>19)
  337.    {
  338.      return 1;
  339.    }
  340.    else
  341.    {
  342.      return 0;
  343.    }
  344. }
  345. //判断是否吃到自己 0-没有吃到 1-吃到 2-无效
  346. int snake_eat_body(int dir)
  347. {
  348.    int x_temp=snake_x[0];
  349.    int y_temp=snake_y[0];
  350.    switch(dir)
  351.    {
  352.      case UP :y_temp-=1;break;
  353.      case DOWN :y_temp+=1;break;
  354.      case LEFT :x_temp-=1;break;
  355.      case RIGHT :x_temp+=1;break;
  356.    }
  357.    for(int i=1;i<snake_length;i++)
  358.    {
  359.      if((snake_x[0]==snake_x[i])&&(snake_y[0]==snake_y[i]))
  360.      {
  361.        return 1;
  362.      }
  363.    }
  364.    return 0;
  365. }
  366. /***********************************************/
  367. //使用说明(player)主函数
  368. void tetrs()
  369. {
  370.    int flag = 1;
  371.    while (flag)
  372.    {
  373.        u8g.firstPage();
  374.        do
  375.        {
  376.             u8g.setFont(u8g_font_9x18);
  377.             u8g.setPrintPos(1, 20);
  378.             u8g.print("1.UP:chose1");
  379.             u8g.setPrintPos(1, 35);
  380.             u8g.print("2:start is:A");  
  381.             u8g.setPrintPos(1, 50);
  382.             u8g.print("3.enjoy it");
  383.             
  384.        } while (u8g.nextPage());
  385.        delay(1000);
  386.        flag=0;
  387.    }
  388. }
  389. /***********************************************/
  390. void loop(void)//主循环函数
  391. {
  392.    while (1)
  393.    {
  394.      switch (chose_game())
  395.      {
  396.        case 1: snake(); break;
  397.        case 2: tetrs(); break;
  398.        default:break;
  399.      }
  400.    }
  401. }
复制代码
回复

使用道具 举报

ID:881819 发表于 2021-1-31 12:16 来自手机 | 显示全部楼层
你那个//PS2是另起一行还是连着第一行?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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