编写了个贪食蛇小程序-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3344|回复: 8

编写了个贪食蛇小程序

[复制链接]
发表于 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 | 显示全部楼层
大佬能分享下代码学习下吗?
 楼主| 发表于 2019-4-15 08:56 | 显示全部楼层
Sami511 发表于 2019-4-15 08:16
大佬能分享下代码学习下吗?

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

[mw_shl_code=arduino,true]/*这个是显示的数据,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);  //显示豆子位置红色
  }[/mw_shl_code]

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

十分感谢
发表于 2019-4-15 09:14 | 显示全部楼层
围观大神操作!~学习学习
发表于 2019-5-21 21:19 | 显示全部楼层
就如同是金色突然
发表于 2019-5-21 21:20 | 显示全部楼层
好不要 wrjw6今晚如6
发表于 2019-5-21 23:28 | 显示全部楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 11:36 , Processed in 0.091151 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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