出差耽误了一段时间,终于完成了贪吃蛇的产生、控制移动,使用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;
}
}
}
我要赚赏金
