查看: 910|回复: 8

编写了个贪食蛇小程序

[复制链接]
  • TA的每日心情
    开心
    2019-7-17 12:40
  • 签到天数: 52 天

    [LV.5]常住居民I

    发表于 2019-4-14 21:42 | 显示全部楼层 |阅读模式
    呵呵_20190414213325.gif
    8*8双色3mm红蓝雾状发光二极管 用595驱动的



    20190414_194208.jpg 20190414_213411.jpg 20190414_213438.jpg


    该用户从未签到

    发表于 2019-4-15 08:16 | 显示全部楼层
    大佬能分享下代码学习下吗?
  • TA的每日心情
    开心
    2019-7-17 12:40
  • 签到天数: 52 天

    [LV.5]常住居民I

     楼主| 发表于 2019-4-15 08:56 | 显示全部楼层
    Sami511 发表于 2019-4-15 08:16
    大佬能分享下代码学习下吗?

    因为这个是跟焊接的点阵配合用的,现在只把关键思路粘在下面,有问题共同探讨。
    我加了必要的注释。

    kittenblock中小学创客名师推荐的图形化编程软件

    /*这个是显示的数据,8*8点阵双色,上红下蓝
    定时程序实时读取这个变量数组显示
    所以后面的程序直接修改这个数组就完成数据的显示 */
    byte led[2][8] ={  
      {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
      {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
      };
    /*这里定义一个蛇身子的位置存储数组,64个,每吃一个豆子数组内数据后移一位*/
    byte sn[64] = {7};
    
    byte douzi = 0; //要定一个豆子的位置,每次吃掉随机生成一个
    byte slong = 1;  //蛇当前的长度,也是分数
    
    void loop() {
      //这一部分就是没隔固定时间走一步,设定的800ms,interval,是仿照的blink程序
       unsigned long currentMillis = millis();
      if (currentMillis - previousMillis >= interval){ 
        previousMillis = currentMillis;
          tosnike(); //到时间后调用走蛇程序
      }
    
       toanjian();  //检查按键
    }
    void toanjian(){  //按键使用的电阻串联接模拟口A0
     if (anjianreadly ==0){  //判断是否已经按过
         unsigned int readda = analogRead(anjian);
          if (readda < 400){
            anjianreadly = 1;
            sgo = 2;
          }
          if (readda < 300)
            sgo = 1;
          if (readda < 100)
            sgo = 4;
          if (readda < 20)
            sgo = 3;
     }
    
      }
    void tosnike(){ //走蛇程序
      byte st = sn[0];  //蛇头当前位置
        byte x = st/8;    //转换为坐标
        byte y = st%8;
        byte gameover = 0;
         switch (sgo){
            case 1:     //前进
              x++;
              if(x ==8)
                gameover = 1;
              break;
             case 3:    //后退
              x--;
              if(x ==255)
                gameover = 1;
              break;
            case 2:     //右移
              y++;
              if(y ==8)
                gameover = 1;
              break;
             case 4:    //左移
              y--;
              if(y ==255)
                gameover = 1;
              break;
        
          } 
          if (analogRead(anjian) > 700)   //如果没有按键则等待下一次
            anjianreadly = 0;
    //Serial.println(anjianreadly);
          sn[0] = x*8+y;      //蛇头转换为新坐标
        if (sn[0] == douzi){    //如果坐标位置是豆子位置
            byte dou;
            do{
              douzi = random(64);   //生成新豆子
              dou = 0;
              for(int i = 0;i< 64;i++){   
                  if (douzi == sn)
                    dou = 1;
                }
            }while(dou ==1);//判断豆子是不是蛇身位置,如果是重新生成一个
            
          slong++;  //吃到豆子长度加一
        }
        
        for(int i=0;i<slong;i++){  
          if (sn[0] == sn[i+1]) //如果蛇头坐标在蛇身中存在,就是吃到自己则gameover
            gameover = 1;
          sn[slong-i] = sn[slong-i-1];  //蛇身坐标序列后移一次
       
        }
        if (gameover ==1){ //跳到gameover程序
          togameover();
          }
        showsn(); //将蛇身坐标转换到显示数组
      }
    void togameover(){
      addnum();   //这是结束动画,就不在后面粘贴了
      byte chengji = slong-1;
      copynum(chengji/10,0);    //显示成绩
      delay(1000);
      copynum(chengji%10,1);
      delay(1000);
      for (byte i=1;i<64;i++)   //初始化后重新开始
       sn = 100;
      sn[0] = 7;
      slong = 1;
      sgo = 1;
      }
    void showsn(){  //显示蛇身到图像
        for(byte i=0;i<8;i++){    //清空
            led[1] = 0;
            led[0] = 0;
          }
        for(byte i=0;i<slong+1;i++){
            if (sn < 64)  //如果数组是坐标则点亮蓝色
              led[1][sn/8] = led[1][sn/8] | 1<<(sn%8);
              if (i%3 ==0)  //每隔3个点亮一个红色,就是花蛇
                led[0][sn/8] = led[0][sn/8] | 1<<(sn%8);
             
          }
        led[0][sn[0]/8] = led[0][sn[0]/8] | 1<<(sn[0]%8);  //蛇头显示双色
        led[0][douzi/8] = led[0][douzi/8] | 1<<(douzi%8);  //显示豆子位置红色
      }


  • TA的每日心情
    开心
    2019-8-14 08:23
  • 签到天数: 740 天

    [LV.9]以坛为家II

    发表于 2019-4-15 08:57 | 显示全部楼层
    程序不说 焊工可以哈哈哈哈
    打赏作者鼓励一下!

    该用户从未签到

    发表于 2019-4-15 08:58 | 显示全部楼层
    zong0001 发表于 2019-4-15 08:56
    因为这个是跟焊接的点阵配合用的,现在只把关键思路粘在下面,有问题共同探讨。
    我加了必要的注释。

    十分感谢
  • TA的每日心情
    慵懒
    2019-8-16 15:57
  • 签到天数: 60 天

    [LV.6]常住居民II

    发表于 2019-4-15 09:14 | 显示全部楼层
    围观大神操作!~学习学习
  • TA的每日心情

    2019-5-21 21:08
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2019-5-21 21:19 | 显示全部楼层
    就如同是金色突然
  • TA的每日心情

    2019-5-21 21:08
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2019-5-21 21:20 | 显示全部楼层
    好不要 wrjw6今晚如6
  • TA的每日心情
    开心
    2019-5-21 23:19
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2019-5-21 23:28 | 显示全部楼层
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    【原创】 drawbot平面关节scara机械臂写字机 画画机器人直播...
    【原创】 drawbot平面关节
    这个项目上个月就在做了,结构和代码反反复复改了多次,加上自己又太忙,一直没来得及
    对于ADC读取按键值的疑问
    对于ADC读取按键值的疑问
    大佬们好 我在一篇帖子上看见了用ADC读取模拟值并判断哪颗按键 我也画了一下板子 这
    ADC模拟输入读取独立按键值
    ADC模拟输入读取独立按键
    在论坛H2O了这么久,给大家分享一个实用的小技巧!在使用按键与单片机进行人机交互时
    【Arduino】108种传感器模块系列实验(97)---0.96寸OLED液晶屏
    【Arduino】108种传感器模
    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是
    【Arduino】108种传感器模块系列实验(107)---400KV高压发生器
    【Arduino】108种传感器模
    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表