Arduino Uno - Snake Game - 2.2" TFT Display
Snake Game with Arduino Uno. The snake is controlled with a joystick. A 2.2" inch TFT display from Adafruit is used as the display.
Components and supplies
1
Joystick
1
Breadboard (generic)
1
Arduino UNO
1
2.2" TFT Display
1
Jumper wires (generic)
Tools and machines
1
Soldering iron (generic)
Apps and platforms
1
Arduino IDE
Project description
Code
Bitmaps Part 2
c_cpp
Bitmaps displayed in the Welcome Screen and Lost Screen
1#ifndef BITMAPS_H 2#define BITMAPS_H 3 4extern const unsigned char wellcome_snake[]; 5extern const unsigned char dead_snake[]; 6 7#endif 8
GitHub
MAIN CODE
c_cpp
main code for snake game
1#include "SPI.h" 2#include "Adafruit_GFX.h" 3#include "Adafruit_ILI9341.h" 4#include "bitmaps.h" 5 6// For the Adafruit shield, these are the default. 7#define TFT_DC 9 8#define TFT_CS 10 9 10// Use hardware SPI (on Uno, #13, #12, #11) and the above for CS/DC 11Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC); 12 13 14#define Joystick_X A4 // Analog Eingang für den Joystick 15#define Joystick_Y A3 // Analog Eingang für den Joystick 16#define Joystick_Button 2 // Analog Eingang für den Joystick 17#define maximum_snake_lenght 300 // So lang darf die Schlange werden 18#define spielfeld_breite 31 // Spielfeld breite 19#define spielfeld_hoehe 20 // Spielfedl höhe 20 21#define p2s_x(p_x) (10*p_x+5) // Umrechnung in Spiel Koordinaten 22#define p2s_y(p_y) (10*p_y+35) // Umrechnung in Spiel Koordinaten 23 24 25//------------------------------------------------------------------------------------------------------------------------ 26//----------------------------------Variablen initialisieren-------------------------------------------------------------- 27//------------------------------------------------------------------------------------------------------------------------ 28int JoystickX; 29int JoystickY; 30 31int score = 0; 32int game_status = 0; // Wird benötigt für die Switch Case Anweisung 33 34int CursorX; 35int CursorY; 36 37int dx=1,dy=0; // Anfags Richtig bestimmen. Hier läuft Schlange nach rechts 38int schlangen_laenge; // Aktuelle länge der Schlange 39byte blocked[spielfeld_breite][spielfeld_hoehe]; //Maxiamel Länge der Schlange 40byte position_x[maximum_snake_lenght]; //Maximale Länge der Einheiten die gespeichert werden können für die Positionen bei denen die Schlange war. 41byte position_y[maximum_snake_lenght]; //Maximale Länge der Einheiten die gespeichert werden können für die Positionen bei denen die Schlange war. 42int head = 0; // wo habe ich im array gespeichert. 43int tail = 0; // Angeafnegn bei -5 weil somit ein Puffer von 5 Einheiten erstellt wird. das ist die aktuelle Länge der Schlange. 44int counter = 5; 45 46int random_food_x; // Variable X für den ersten Spawnpunkt des Essens 47int random_food_y; // Variable Y für den zweiten Spawnpunkt des Essens 48int random_generator_for_food_x; // Random generierte Zahlen für den Apfel 49int random_generator_for_food_y; // Random generierte Zahlen für den Apfel 50 51//------------------------------------------------------------------------------------------------------------------------ 52//-----------------------------------Variablen initialisieren Ende-------------------------------------------------------- 53//------------------------------------------------------------------------------------------------------------------------ 54 55 56 57//------------------------------------------------------------------------------------------------------------------------ 58//-----------------------------------Funktionen Anfang-------------------------------------------------------------------- 59//------------------------------------------------------------------------------------------------------------------------ 60void wellcome_screen() 61{ 62 tft.fillScreen(ILI9341_BLACK); // Hintergrund schwarz machen. Sonst wäre er weis 63 tft.setTextColor(ILI9341_WHITE); // Farbe des Textes setzen 64 tft.setTextSize(3); // Größe des Textes 65 tft.setCursor(40, 30); // Koordinaten setzen wo die Schrift anfängt 66 tft.print("Willkommen zu"); // Text auf das Display schreiben 67 tft.drawBitmap(110, 75, wellcome_snake, 92, 56, ILI9341_GREEN); 68 tft.setCursor(35, 160); // Koordinaten setzen wo die Schrift anfängt 69 tft.setTextSize(2); 70 tft.print("Push Joystick to start"); // Text auf das Display schreiben 71} 72 73void game_screen() 74{ 75 //Display Rahmen, Hintergrund und Text:Score 76 tft.fillScreen(ILI9341_BLACK); // Hintergrund schwar machen. Sonst wäre er weis 77 tft.drawRect(0, 30, 320, 210, ILI9341_PURPLE); // Rechteck malen 78 tft.drawRect(1, 31, 318, 208, ILI9341_PURPLE); 79 tft.drawRect(2, 32, 316, 206, ILI9341_PURPLE); 80 tft.drawRect(3, 33, 314, 204, ILI9341_PURPLE); 81 tft.drawRect(4, 34, 312, 202, ILI9341_PURPLE); 82 83 tft.setTextColor(ILI9341_RED); // Farbe des Textes setzen 84 tft.setTextSize(3); // Größe des Textes 85 tft.setCursor(65, 4); // Koordinaten setzen wo die Schrift anfängt 86 tft.print("Score:"); // Text auf das Display schreiben 87 tft.print(score); 88} 89 90void loser_screen() 91{ 92 tft.fillScreen(ILI9341_BLACK); // Hintergrund schwarz machen. Sonst wäre er weis 93 tft.setTextColor(ILI9341_WHITE); // Farbe des Textes setzen 94 tft.setTextSize(3); // Größe des Textes 95 tft.setCursor(85, 10); // Koordinaten setzen wo die Schrift anfängt 96 tft.print("YOU LOST"); // Text auf das Display schreiben 97 tft.drawBitmap(100, 55, dead_snake, 124, 38, ILI9341_RED); 98 tft.setCursor(45, 110); 99 tft.setTextSize(3); 100 tft.print("Learn to play"); // Text auf das Display schreiben 101 tft.setCursor(65, 160); 102 tft.setTextColor(ILI9341_RED); // Farbe des Textes setzen 103 tft.print("Score:"); // Text auf das Display schreiben 104 tft.print(score); 105 tft.setTextSize(2); 106 tft.setTextColor(ILI9341_WHITE); // Farbe des Textes setzen 107 tft.setCursor(12, 210); // Koordinaten setzen wo die Schrift anfängt 108 tft.print("Play again? Push Joystick"); // Text auf das Display schreiben*/ 109} 110 111void food_generator() 112{ 113 random_generator_for_food_x = random(0,31); // Random Zahl wischen 0 und 31 generieren 114 random_generator_for_food_y = random(0,20); // Random Zahl wischen 0 und 20 generieren 115 random_food_x = p2s_x(random_generator_for_food_x); // X Koordiante für den Apfel ausrechnen 116 random_food_y = p2s_y(random_generator_for_food_y); // Y Koordiante für den Apfel ausrechnen 117 tft.drawRect(random_food_x,random_food_y, 10, 10, ILI9341_RED); // Zeichen des Apfels 118} 119 120void move_tail() 121{ 122 if(counter > 0) 123 { 124 counter-=1; 125 } 126 else 127 { 128 tft.drawRect(p2s_x(position_x[tail]), p2s_y(position_y[tail]), 10, 10, ILI9341_BLACK); // Rechteck das eigentlich grün geworden wäre wieder schwarz machen 129 blocked[position_x[tail]][position_y[tail]] = 0; // An der Stelle an der die Schlange eigentlich gewesen wäre muss das array blocked an dieser Stelle wieder auf 0 gesetzt werden. 130 //Sonst würde bei einem erneuten vorbei kommen an dieser Stelle eine Kollision stattfinden obwohl dort überhaupt keine Schlange ist 131 tail++; // Hochzählen der Tail Variable damit die Schlange immer in der gleichen Länge bleibt 132 if(tail >= maximum_snake_lenght)// Wenn tail größer oder gleich maximum_snake_lenght-300 erreicht hat, wird head auf 0 gesetzt um neue Werte speichern zu können. 133 { 134 tail = 0; 135 } 136 } 137} 138 139void print_score() 140{ 141 tft.fillRect(173, 4, 250, 24, ILI9341_BLACK); // Schwarztes Rechteck malen sonst bleibt der letzte gezeichnete Score stehen. 142 tft.setTextColor(ILI9341_RED); // Farbe des Textes setzen 143 tft.setTextSize(3); // Größe des Textes 144 tft.setCursor(65, 4); // Koordinaten setzen wo die Schrift anfängt 145 tft.print("Score:"); // Text auf das Display schreiben 146 tft.print(score); 147} 148//------------------------------------------------------------------------------------------------------------------------ 149//----------------------------------------Funktionen Ende----------------------------------------------------------------- 150//------------------------------------------------------------------------------------------------------------------------ 151 152 153//------------------------------------------------------------------------------------------------------------------------ 154//----------------------------------------Void Setup Anfang--------------------------------------------------------------- 155//------------------------------------------------------------------------------------------------------------------------ 156void setup() // COde der nur einmal ausgeführt werden soll 157{ 158 Serial.begin(9600); 159 pinMode(Joystick_Button, INPUT_PULLUP); 160 tft.begin(); // Display initalisieren 161 tft.setRotation(3); // Display umdrehen. -- Oder 1 wenn das Display gedreht ist. 162} 163 164//------------------------------------------------------------------------------------------------------------------------ 165//----------------------------------------Void Setup Ende----------------------------------------------------------------- 166//------------------------------------------------------------------------------------------------------------------------ 167 168 169 170//------------------------------------------------------------------------------------------------------------------------ 171//----------------------------------------Void Loop Anfang---------------------------------------------------------------- 172//------------------------------------------------------------------------------------------------------------------------ 173void loop(void) // Code der wiederholt ausgeführt wird 174{ 175 176 //Auslesen der X & Y Achse des Joysticks. 177 int JoystickX = analogRead(Joystick_X); 178 int JoystickY = analogRead(Joystick_Y); 179 180 switch(game_status) 181 { 182 case 0: // The game has not been started yet. 183 wellcome_screen(); 184 game_status=1; 185 break; 186 187 case 1: 188 if(digitalRead(Joystick_Button)==LOW) //Überprüfen ob gedrückt und Variable gleich 0. Wenn Variable 0 dann ist das Game noch nicht gestartet 189 { 190 game_screen(); // Game Screen starten 191 game_status = 2; 192 //Serial.println("Das Game starten ..."); // Überprüfen ob das Game gestartet wird 193 194 //Variablen zurücksetzen -------------- 195 CursorX = 0; dx=1; 196 CursorY = 0; dy=0; 197 head=0; 198 tail=0; 199 counter=4; 200 score=0; 201 print_score(); 202 // ------------------------------------ 203 204 //Serial.println("Erasing board..."); //Löschen des Arrays. Sonst sind die Werte beim nächsten Spiel falsch 205 for (int i=0;i<31;i++) { 206 for (int j=0;j<20;j++) { 207 blocked[i][j]=0; 208 } 209 } 210 //Serial.println(blocked[0][0]); 211 //Serial.println("Board erased..."); 212 food_generator(); 213 } 214 break; 215 216 case 2: // The game has been started! 217 218 if ( blocked[CursorX][CursorY]==1)//Überprüfen pb die Schlange schon an der Stelle war an der sie grade ist. -> Werte wo sie war werden im Array blocked gespeichert 219 { 220 game_status=3; //I'm dying.... 221 } 222 // ------------------ Schlange laufen lassen ------------------------------------------------------------------------------------------------------------------------------------------------------ 223 224 tft.drawRect(p2s_x(CursorX), p2s_y(CursorY), 10, 10, ILI9341_GREEN); // Draw Snake 225 blocked[CursorX][CursorY]=1; // Da war die Schlnage schon, wird in Array blocked gespeichert 226 227 delay(125); 228 229 position_x[head] = CursorX; //Wo die Schlange grade war (CursorX) wird in array position_x gespeichert. Diese Stelle wird immer eine Stelle hochgezählt um den alten wert nicht zu überschreiben. 230 position_y[head] = CursorY; //Wo die Schlange grade war (CursorX) wird in array position_x gespeichert. Diese Stelle wird immer eine Stelle hochgezählt um den alten wert nicht zu überschreiben. 231 head++; // Hochzählen des Wertes für die zwei oberen Befehle 232 233 if(head >= maximum_snake_lenght) // Wenn head größer oder gleich maximum_snake_lenght-300 erreicht hat, wird head auf 0 gesetzt um neue Werte speichern zu können. 234 { 235 head=0; 236 } 237 238 move_tail(); 239 240 // ------------------ Schlange laufen lassen Ende ------------------------------------------------------------------------------------------------------------------------------------------------------ 241 242 //------Kolision bemerken und Spiel beenden Anfang ---------------- 243 244 245 CursorX+=dx; 246 CursorY+=dy; 247 248 if(CursorX == 31) // Überprüfen ob Schlange den rechten Rand berührt hat 249 { 250 game_status = 3; 251 } 252 if(CursorX < 0) // Überprüfen ob Schlange den linken Rand berüht hat 253 { 254 game_status = 3; 255 } 256 if(CursorY == -1) // Überprüfen ob Schlange den oberen Rand berüht hat 257 { 258 game_status = 3; 259 } 260 if(CursorY == 20) // Überprüfen ob Schlange den unteren Rand berührt hat 261 { 262 game_status = 3; 263 } 264 265 //------Kolision bemerken und Spiel beenden Ende---------------- 266 267 //--------------------Essen gegessen? Anfang ----------------------------------- 268 269 if(random_generator_for_food_x == CursorX && random_generator_for_food_y == CursorY) // Überprüfen ob Schlange gegessen hat. Wenn ja dann: 270 { 271 food_generator(); // Aufrufen um einen Apfel an anderer Stelle spawnen zu lassen 272 counter=1; // Schlange um 1 Block erhöhen 273 score+=10; // Score um 10 erhöhen 274 print_score(); // Score ausgeben 275 } 276 //--------------------Essen gegessen? Ende-- ----------------------------------- 277 278 //--------------Joystick Position bestimmen und schreiben --------------------- 279 280 if(JoystickX>900) 281 { 282 //Serial.println("laufe nach rechts "); 283 dx=1;dy=0; 284 } 285 if(JoystickX<300) 286 { 287 //Serial.println("laufe nach links"); 288 dx=-1;dy=0; 289 } 290 if(JoystickY>900) 291 { 292 //Serial.println("laufe nach unten "); 293 dx=0;dy=1; 294 } 295 if(JoystickY<300) 296 { 297 //Serial.println("laufe nach oben"); 298 dx=0;dy=-1; 299 } 300 //--------------Joystick Position bestimmen und schreiben Ende---------------- 301 302 break; 303 304 case 3: 305 { 306 loser_screen(); // Lose Screen anzeigen 307 game_status=1; // Game Status auf 1 stellen. Der Lose Screen wird so lange angezeigt bis case 1 der Status des Buttons überprüft wird. Ob er gedrückt wurde. 308 break; 309 } 310 311 } 312 313} 314 315//------------------------------------------------------------------------------------------------------------------------ 316//----------------------------------------Void Loop Ende------------------------------------------------------------------ 317//------------------------------------------------------------------------------------------------------------------------
GitHub
Bitmaps Part 2
c_cpp
Bitmaps displayed in the Welcome Screen and Lost Screen
1#ifndef BITMAPS_H 2#define BITMAPS_H 3 4extern const unsigned char wellcome_snake[]; 5extern const unsigned char dead_snake[]; 6 7#endif 8
MAIN CODE
c_cpp
main code for snake game
1#include "SPI.h" 2#include "Adafruit_GFX.h" 3#include "Adafruit_ILI9341.h" 4#include 5 "bitmaps.h" 6 7// For the Adafruit shield, these are the default. 8#define 9 TFT_DC 9 10#define TFT_CS 10 11 12// Use hardware SPI (on Uno, #13, #12, #11) 13 and the above for CS/DC 14Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC); 15 16 17#define 18 Joystick_X A4 // Analog Eingang für den Joystick 19#define Joystick_Y A3 // Analog 20 Eingang für den Joystick 21#define Joystick_Button 2 // Analog Eingang für den 22 Joystick 23#define maximum_snake_lenght 300 // So lang darf die Schlange werden 24#define 25 spielfeld_breite 31 // Spielfeld breite 26#define spielfeld_hoehe 20 // Spielfedl 27 höhe 28 29#define p2s_x(p_x) (10*p_x+5) // Umrechnung in Spiel Koordinaten 30#define 31 p2s_y(p_y) (10*p_y+35) // Umrechnung in Spiel Koordinaten 32 33 34//------------------------------------------------------------------------------------------------------------------------ 35//----------------------------------Variablen 36 initialisieren-------------------------------------------------------------- 37//------------------------------------------------------------------------------------------------------------------------ 38int 39 JoystickX; 40int JoystickY; 41 42int score = 0; 43int game_status = 0; // Wird 44 benötigt für die Switch Case Anweisung 45 46int CursorX; 47int CursorY; 48 49int 50 dx=1,dy=0; // Anfags Richtig bestimmen. Hier läuft Schlange nach rechts 51int schlangen_laenge; 52 // Aktuelle länge der Schlange 53byte blocked[spielfeld_breite][spielfeld_hoehe]; 54 //Maxiamel Länge der Schlange 55byte position_x[maximum_snake_lenght]; //Maximale 56 Länge der Einheiten die gespeichert werden können für die Positionen bei denen die 57 Schlange war. 58byte position_y[maximum_snake_lenght]; //Maximale Länge der Einheiten 59 die gespeichert werden können für die Positionen bei denen die Schlange war. 60int 61 head = 0; // wo habe ich im array gespeichert. 62int tail = 0; // Angeafnegn bei 63 -5 weil somit ein Puffer von 5 Einheiten erstellt wird. das ist die aktuelle Länge 64 der Schlange. 65int counter = 5; 66 67int random_food_x; // Variable X für den 68 ersten Spawnpunkt des Essens 69int random_food_y; // Variable Y für den zweiten 70 Spawnpunkt des Essens 71int random_generator_for_food_x; // Random generierte Zahlen 72 für den Apfel 73int random_generator_for_food_y; // Random generierte Zahlen für 74 den Apfel 75 76//------------------------------------------------------------------------------------------------------------------------ 77//-----------------------------------Variablen 78 initialisieren Ende-------------------------------------------------------- 79//------------------------------------------------------------------------------------------------------------------------ 80 81 82 83//------------------------------------------------------------------------------------------------------------------------ 84//-----------------------------------Funktionen 85 Anfang-------------------------------------------------------------------- 86//------------------------------------------------------------------------------------------------------------------------ 87void 88 wellcome_screen() 89{ 90 tft.fillScreen(ILI9341_BLACK); // Hintergrund schwarz 91 machen. Sonst wäre er weis 92 tft.setTextColor(ILI9341_WHITE); // Farbe des Textes 93 setzen 94 tft.setTextSize(3); // Größe des Textes 95 tft.setCursor(40, 30); 96 // Koordinaten setzen wo die Schrift anfängt 97 tft.print("Willkommen zu"); 98 // Text auf das Display schreiben 99 tft.drawBitmap(110, 75, wellcome_snake, 92, 100 56, ILI9341_GREEN); 101 tft.setCursor(35, 160); // Koordinaten setzen wo die Schrift 102 anfängt 103 tft.setTextSize(2); 104 tft.print("Push Joystick to start"); // 105 Text auf das Display schreiben 106} 107 108void game_screen() 109{ 110 //Display 111 Rahmen, Hintergrund und Text:Score 112 tft.fillScreen(ILI9341_BLACK); // Hintergrund 113 schwar machen. Sonst wäre er weis 114 tft.drawRect(0, 30, 320, 210, ILI9341_PURPLE); 115 // Rechteck malen 116 tft.drawRect(1, 31, 318, 208, ILI9341_PURPLE); 117 tft.drawRect(2, 118 32, 316, 206, ILI9341_PURPLE); 119 tft.drawRect(3, 33, 314, 204, ILI9341_PURPLE); 120 121 tft.drawRect(4, 34, 312, 202, ILI9341_PURPLE); 122 123 tft.setTextColor(ILI9341_RED); 124 // Farbe des Textes setzen 125 tft.setTextSize(3); // Größe des Textes 126 tft.setCursor(65, 127 4); // Koordinaten setzen wo die Schrift anfängt 128 tft.print("Score:"); // 129 Text auf das Display schreiben 130 tft.print(score); 131} 132 133void loser_screen() 134{ 135 136 tft.fillScreen(ILI9341_BLACK); // Hintergrund schwarz machen. Sonst wäre er weis 137 138 tft.setTextColor(ILI9341_WHITE); // Farbe des Textes setzen 139 tft.setTextSize(3); 140 // Größe des Textes 141 tft.setCursor(85, 10); // Koordinaten setzen wo die Schrift 142 anfängt 143 tft.print("YOU LOST"); // Text auf das Display schreiben 144 tft.drawBitmap(100, 145 55, dead_snake, 124, 38, ILI9341_RED); 146 tft.setCursor(45, 110); 147 tft.setTextSize(3); 148 149 tft.print("Learn to play"); // Text auf das Display schreiben 150 tft.setCursor(65, 151 160); 152 tft.setTextColor(ILI9341_RED); // Farbe des Textes setzen 153 tft.print("Score:"); 154 // Text auf das Display schreiben 155 tft.print(score); 156 tft.setTextSize(2); 157 158 tft.setTextColor(ILI9341_WHITE); // Farbe des Textes setzen 159 tft.setCursor(12, 160 210); // Koordinaten setzen wo die Schrift anfängt 161 tft.print("Play again? 162 Push Joystick"); // Text auf das Display schreiben*/ 163} 164 165void food_generator() 166{ 167 168 random_generator_for_food_x = random(0,31); // Random Zahl wischen 0 und 31 169 generieren 170 random_generator_for_food_y = random(0,20); // Random Zahl wischen 171 0 und 20 generieren 172 random_food_x = p2s_x(random_generator_for_food_x); // 173 X Koordiante für den Apfel ausrechnen 174 random_food_y = p2s_y(random_generator_for_food_y); 175 // Y Koordiante für den Apfel ausrechnen 176 tft.drawRect(random_food_x,random_food_y, 177 10, 10, ILI9341_RED); // Zeichen des Apfels 178} 179 180void move_tail() 181{ 182 183 if(counter > 0) 184 { 185 counter-=1; 186 } 187 else 188 { 189 190 tft.drawRect(p2s_x(position_x[tail]), p2s_y(position_y[tail]), 10, 10, ILI9341_BLACK); 191 // Rechteck das eigentlich grün geworden wäre wieder schwarz machen 192 blocked[position_x[tail]][position_y[tail]] 193 = 0; // An der Stelle an der die Schlange eigentlich gewesen wäre muss das array 194 blocked an dieser Stelle wieder auf 0 gesetzt werden. 195 //Sonst 196 würde bei einem erneuten vorbei kommen an dieser Stelle eine Kollision stattfinden 197 obwohl dort überhaupt keine Schlange ist 198 tail++; // Hochzählen der Tail 199 Variable damit die Schlange immer in der gleichen Länge bleibt 200 if(tail 201 >= maximum_snake_lenght)// Wenn tail größer oder gleich maximum_snake_lenght-300 202 erreicht hat, wird head auf 0 gesetzt um neue Werte speichern zu können. 203 { 204 205 tail = 0; 206 } 207 } 208} 209 210void print_score() 211{ 212 tft.fillRect(173, 213 4, 250, 24, ILI9341_BLACK); // Schwarztes Rechteck malen sonst bleibt der letzte 214 gezeichnete Score stehen. 215 tft.setTextColor(ILI9341_RED); // Farbe des Textes 216 setzen 217 tft.setTextSize(3); // Größe des Textes 218 tft.setCursor(65, 4); 219 // Koordinaten setzen wo die Schrift anfängt 220 tft.print("Score:"); // Text 221 auf das Display schreiben 222 tft.print(score); 223} 224//------------------------------------------------------------------------------------------------------------------------ 225//----------------------------------------Funktionen 226 Ende----------------------------------------------------------------- 227//------------------------------------------------------------------------------------------------------------------------ 228 229 230//------------------------------------------------------------------------------------------------------------------------ 231//----------------------------------------Void 232 Setup Anfang--------------------------------------------------------------- 233//------------------------------------------------------------------------------------------------------------------------ 234void 235 setup() // COde der nur einmal ausgeführt werden soll 236{ 237 Serial.begin(9600); 238 239 pinMode(Joystick_Button, INPUT_PULLUP); 240 tft.begin(); // Display initalisieren 241 242 tft.setRotation(3); // Display umdrehen. -- Oder 1 wenn das Display gedreht ist. 243} 244 245//------------------------------------------------------------------------------------------------------------------------ 246//----------------------------------------Void 247 Setup Ende----------------------------------------------------------------- 248//------------------------------------------------------------------------------------------------------------------------ 249 250 251 252//------------------------------------------------------------------------------------------------------------------------ 253//----------------------------------------Void 254 Loop Anfang---------------------------------------------------------------- 255//------------------------------------------------------------------------------------------------------------------------ 256void 257 loop(void) // Code der wiederholt ausgeführt wird 258{ 259 260 //Auslesen 261 der X & Y Achse des Joysticks. 262 int JoystickX = analogRead(Joystick_X); 263 264 int JoystickY = analogRead(Joystick_Y); 265 266 switch(game_status) 267 { 268 269 case 0: // The game has not been started yet. 270 wellcome_screen(); 271 272 game_status=1; 273 break; 274 275 case 1: 276 if(digitalRead(Joystick_Button)==LOW) 277 //Überprüfen ob gedrückt und Variable gleich 0. Wenn Variable 0 dann ist das Game 278 noch nicht gestartet 279 { 280 game_screen(); // Game Screen starten 281 282 game_status = 2; 283 //Serial.println("Das Game starten ..."); 284 // Überprüfen ob das Game gestartet wird 285 286 //Variablen zurücksetzen 287 -------------- 288 CursorX = 0; dx=1; 289 CursorY = 0; dy=0; 290 head=0; 291 292 tail=0; 293 counter=4; 294 score=0; 295 print_score(); 296 297 // ------------------------------------ 298 299 //Serial.println("Erasing 300 board..."); //Löschen des Arrays. Sonst sind die Werte beim nächsten Spiel falsch 301 302 for (int i=0;i<31;i++) { 303 for (int j=0;j<20;j++) { 304 blocked[i][j]=0; 305 306 } 307 } 308 //Serial.println(blocked[0][0]); 309 //Serial.println("Board 310 erased..."); 311 food_generator(); 312 } 313 break; 314 315 316 case 2: // The game has been started! 317 318 if ( blocked[CursorX][CursorY]==1)//Überprüfen 319 pb die Schlange schon an der Stelle war an der sie grade ist. -> Werte wo sie war 320 werden im Array blocked gespeichert 321 { 322 game_status=3; //I'm 323 dying.... 324 } 325 // ------------------ Schlange laufen lassen ------------------------------------------------------------------------------------------------------------------------------------------------------ 326 327 328 tft.drawRect(p2s_x(CursorX), p2s_y(CursorY), 10, 10, ILI9341_GREEN); 329 // Draw Snake 330 blocked[CursorX][CursorY]=1; // Da war die Schlnage schon, 331 wird in Array blocked gespeichert 332 333 delay(125); 334 335 position_x[head] 336 = CursorX; //Wo die Schlange grade war (CursorX) wird in array position_x gespeichert. 337 Diese Stelle wird immer eine Stelle hochgezählt um den alten wert nicht zu überschreiben. 338 339 position_y[head] = CursorY; //Wo die Schlange grade war (CursorX) wird in 340 array position_x gespeichert. Diese Stelle wird immer eine Stelle hochgezählt um 341 den alten wert nicht zu überschreiben. 342 head++; // Hochzählen des Wertes 343 für die zwei oberen Befehle 344 345 if(head >= maximum_snake_lenght) 346 // Wenn head größer oder gleich maximum_snake_lenght-300 erreicht hat, wird head 347 auf 0 gesetzt um neue Werte speichern zu können. 348 { 349 head=0; 350 351 } 352 353 move_tail(); 354 355 // ------------------ Schlange laufen 356 lassen Ende ------------------------------------------------------------------------------------------------------------------------------------------------------ 357 358 359 //------Kolision bemerken und Spiel beenden Anfang ---------------- 360 361 362 363 CursorX+=dx; 364 CursorY+=dy; 365 366 if(CursorX == 31) // 367 Überprüfen ob Schlange den rechten Rand berührt hat 368 { 369 game_status 370 = 3; 371 } 372 if(CursorX < 0) // Überprüfen ob Schlange den linken Rand 373 berüht hat 374 { 375 game_status = 3; 376 } 377 if(CursorY 378 == -1) // Überprüfen ob Schlange den oberen Rand berüht hat 379 { 380 game_status 381 = 3; 382 } 383 if(CursorY == 20) // Überprüfen ob Schlange den unteren 384 Rand berührt hat 385 { 386 game_status = 3; 387 } 388 389 //------Kolision 390 bemerken und Spiel beenden Ende---------------- 391 392 //--------------------Essen 393 gegessen? Anfang ----------------------------------- 394 395 if(random_generator_for_food_x 396 == CursorX && random_generator_for_food_y == CursorY) // Überprüfen ob Schlange 397 gegessen hat. Wenn ja dann: 398 { 399 food_generator(); // Aufrufen 400 um einen Apfel an anderer Stelle spawnen zu lassen 401 counter=1; // Schlange 402 um 1 Block erhöhen 403 score+=10; // Score um 10 erhöhen 404 print_score(); 405 // Score ausgeben 406 } 407 //--------------------Essen gegessen? Ende-- 408 ----------------------------------- 409 410 //--------------Joystick Position 411 bestimmen und schreiben --------------------- 412 413 if(JoystickX>900) 414 415 { 416 //Serial.println("laufe nach rechts "); 417 dx=1;dy=0; 418 419 } 420 if(JoystickX<300) 421 { 422 //Serial.println("laufe 423 nach links"); 424 dx=-1;dy=0; 425 } 426 if(JoystickY>900) 427 428 { 429 //Serial.println("laufe nach unten "); 430 dx=0;dy=1; 431 432 } 433 if(JoystickY<300) 434 { 435 //Serial.println("laufe 436 nach oben"); 437 dx=0;dy=-1; 438 } 439 //--------------Joystick 440 Position bestimmen und schreiben Ende---------------- 441 442 break; 443 444 445 case 3: 446 { 447 loser_screen(); // Lose Screen anzeigen 448 449 game_status=1; // Game Status auf 1 stellen. Der Lose Screen wird so lange 450 angezeigt bis case 1 der Status des Buttons überprüft wird. Ob er gedrückt wurde. 451 452 break; 453 } 454 455 } 456 457} 458 459//------------------------------------------------------------------------------------------------------------------------ 460//----------------------------------------Void 461 Loop Ende------------------------------------------------------------------ 462//------------------------------------------------------------------------------------------------------------------------
Bitmaps Part 1
c_cpp
Bitmaps displayed in the Welcome Screen and Lost Screen
1#include <avr/pgmspace.h> 2#include "bitmaps.h" 3 4const unsigned char wellcome_snake[] PROGMEM = { 5 0x00,0x00,0x00,0x0F,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, 6 0x00,0x00,0x00,0x08,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 7 0x00,0x00,0x00,0x38,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00, 8 0x00,0x00,0x00,0x21,0xFE,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 9 0x00,0x00,0x00,0xE1,0xFE,0x1C,0x00,0x00,0x00,0x00,0x00,0x00, 10 0x00,0x00,0x00,0x87,0xF9,0x84,0x00,0x00,0x00,0x00,0x00,0x00, 11 0x00,0x00,0x0F,0x87,0xF9,0x84,0x00,0x00,0x00,0x00,0x00,0x00, 12 0x00,0x00,0x08,0x1F,0x9F,0xE4,0x00,0x00,0x00,0x00,0x00,0x00, 13 0x00,0x00,0x38,0x1F,0x9F,0xE4,0x00,0x3F,0xC0,0x00,0x00,0x00, 14 0x00,0x00,0x21,0xFF,0xFF,0xE4,0x00,0x20,0x40,0x00,0x00,0x00, 15 0x00,0x00,0xE1,0xFF,0xFF,0xE7,0x00,0x20,0x40,0x00,0x00,0x00, 16 0x00,0x00,0x87,0xFF,0xFF,0xF9,0x00,0x26,0x40,0x00,0x00,0x00, 17 0x00,0x03,0x87,0xFF,0xFF,0xF9,0x00,0xE6,0x40,0x00,0x00,0x00, 18 0x00,0x02,0x1F,0xFE,0x7F,0xE1,0x00,0x86,0x40,0x00,0x00,0x00, 19 0x00,0x02,0x1F,0xFE,0x7F,0xE1,0x00,0x86,0x70,0x00,0x00,0x00, 20 0x00,0x02,0x7F,0x9E,0x1F,0xE7,0x00,0x9F,0x90,0x00,0x00,0x00, 21 0x00,0x0E,0x7F,0x9E,0x1F,0xE4,0x00,0x9F,0x90,0x00,0x00,0x00, 22 0x00,0x08,0x7E,0x07,0x9F,0x84,0x00,0x9F,0x90,0x00,0x00,0x00, 23 0x00,0x08,0x7E,0x07,0x9F,0x84,0x00,0x9F,0x90,0x00,0x00,0x00, 24 0x00,0x09,0xF9,0xE1,0xE0,0x1C,0x00,0x9F,0x90,0x00,0x00,0x00, 25 0x00,0x09,0xF9,0x21,0xE0,0x10,0x00,0x9F,0x90,0x00,0x00,0x00, 26 0x00,0x09,0xE1,0x38,0x00,0x70,0x00,0x9F,0x90,0x00,0x00,0x00, 27 0x00,0x09,0xE1,0x08,0x00,0x70,0x00,0x9F,0x90,0x00,0x00,0x00, 28 0x00,0x09,0xE7,0x0F,0xF8,0x10,0x00,0x9F,0x90,0x00,0x00,0x00, 29 0x00,0x09,0xE4,0x00,0x08,0x1C,0x00,0x9F,0x90,0x00,0x00,0x00, 30 0x00,0x09,0xE4,0x00,0x0E,0x04,0x00,0x9F,0x90,0x00,0x00,0x00, 31 0x00,0x09,0xE4,0x00,0x02,0x07,0x00,0x9F,0x93,0xFF,0x00,0x00, 32 0x00,0x09,0xE4,0x00,0x03,0x81,0x00,0x9F,0x92,0x01,0x00,0x00, 33 0x00,0x09,0xE7,0x00,0x00,0x81,0x00,0x9F,0x9E,0x01,0xC0,0x00, 34 0x00,0x09,0xF9,0x00,0x00,0x9F,0x00,0x9F,0x80,0x78,0x40,0x00, 35 0x00,0x09,0xF9,0xC0,0x00,0x90,0xFF,0x9F,0x80,0x78,0x7C,0x00, 36 0x00,0x08,0x78,0x40,0x00,0xF0,0x80,0x1F,0x87,0xFE,0x04,0x00, 37 0x00,0x08,0x78,0x43,0xFC,0xFF,0x80,0x1F,0x87,0xFE,0x07,0xC0, 38 0x00,0x0E,0x1E,0x42,0x04,0x86,0x1F,0x87,0x9F,0xFE,0x60,0x40, 39 0x3C,0x02,0x1E,0x7E,0x07,0x86,0x1F,0x87,0x9F,0xFE,0x60,0x70, 40 0x24,0x03,0x9F,0x99,0xF8,0x78,0x7F,0xE7,0xFF,0xF8,0x7E,0x10, 41 0xE7,0x00,0x9F,0x99,0xF8,0x78,0x7F,0xE7,0xFF,0xF8,0x7E,0x10, 42 0x81,0x00,0x81,0xE1,0xFF,0xFE,0x61,0xE7,0xFF,0x81,0x87,0x90, 43 0x81,0xC0,0x81,0xE1,0xFF,0xFE,0x61,0xE7,0xFF,0x81,0x87,0x90, 44 0x98,0x40,0xF9,0xF8,0x7F,0xFE,0x61,0xE7,0xF8,0x1F,0x87,0x90, 45 0x98,0x40,0x09,0xF8,0x7F,0xFE,0x61,0xE7,0xF8,0x1F,0x87,0x90, 46 0x9E,0x40,0x08,0x7E,0x7F,0xFE,0x7F,0xE7,0xF8,0x7F,0xFE,0x10, 47 0x9E,0x7C,0x08,0x7E,0x7F,0xFE,0x7F,0xE7,0xF8,0x7F,0xFE,0x10, 48 0xE7,0x84,0x0E,0x7E,0x7F,0xFE,0x7F,0xE7,0xFE,0x1F,0x80,0x70, 49 0x27,0x87,0xFE,0x7E,0x7F,0xFE,0x7F,0xE7,0xFE,0x1F,0x80,0x40, 50 0x27,0xE0,0x00,0x7E,0x78,0x7E,0x7F,0xE1,0x9F,0x87,0xE7,0xC0, 51 0x27,0xE0,0x00,0x7E,0x78,0x7E,0x7F,0xE1,0x9F,0x87,0xE7,0x00, 52 0x21,0xFF,0xFF,0xFE,0x79,0x9E,0x61,0xF9,0x87,0xE7,0xF9,0x00, 53 0x21,0xFF,0xFF,0xFE,0x79,0x9E,0x61,0xF9,0x87,0xE7,0xF9,0xC0, 54 0x38,0x7F,0xFF,0xE0,0x79,0x9E,0x66,0x79,0x81,0xE7,0xFE,0x40, 55 0x08,0x7F,0xFF,0xE0,0x79,0x9E,0x66,0x79,0x81,0xE7,0xFE,0x40, 56 0x0E,0x00,0x00,0x06,0x01,0x80,0x1E,0x00,0x18,0x61,0xFE,0x40, 57 0x02,0x00,0x00,0x06,0x01,0x80,0x12,0x00,0x18,0x61,0xFE,0x40, 58 0x03,0xFF,0xFF,0xFF,0xFF,0xFF,0xF3,0xFF,0xFE,0x06,0x01,0xC0, 59 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x06,0x01,0x00, 60 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xFF,0x00 61}; 62 63const unsigned char dead_snake[] PROGMEM = { 64 0x00,0xFF,0xF0,0x00,0x00,0x00,0x3F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 65 0x00,0x80,0x10,0x00,0x00,0x00,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 66 0x03,0x80,0x1C,0x00,0x00,0x00,0xE0,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 67 0x02,0x7F,0xE4,0x00,0x00,0x00,0x87,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 68 0x0E,0x7F,0xE4,0x00,0x00,0x00,0x87,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 69 0x09,0xFF,0xE4,0x00,0x00,0x00,0x9F,0xE4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 70 0x39,0xFF,0xE4,0x00,0x00,0x03,0x9F,0xE7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 71 0x27,0xE0,0x1C,0x00,0x00,0x02,0x1F,0xE1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 72 0x27,0xE0,0x10,0x00,0x00,0x02,0x1F,0xE1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 73 0x27,0x87,0xF0,0x00,0x00,0x02,0x7F,0xF9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 74 0x27,0x84,0x00,0x00,0x00,0x02,0x7F,0xF9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 75 0x27,0x9C,0x00,0x00,0x00,0x02,0x7F,0xF9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 76 0x27,0x93,0xFF,0xFF,0xFF,0xFE,0x7F,0xF9,0xFF,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x00, 77 0x27,0x92,0x06,0x19,0x99,0x80,0x7F,0xF9,0x86,0x06,0x60,0x40,0x00,0x00,0x00,0x00, 78 0x27,0x9E,0x06,0x19,0x99,0x80,0x7F,0xF9,0x86,0x06,0x60,0x7C,0x00,0x00,0x00,0x00, 79 0x27,0x99,0xF9,0xE6,0x66,0x7E,0x7F,0xF8,0x79,0xF9,0x9F,0x84,0x00,0x00,0x00,0x00, 80 0x27,0x99,0xF9,0xE6,0x66,0x7E,0x7F,0xF8,0x79,0xF9,0x9F,0x87,0x3F,0xF0,0x00,0x00, 81 0x27,0x99,0xF9,0xFF,0xFF,0xFF,0xFF,0xFE,0x7F,0xFF,0xFF,0xE1,0x20,0x10,0x00,0x00, 82 0x27,0x99,0xF9,0xFF,0xFF,0xFF,0xFF,0xFE,0x7F,0xFF,0xFF,0xE1,0xE0,0x1C,0x00,0x00, 83 0x27,0x9E,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF8,0x7E,0x1F,0xE4,0x00,0x00, 84 0x27,0x9E,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF8,0x7E,0x1F,0xE7,0x00,0x00, 85 0x27,0xE1,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF9,0x9F,0xFF,0x99,0x00,0x00, 86 0x27,0xE1,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF9,0x9F,0xFF,0x99,0xC0,0x00, 87 0x21,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE7,0xFF,0xF9,0xE7,0xFE,0x06,0x40,0x00, 88 0x21,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE7,0xFF,0xF9,0x27,0xFE,0x06,0x40,0x00, 89 0x39,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE7,0xE1,0xFF,0xF9,0x21,0xE7,0x9E,0x40,0x00, 90 0x09,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE7,0xE1,0xFF,0xF9,0x21,0xE7,0x9E,0x40,0x00, 91 0x09,0xFF,0x9E,0x1E,0x66,0x7E,0x1F,0xE1,0x99,0xF9,0xE1,0x39,0x81,0xFE,0x40,0x00, 92 0x09,0xFF,0x9E,0x1E,0x66,0x7E,0x1F,0xE1,0x99,0xF9,0xE1,0x09,0x81,0xFE,0x40,0x00, 93 0x09,0x80,0x61,0xE1,0x99,0x81,0xE0,0x1E,0x7E,0x06,0x1F,0x09,0xE7,0xF8,0x40,0x00, 94 0xF9,0x80,0x61,0x21,0x99,0x81,0x20,0x12,0x42,0x06,0x10,0x09,0xE7,0xF8,0x43,0xC0, 95 0x87,0x9F,0xFF,0x3F,0xFF,0xFF,0x3F,0xF3,0xC3,0xFF,0xF0,0x0E,0x7F,0xE0,0x42,0x40, 96 0x87,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x7F,0xE0,0x7E,0x70, 97 0x9E,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x18,0x00,0x10, 98 0x9E,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x18,0x00,0x10, 99 0xE1,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x00,0x70, 100 0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x40, 101 0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xC0 102}; 103
Downloadable files
Fritzing File
Fritzing File
Fritzing File

Fritzing File SVG
SVG Image
Fritzing File SVG
Fritzing File SVG
SVG Image
Fritzing File SVG
Fritzing File
Fritzing File
Fritzing File

Comments
Only logged in users can leave comments