брелок с игрой змейка, на attiny44
- Войдите на сайт для отправки комментариев
Пнд, 16/02/2015 - 21:44
Сделал брелок с игрой змейка на attiny44.
Код кому интересно:
#include <avr/io.h> #include <avr/sleep.h> const byte numLed[30][2] = { //какие пины дёргать чтоб загорался определённый светодиод {5,0}, //1 {4,0}, //2 {3,0}, //3 {2,0}, //4 {1,0}, //5 {0,1}, //6 {5,1}, //7 {4,1}, //8 {3,1}, //9 {2,1}, //10 {1,2}, //11 {0,2}, //12 {5,2}, //13 {4,2}, //14 {3,2}, //15 {2,3}, //16 {1,3}, //17 {0,3}, //18 {5,3}, //19 {4,3}, //20 {3,4}, //21 {2,4}, //22 {1,4}, //23 {0,4}, //24 {5,4}, //25 {4,5}, //26 {3,5}, //27 {2,5}, //28 {1,5}, //29 {0,5}, //30 }; long previousMillis = 0; long previousMillisSP = 0; byte i; //для циклов byte j; byte apl=11; //яблоко byte lgth = 1; //длина змейки byte _msnake = 0; //направление движения byte _snake[30] = {21,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; //голова и хвост змейки void setup() { pinMode(0, OUTPUT); pinMode(1, OUTPUT); pinMode(2, OUTPUT); pinMode(3, OUTPUT); pinMode(4, OUTPUT); pinMode(5, OUTPUT); } void sleep(){ for(byte i=0; i<5; i++){ pinMode(i, OUTPUT); digitalWrite(i, LOW); } ADCSRA &= ~(1 << ADEN); // перед сном отключим АЦП ACSR |= (1 << ACD); // компаратор set_sleep_mode(SLEEP_MODE_PWR_DOWN); sleep_enable(); sleep_cpu(); // спать } void ledon (byte a, byte f){ //зажигает определённый светодиод for(byte i=0; i<7; i++)//очищаем входы pinMode(i, INPUT); pinMode(a, OUTPUT); pinMode(f, OUTPUT); digitalWrite(a, HIGH); digitalWrite(f, LOW); delayMicroseconds(35); for(byte i=0; i<7; i++)//очищаем входы pinMode(i, INPUT); delayMicroseconds(5); } void onLedOne (byte i){ //зажигает только один выбранный светодиод по его номеру if(i<=30 && i>0){ i--; byte a = numLed[29-i][0]; byte f = numLed[29-i][1]; ledon (a, f); } } void aplRd(){ //генерируем яблоко там где нет хвоста и головы змейки do { i=0; apl=random(1,31); for(j=lgth+1; j>0; j--){ if(_snake[j-1]==apl) i++; } }while(i>0); } void loop() { if(millis() - previousMillisSP > 5000)//проверяем спать или нет sleep(); if(millis() - previousMillisSP > 50){ //смена неправления движения кнопками if(digitalRead(7)==HIGH){ previousMillisSP = millis(); if(_msnake<3){ _msnake++; }else{_msnake=0;} } if(digitalRead(6)==HIGH){ previousMillisSP = millis(); if(_msnake>0){ _msnake--; }else{_msnake=3;} } } if(millis() - previousMillis > 50) { previousMillis = millis(); if(_snake[0]==apl){ //если яблоко съели, хвост длиньше, и генерируем другое aplRd(); lgth++; } for(i=lgth; i>0; i--) //тащим за собой хвост _snake[i]=_snake[i-1]; switch (_msnake) { //перемещаем змейку case 0: //вверх if(_snake[0]<=6){ _snake[0]+=24; }else{_snake[0]-=6;} break; case 1: //вправо if(_snake[0]%6==0){ _snake[0]-=5; //lgth++; }else{_snake[0]+=1;} break; case 2: //вниз if(_snake[0]>24){ _snake[0]-=24; }else{_snake[0]+=6;} break; case 3: //влево if(_snake[0]%6==1){ _snake[0]+=5; }else{_snake[0]-=1;} break; } for(i=lgth; i>0; i--){ //съеден ли хвост if(_snake[0]==_snake[i]){ _snake[0]=21; _snake[1]=27; for(j=1; j<lgth;j++){ //показываем длину хвоста onLedOne(j); delayMicroseconds(5750); } lgth=1; _msnake=0; apl=random(1,19); //aplRd(); } } } for(i=lgth; i>0; i--){ //рисуем хвост onLedOne(_snake[i]); } onLedOne(_snake[0]); //рисуем голову onLedOne(apl); //рисуем яблоко }
Видео как работает http://youtu.be/QifF4ur5cpU