Autorul poate fi contactat la adresa: Login pentru adresa
Mi-am propus sa realizez un joc clasic, distractiv, de tip Snake.
Este un proiect interesant deoarece permite familiarizarea cu programarea embedded într-un mod practic și distractiv (fiind un joc).
Jocul ofera utilizatorilor sansa sa retraiasca jocurile video ale copilariei, cand nu existau ecrane color si butoanele erau fizice.
Ideea mi-a venit de la faimoasele Brick games care integrau o multime de jocuri, folosind doar cateva butoane si un ecran mic. Mereu m-am intrebat cu functioneaza un astfel de 'device', iar acum chiar am ocazia sa construiesc unul.
Pentru compilare, pe Windows, folositi Cygwin, pentru a putea folosi Makefile-ul si compilatorul nvr-gcc, apoi incarcati programul pe placuta, folosind bootloader-ul din laborator.
Exemplu de cod (functia main):
int main(void) {
double axg = 0, ayg = 0, azg = 0;
double gxds = 0, gyds = 0, gzds = 0;
//init mpu6050
mpu6050_init();
_delay_ms(50);
LCD_init();
LCD_clear();
put_food();
// INtro
while (1) {
// Read current parameters
mpu6050_getConvData(&axg, &ayg, &azg, &gxds, &gyds, &gzds);
LCD_write_string(0,0," Little Snake ");
LCD_write_string(0,3," >> Move << ");
if (axg > LIMIT || axg < -LIMIT ||ayg < -LIMIT || ayg > LIMIT)
break;
}
// Init snake, both on screen and array
screen[3][5] = SNAKE;
screen[3][6] = SNAKE;
screen[3][7] = SNAKE;
snake[0].x = 3; snake[0].y = 5;
snake[1].x = 3; snake[1].y = 6;
snake[2].x = 3; snake[2].y = 7;
snake_tail = 0; snake_len = 3;
for (int z=snake_len; z<MAX_LEN; z++) snake[z].x = -1;
while(game) {
// Read current parameters
mpu6050_getConvData(&axg, &ayg, &azg, &gxds, &gyds, &gzds);
// Take a decision
if(axg > LIMIT) {if (direction != UP) direction = DOWN;}
else if(axg < -LIMIT) {if (direction != DOWN) direction = UP;}
if(ayg > LIMIT) {if (direction != LEFT) direction = RIGHT;}
else if(ayg < -LIMIT) {if (direction != RIGHT) direction = LEFT;}
// Make it happen
change_dir();
// Check end game
if (!game) break;
LCD_init();
LCD_clear();
// Print entire screen
for (int x=0; x<HEIGHT; x++)
for (int y=0; y<WIDTH; y++) {
if (x == snake[snake_len-1].x && y == snake[snake_len-1].y) {
LCD_write_char(HEAD);
} else if (screen[x][y] == SNAKE) {
LCD_write_char(SNAKE);
} else if (screen[x][y] == FOOD) {
LCD_write_char(FOOD);
} else {
LCD_write_char(SPACE);
}
}
_delay_ms(250);
}
}
Intregul cod este disponibil mai jos, in sectiunea de Download.
Ecranul ales de mine s-a dovedit cam mic pentru un joc de tipul acesta. In plus, folosirea bitmap-urilor pentru implementarea a fost prea dificila, asa ca am folosit caractere ASCII pentru reprezentarea sarpelui si a mancarii sale. Cu toate acestea jocul se misca excelent. :)
Excelent proiectul, mi-ar fi placut sa lucram la el inca de la primele laboratoare si sa adaugam componente pe masura ce avansam cu materia.
Proiectul este complet si 100% functional!
Codul folosit este open-source, distribuit sub o licenta MIT si disponibil oricui, pe GitHub, la acest repo.