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

zong0001 发表于 2019-4-14 21:42

编写了个贪食蛇小程序


8*8双色3mm红蓝雾状发光二极管 用595驱动的

http://player.youku.com/player.php/sid/XNDEzNzYwNTUwOA==/v.swf




Sami511 发表于 2019-4-15 08:16

大佬能分享下代码学习下吗?

zong0001 发表于 2019-4-15 08:56

Sami511 发表于 2019-4-15 08:16
大佬能分享下代码学习下吗?

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

/*这个是显示的数据,8*8点阵双色,上红下蓝
定时程序实时读取这个变量数组显示
所以后面的程序直接修改这个数组就完成数据的显示 */
byte led ={
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
};
/*这里定义一个蛇身子的位置存储数组,64个,每吃一个豆子数组内数据后移一位*/
byte sn = {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;//蛇头当前位置
    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 = x*8+y;      //蛇头转换为新坐标
    if (sn == 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 == sn) //如果蛇头坐标在蛇身中存在,就是吃到自己则gameover
      gameover = 1;
      sn = sn;//蛇身坐标序列后移一次
   
    }
    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 = 7;
slong = 1;
sgo = 1;
}
void showsn(){//显示蛇身到图像
    for(byte i=0;i<8;i++){    //清空
      led = 0;
      led = 0;
      }
    for(byte i=0;i<slong+1;i++){
      if (sn < 64)//如果数组是坐标则点亮蓝色
          led/8] = led/8] | 1<<(sn%8);
          if (i%3 ==0)//每隔3个点亮一个红色,就是花蛇
            led/8] = led/8] | 1<<(sn%8);
         
      }
    led/8] = led/8] | 1<<(sn%8);//蛇头显示双色
    led = led | 1<<(douzi%8);//显示豆子位置红色
}

单片机菜鸟 发表于 2019-4-15 08:57

程序不说 焊工可以哈哈哈哈

Sami511 发表于 2019-4-15 08:58

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



十分感谢:)

jpolo 发表于 2019-4-15 09:14

围观大神操作!~学习学习

计划97452358 发表于 2019-5-21 21:19

就如同是金色突然

计划97452358 发表于 2019-5-21 21:20

好不要 wrjw6今晚如6

筑梦人 发表于 2019-5-21 23:28

页: [1]
查看完整版本: 编写了个贪食蛇小程序