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