编写了个贪食蛇小程序
8*8双色3mm红蓝雾状发光二极管 用595驱动的
http://player.youku.com/player.php/sid/XNDEzNzYwNTUwOA==/v.swf
大佬能分享下代码学习下吗? 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);//显示豆子位置红色
}
程序不说 焊工可以哈哈哈哈 zong0001 发表于 2019-4-15 08:56
因为这个是跟焊接的点阵配合用的,现在只把关键思路粘在下面,有问题共同探讨。
我加了必要的注释。
十分感谢:) 围观大神操作!~学习学习 就如同是金色突然 好不要 wrjw6今晚如6
页:
[1]