Hallo Zusammen,
ich habe ein kleines Problemchen. Und zwar möchte ich auf einem 16x32 Led Board (Freetronics dmd) das Spiel Snake programmieren.
Ich stehe noch relativ am Anfang, deshalb habe ich bisher nur erreicht, dass man über ein Terminal (Putty Putty) mit den Tasten WASD eine Led steuern kann, d.h. es geht immer eine Led in einer Richtung an wenn ich eine der Tasten drücke.
Nun möchte ich eine Zufällige Led einschalten, wo man sich dann hinbewegt.
Dazu würde ich die Funktion random() nutzen, sodass eine zufällige Led eingeschaltet wird.
Ich möchte aber halt eben dass nur eine Led dann angeht und auch anbleibt wenn ich über WASD die anderen Leds steuere.
Wenn ich alles Led über die Funktion zufällig einschalten möchte, dann Funktioniert das auch.
Jedoch möchte ich ja das nur eine Zufällig angeht.
Ich dachte eigentlich man könnte das einfach über eine Flag machen, sodass zuerst die Flag true ist, eine Random Led eingeschlatet wird und dann wird die Flag false.
Leider funktioniert das nicht so wie ich es mir vorstelle, es geht nämlich dann garkeine an.
Unten ist mein bisheriger Code zu finden.
Falls jemand eine Idee hat, würde ich mich sehr über einen Tipp freuen.
#include <SPI.h> //SPI.h must be included as DMD is written by SPI (the IDE complains otherwise)
#include <DMD.h>
#include <TimerOne.h>
#include "SystemFont5x7.h"
#include "Arial_black_16.h"
/*Vartiablen für DMD Bibliothek*/
#define DISPLAYS_ACROSS 1
#define DISPLAYS_DOWN 1
DMD dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN);
bool test_r = true;
bool test_l = true;
bool statusOff = HIGH;
int i;
int c;
int w_vor = 0;
int d_vor = 0;
int a_zurueck = 0;
int s_zurueck = 0;
int interval = 4000;
int previousMillis;
char char_eingabe1;
int q = 6;
int f = 6;
int akt_positionX;
int akt_positionY;
int randomNumberX;
int randomNumberY;
bool randomFlagSet = true;
class XYKoordinaten {
private:
int X;
int Y;
uint32_t previousMillis = 0;
byte interval = 30;
public:
XYKoordinaten(int X, int Y):
X{X},
Y{Y}
{}
void fahreWeiter() {
byte b;
dmd.selectFont(Arial_Black_16);
for (byte y = 0; y < DISPLAYS_DOWN; y++) {
for (byte x = 0; x < DISPLAYS_ACROSS; x++) {
int ix = 32 * x;
int iy = 16 * y;
if (Serial.available () > 0) {
char_eingabe1 = Serial.read();
switch (char_eingabe1) {
case 'a':
w_vor++;
X++;
dmd.writePixel(X, Y, GRAPHICS_NORMAL, 1);
dmd.writePixel(X - 1, Y, GRAPHICS_NOR, 1);
randomFlagSet = false;
break;
case 's':
a_zurueck++;
Y--;
dmd.writePixel(X, Y, GRAPHICS_NORMAL, 1);
dmd.writePixel(X, Y + 1, GRAPHICS_NOR, 1);
break;
case 'd':
s_zurueck++;
X--;
dmd.writePixel( X, Y, GRAPHICS_NORMAL, 1);
dmd.writePixel(X + 1, Y, GRAPHICS_NOR, 1);
break;
case 'w':
d_vor++;
Y++;
dmd.writePixel( X, Y, GRAPHICS_NORMAL, 1);
dmd.writePixel(X, Y - 1, GRAPHICS_NOR, 1);
break;
}
if (X == randomNumberX && Y == randomNumberY) {
delay(6000);
}
}
}
}
}
};
XYKoordinaten anfang(10, 10);
void ScanDMD() {
dmd.scanDisplayBySPI();
}
void setup() {
Timer1.initialize( 5000 ); //period in microseconds to call ScanDMD. Anything longer than 5000 (5ms) and you can see flicker.
Timer1.attachInterrupt( ScanDMD ); //attach the Timer1 interrupt to ScanDMD which goes to dmd.scanDisplayBySPI()
dmd.clearScreen( true ); //true is normal (all pixels off), false is negative (all pixels on)
Serial.begin(9600);
Serial.setTimeout(600);
}
void loop() {
anfang.fahreWeiter();
if (randomFlagSet == true) {
Serial.println("hier");
randomNumberX = random(0, 16);
randomNumberY = random(0, 32);
dmd.writePixel( randomNumberX, randomNumberY, GRAPHICS_NORMAL, 1);
randomFlagSet = false;
}
}
Vielen dank schon mal!