出差耽误了一段时间,终于完成了贪吃蛇的产生、控制移动,使用arduino开发的。
屏幕需要注意的是RST脚是没有的,-1即可
#define TFT_DC 16 #define TFT_CS 17 #define TFT_SCLK 18 #define TFT_MOSI 19 #define TFT_RST -1 #define TFT_BL 20 Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
背光一定要开启,不然黑屏,这个坑了我很久
pinMode(TFT_BL, OUTPUT); digitalWrite(TFT_BL, HIGH);
控制贪吃蛇移动
void aclick() { digitalWrite(RGB_RedPin, HIGH); dx=0; dy=-1; Serial.println("a"); } void bclick() { digitalWrite(RGB_RedPin, LOW); dx=0; dy=1; Serial.println("b"); } void xclick() { digitalWrite(RGB_RedPin, HIGH); dx=-1; dy=0; Serial.println("x"); } void yclick() { digitalWrite(RGB_RedPin, LOW); dx=1; dy=0; Serial.println("y"); }
食物随机产生
void food_generator() { random_generator_for_food_x = random(0,31); // Random Zahl wischen 0 und 31 generieren random_generator_for_food_y = random(0,20); // Random Zahl wischen 0 und 20 generieren random_food_x = p2s_x(random_generator_for_food_x); // X Koordiante für den Apfel ausrechnen random_food_y = p2s_y(random_generator_for_food_y); // Y Koordiante für den Apfel ausrechnen }
完整代码
#include "SPI.h" #include "Adafruit_GFX.h" #include "Adafruit_ST7789.h" #include "bitmaps.h" #include "OneButton.h" #include "RPi_Pico_TimerInterrupt.h" // Color definitions #define ILI9341_BLACK 0x0000 #define ILI9341_BLUE 0x001F #define ILI9341_RED 0xF800 #define ILI9341_GREEN 0x07E0 #define ILI9341_CYAN 0x07FF #define ILI9341_MAGENTA 0xF81F #define ILI9341_YELLOW 0xFFE0 #define ILI9341_WHITE 0xFFFF #define ILI9341_PURPLE ILI9341_BLUE #define TFT_DC 16 #define TFT_CS 17 #define TFT_SCLK 18 #define TFT_MOSI 19 #define TFT_RST -1 #define TFT_BL 20 Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST); #define Joystick_X 14 #define Joystick_Y 15 #define Joystick_A 12 #define Joystick_B 13 OneButton buttonx(Joystick_X, INPUT_PULLUP, true); OneButton buttony(Joystick_Y, INPUT_PULLUP, true); OneButton buttona(Joystick_A, INPUT_PULLUP, true); OneButton buttonb(Joystick_B, INPUT_PULLUP, true); #define maximum_snake_lenght 300 // So lang darf die Schlange werden #define spielfeld_breite 31 // Spielfeld breite #define spielfeld_hoehe 20 // Spielfedl höhe #define p2s_x(p_x) (10*p_x+5) // Umrechnung in Spiel Koordinaten #define p2s_y(p_y) (10*p_y+35) // Umrechnung in Spiel Koordinaten int JoystickX; int JoystickY; int game_status = 0; // Wird benötigt für die Switch Case Anweisung int CursorX; int CursorY; int dx=1,dy=0;//移动方向控制 int schlangen_laenge; // Aktuelle länge der Schlange byte blocked[spielfeld_breite][spielfeld_hoehe]; //Maxiamel Länge der Schlange byte position_x[maximum_snake_lenght]; //Maximale Länge der Einheiten die gespeichert werden können für die Positionen bei denen die Schlange war. byte position_y[maximum_snake_lenght]; //Maximale Länge der Einheiten die gespeichert werden können für die Positionen bei denen die Schlange war. int head = 0; // wo habe ich im array gespeichert. int tail = 0; // Angeafnegn bei -5 weil somit ein Puffer von 5 Einheiten erstellt wird. das ist die aktuelle Länge der Schlange. int counter = 5; int random_food_x; // Variable X für den ersten Spawnpunkt des Essens int random_food_y; // Variable Y für den zweiten Spawnpunkt des Essens int random_generator_for_food_x; // Random generierte Zahlen für den Apfel int random_generator_for_food_y; // Random generierte Zahlen für den Apfel void food_generator() { random_generator_for_food_x = random(0,31); // Random Zahl wischen 0 und 31 generieren random_generator_for_food_y = random(0,20); // Random Zahl wischen 0 und 20 generieren random_food_x = p2s_x(random_generator_for_food_x); // X Koordiante für den Apfel ausrechnen random_food_y = p2s_y(random_generator_for_food_y); // Y Koordiante für den Apfel ausrechnen } void move_tail() { if(counter > 0) { counter-=1; } else { tft.drawRect(p2s_x(position_x[tail]), p2s_y(position_y[tail]), 10, 10, ILI9341_BLACK); blocked[position_x[tail]][position_y[tail]] = 0; tail++; if(tail >= maximum_snake_lenght) { tail = 0; } } } const int RGB_RedPin = 6; void aclick() { digitalWrite(RGB_RedPin, HIGH); dx=0; dy=-1; Serial.println("a"); } void bclick() { digitalWrite(RGB_RedPin, LOW); dx=0; dy=1; Serial.println("b"); } void xclick() { digitalWrite(RGB_RedPin, HIGH); dx=-1; dy=0; Serial.println("x"); } void yclick() { digitalWrite(RGB_RedPin, LOW); dx=1; dy=0; Serial.println("y"); } RPI_PICO_Timer ITimer0(0); bool TimerHandler0(struct repeating_timer *t) { //Serial.println("ITimer0 called"); buttona.tick(); buttonb.tick(); buttonx.tick(); buttony.tick(); return true; } void setup() { Serial.begin(9600); while (!Serial); ITimer0.attachInterruptInterval(20 * 1000, TimerHandler0); pinMode(TFT_BL, OUTPUT); digitalWrite(TFT_BL, HIGH); pinMode(RGB_RedPin, OUTPUT); buttona.reset(); buttona.attachClick(aclick); buttonb.reset(); buttonb.attachClick(bclick); buttonx.reset(); buttonx.attachClick(xclick); buttony.reset(); buttony.attachClick(yclick); tft.init(240, 320); tft.setRotation(3); tft.fillScreen(ILI9341_BLACK); tft.setTextColor(ILI9341_WHITE); } void loop(void) { int JoystickX; int JoystickY; switch(game_status) { case 0: game_status=1; break; case 1: if(digitalRead(Joystick_A)==LOW) { tft.fillScreen(ILI9341_BLACK); game_status = 2; CursorX = 0; dx=1; CursorY = 0; dy=0; head=0; tail=0; counter=4; for (int i=0;i<31;i++) { for (int j=0;j<20;j++) { blocked[i][j]=0; } } food_generator(); } break; case 2: // The game has been started! if(blocked[CursorX][CursorY]==1) { game_status=3; //I'm dying.... } tft.drawRect(random_food_x,random_food_y, 10, 10, ILI9341_RED); // Zeichen des Apfels tft.drawRect(p2s_x(CursorX), p2s_y(CursorY), 10, 10, ILI9341_GREEN); // Draw Snake tft.drawRect(random_food_x,random_food_y, 10, 10, ILI9341_RED); // Zeichen des Apfels blocked[CursorX][CursorY]=1; // Da war die Schlnage schon, wird in Array blocked gespeichert delay(250); position_x[head] = CursorX; position_y[head] = CursorY; head++; if(head >= maximum_snake_lenght) { head=0; } move_tail(); CursorX+=dx; CursorY+=dy; if(random_generator_for_food_x == CursorX && random_generator_for_food_y == CursorY) { food_generator(); counter=1; } break; case 3: { game_status=1; break; } } }