这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » Let'sDo第2期活动-成果帖

共9条 1/1 1 跳转至

Let'sDo第2期活动-成果帖

菜鸟
2024-09-07 23:00:46     打赏

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

snake.zip


菜鸟
2024-09-07 23:04:27     打赏
2楼

视频https://www.bilibili.com/video/BV1FppbecEMt/?share_source=copy_web&vd_source=4b9c499d8564e7ad9169a2c39fa19a17


菜鸟
2024-09-07 23:55:29     打赏
3楼

谢谢分享


专家
2024-09-08 09:35:40     打赏
4楼

不错啊


专家
2024-09-08 11:56:42     打赏
5楼

谢谢分享


高工
2024-09-08 11:58:31     打赏
6楼

谢谢分享


专家
2024-09-08 12:00:56     打赏
7楼

感谢楼主分享


工程师
2024-09-08 12:25:28     打赏
8楼

赞赞赞


专家
2024-09-14 10:29:47     打赏
9楼

感谢楼主分享



共9条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]