Laby­rinth-Spiel TFT Fernbedienung

/*
  GND      (1) - GND
  VCC      (2) - 5V
  RESET    (3) - D9
  D/C      (4) - D8
  CARD-CS  (5) -
  TFT-CS   (6) - D10
  COPI     (7) - D11
  SCK      (8) - D13
  CIPO     (9) -
  LITE    (10) - 5V
*/

# include "IRremote.h"
int EmpfaengerPin = 6;

# include "Adafruit_GFX.h"
# include "Adafruit_ST7735.h"

# define TFT_CS        10
# define TFT_RST        9
# define TFT_DC         8
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);

/*
  Farben als hexadezimal definiert
  alternativ:
  int SCHWARZ = 0;
  int FARBE = 15;
  . . .
*/
// Farben
# define SCHWARZ    0x0000 // dezimal 0
# define BLAU       0x000F // dezimal 15
# define ROT        0xF800 // dezimal 406664
# define GRUEN      0x0E81 // dezimal 3713
# define CYAN       0x07FF // dezimal 2047
# define MAGENTA    0xF81F // dezimal 63519
# define GELB       0xAFE5 // dezimal 65504
# define WEISS      0xFFFF // dezimal 65535
# define BRAUN      0xFC00 // dezimal 64512
# define GRAU       0xF7F0 // dezimal 63472
# define GRUENGELB  0xAFE5 // dezimal 45029
# define DUNKELCYAN 0x03EF // dezimal 1007
# define ORANGE     0xFD20 // dezimal 64800
# define PINK       0xFC18 // dezimal 64536

// Farbe der Blöcke
# define FARBE GRUEN

// Farbe des Kreises
# define KREISFARBE ROT

// Farbe der Schrift
# define SCHRIFTFARBE WEISS

// Spiel starten wenn * gedrückt wurde
bool SpielStart = false;

const int Radius = 10;
const int Abstand = Radius * 2;

// je höher, dest langsamer
const int Geschwindigkeit = 100;

// Bewegung des Kreises in Pixeln
const int Bewegung = 5;

// Startposition des Kreises
int CursorX = Radius;
int CursorY = tft.height() / 2 - Abstand;

// Variable für die Zeitmessung
long Start;

void setup()
{
  // Startbildschirm
  // schwarzes Farbschema horizontale Ausrichtung
  // Cursor setzen, Schriftgröße und -farbe definieren
  tft.initR(INITR_BLACKTAB);
  tft.setRotation(0);
  tft.fillScreen(SCHWARZ);
  tft.setTextSize(2);
  tft.setCursor(1, 10);
  tft.setTextColor(SCHRIFTFARBE);

  tft.println("Start:");
  tft.print("-> *");
  Serial.begin(9600);
  IrReceiver.begin(EmpfaengerPin);
}

void loop()
{
  if (IrReceiver.decode())
  {
    delay(100);

    // nächsten Wert lesen
    IrReceiver.resume();
    
    // Start mit *
    if (IrReceiver.decodedIRData.command == 0x42)
    {
      // Spiel wird gestartet
      SpielStart = true;

      // Parcours bauen
      ParcoursBauen();

      // Zeitmessung starten
      Start = millis();
    }
  }

  // wenn der Button * gedrückt wurde
  if (SpielStart)
  {
 
    if (IrReceiver.decodedIRData.command == 0x40)
    {
      // Kreis an der aktuellen Position anhalten
      tft.fillCircle(CursorX, CursorY, Radius, KREISFARBE);
    }

    // nach oben
    if (IrReceiver.decodedIRData.command == 0x46)
    {
      // Kreis an der aktuellen Position "löschen"
      tft.fillCircle(CursorX, CursorY, Radius, SCHWARZ);

      // wenn der Bildschirmrand noch nicht erreicht wurde
      // rückwärts (Richtung x = 1) bewegen
      if (CursorY > Radius) CursorY -= Bewegung;
      tft.fillCircle(CursorX, CursorY, Radius, KREISFARBE);
      delay(Geschwindigkeit);
    }

    // nach unten
    else if (IrReceiver.decodedIRData.command == 0x15)
    {
      tft.fillCircle(CursorX, CursorY, Radius, SCHWARZ);
      if (CursorY < tft.height() - Radius) CursorY += Bewegung;
      tft.fillCircle(CursorX, CursorY, Radius, KREISFARBE);
      delay(Geschwindigkeit);
    }

    // nach links
    if (IrReceiver.decodedIRData.command == 0x44)
    {
      tft.fillCircle(CursorX, CursorY, Radius, SCHWARZ);
      if (CursorX > Radius) CursorX -= Bewegung;
      tft.fillCircle(CursorX, CursorY, Radius, KREISFARBE);
      delay(Geschwindigkeit);
    }

    // nach rechts
    if (IrReceiver.decodedIRData.command == 0x43)
    {
      tft.fillCircle(CursorX, CursorY, Radius, SCHWARZ);
      CursorX += Bewegung;
      tft.fillCircle(CursorX, CursorY, Radius, KREISFARBE);
      delay(Geschwindigkeit);
    }

    // rechter Bildschirmrand erreicht -> Spielende
    if (CursorX > tft.height() - Radius)
    {
      ErgebnisZeigen();
    }
  }
}

void ErgebnisZeigen()
{
  // Zeit berechnen
  int Sekunden;
  long VerstricheneZeit = millis() - Start;
  Sekunden = int(VerstricheneZeit / 1000);

  // Zeit anzeigen
  tft.fillScreen(SCHWARZ);
  tft.setTextSize(2);
  tft.setCursor(1, 10);
  tft.println("Zeit:");
  tft.println(String(Sekunden) + " s");

  tft.setCursor(1, 40);
  tft.setTextColor(ROT);
  tft.println();
  tft.println("Neustart:");
  tft.println("-> *");
  SpielStart = false;
}

void ParcoursBauen()
{
  CursorX = Radius;
  CursorY = tft.height() / 2 - Abstand;
  tft.fillScreen(SCHWARZ);

  // Kreis anzeigen
  tft.fillCircle(CursorX, CursorY, Radius, KREISFARBE);

  // Parcours "bauen"
  tft.fillRect(65, 35, 5, 45, FARBE);
  tft.fillRect(1, 1, 35, 35, FARBE);
  tft.fillRect(1, 80, 70, 80, FARBE);
  tft.fillRect(110, 1, 70, 95, FARBE);
  tft.fillRect(110, 130, 140, 160, FARBE);
}

Letzte Aktualisierung: 18. Nov 2023 @ 10:56