#include <U8g2lib.h> #include <SPI.h> #define LEDR 5 #define LEDY 6 #define LEDG 7 #define SPEAKER 15 #define KEY_RIGHT 2 #define KEY_DOWN 3 #define KEY_LEFT 4 #define KEY_UP 1 #define KEY_CENTER 0 #define UP 1 #define DOWN 2 #define LEFT 3 #define RIGHT 4 U8G2_SH1106_128X64_NONAME_F_4W_HW_SPI u8g2(U8G2_R3, 10, 8, 9); int board[28][15]; int score, level, len, direction, px, py; void setup(void){ u8g2.begin(); u8g2.setContrast(31); u8g2.clearBuffer(); u8g2.sendBuffer(); pinMode(KEY_RIGHT, INPUT_PULLUP); pinMode(KEY_DOWN, INPUT_PULLUP); pinMode(KEY_LEFT, INPUT_PULLUP); pinMode(KEY_UP, INPUT_PULLUP); pinMode(KEY_CENTER, INPUT_PULLUP); pinMode(SPEAKER, OUTPUT); pinMode(LEDR, OUTPUT); pinMode(LEDG, OUTPUT); pinMode(LEDY, OUTPUT); u8g2.setFont(u8g2_font_smart_patrol_nbp_tr); u8g2.setFontDirection(1); while (true){ initialize(); play(); } } void putApple(){ int rx = random(0, 28); int ry = random(0, 15); while (board[rx][ry] != 0){ rx = random(0, 28); ry = random(0, 15); } board[rx][ry] = -1; } void initialize(){ score = 0; level = 0; len = 3; px = 13; py = 8; for (int ix = 0; ix < 28; ix++){ for (int iy = 0; iy < 15; iy++){ board[ix][iy] = 0; } } } void writeScore(int score) { u8g2.setFont( u8g2_font_4x6_mr ); u8g2.setCursor(57, 119); u8g2.println("SC"); u8g2.setCursor(51, 119); u8g2.println("OR"); u8g2.setCursor(45, 121); u8g2.println("E"); u8g2.setFont(u8g2_font_smart_patrol_nbp_tr); int ypos = 0; for (int i = 0; i < 4; i++){ int digit = score % 10; score /= 10; char cstr[16]; itoa(digit, cstr, 10); u8g2.setCursor(ypos, 122 - u8g2.getStrWidth(cstr) / 2); u8g2.println(cstr); ypos += 11; } } void draw(){ u8g2.clearBuffer(); u8g2.drawFrame(0, 0, 64, 116); for (int ix = 0; ix < 28; ix++){ for (int iy = 0; iy < 15; iy++){ if (board[ix][iy] > 0){ u8g2.drawFrame(iy * 4 + 2, ix * 4 + 2, 4, 4); if (board[ix][iy] == len){ u8g2.drawFrame(iy * 4 + 3, ix * 4 + 3, 2, 2); } } else if (board[ix][iy] == -1){ u8g2.drawFrame(iy * 4 + 2, ix * 4 + 3, 4, 2); u8g2.drawFrame(iy * 4 + 3, ix * 4 + 2, 2, 4); } } } writeScore(len - 3); u8g2.sendBuffer(); } bool crash(int dir){ if (dir == UP && (py == 14 || board[px][py + 1] > 0)){ return true; } if (dir == DOWN && (py == 0 || board[px][py - 1] > 0)){ return true; } if (dir == LEFT && (px == 0 || board[px - 1][py] > 0)){ return true; } if (dir == RIGHT && (px == 27 || board[px + 1][py] > 0)){ return true; } return false; } void step(){ for (int ix = 0; ix < 28; ix++){ for (int iy = 0; iy < 15; iy++){ if (board[ix][iy] > 0){ board[ix][iy] = board[ix][iy] - 1; } } } } void play(){ uint32_t lastTime = 0; int lastDir = 0; direction = random(1, 5); putApple(); while (true){ while (millis() < lastTime + 60){ if (digitalRead(KEY_RIGHT) == LOW && lastDir != LEFT){ direction = RIGHT; } if (digitalRead(KEY_LEFT) == LOW && lastDir != RIGHT){ direction = LEFT; } if (digitalRead(KEY_DOWN) == LOW && lastDir != UP){ direction = DOWN; } if (digitalRead(KEY_UP) == LOW && lastDir != DOWN){ direction = UP; } } lastDir = direction; if (!crash(direction)) { if (direction == LEFT){ px--; } if (direction == RIGHT){ px++; } if (direction == DOWN){ py--; } if (direction == UP){ py++; } } else { u8g2.setDrawColor(0); u8g2.drawBox(1, 1, 62, 114); u8g2.setDrawColor(1); u8g2.setCursor(40, 58 - u8g2.getStrWidth("YOUR") / 2); u8g2.println("YOUR"); u8g2.setCursor(25, 58 - u8g2.getStrWidth("SCORE") / 2); u8g2.println("SCORE"); char cstr[16]; itoa(len - 3, cstr, 10); u8g2.setCursor(10, 58 - u8g2.getStrWidth(cstr) / 2); u8g2.println(cstr); u8g2.sendBuffer(); delay(250); while (digitalRead(KEY_CENTER) == HIGH){} break; } if (board[px][py] == -1){ tone(SPEAKER, 6500, 10); putApple(); len++; } board[px][py] = len; draw(); step(); lastTime = millis(); } } void loop() {}