/* LEDs: 3 - 12 Punkte: Register (Buttons) Player 1: A0, 1-4 in Reg Player 2: A1, 5-7,15 in Reg */ #include "Arduino.h" #define LMAX 13 #define LMIN 3 #define LMID 8 typedef enum direction { up = 1, down = -1 } dir; typedef struct p { int id; int binarynum; int punkte; int pressed; } player; player p1, p2; int speed = 10; // Pin connected to ST_CP of 74HC595 int latchPin = 18; // Pin connected to SH_CP of 74HC595 int clockPin = 17; ////Pin connected to DS of 74HC595 int dataPin = 16; void gameLoop(); int pressLoop(player *p); void ledActive(int l, dir d); void ledOn(int l); void ledOff(int l); void anticheat(int l); void release(int l, dir d); void setPoints(int p); void gameEnd(player *p); void endAnimation(); void startupAnimation(); void resetPlayer(); void setup() { // Serial.begin(9600); // init pins for (int i = 3; i <= LMAX; ++i) { pinMode(i, OUTPUT); } pinMode(14, INPUT); pinMode(15, INPUT); pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); resetPlayer(); randomSeed(analogRead(6)); startupAnimation(); } // int a = 0; // void test() { // if (digitalRead(p1.id)) { // ledOn(8); // } // delay(25); // ledOff(8); // if (digitalRead(p2.id) && a == 0) { // a = 1; // digitalWrite(latchPin, LOW); // shiftOut(dataPin, clockPin, MSBFIRST, 16); // digitalWrite(latchPin, HIGH); // delay(300); // } // if (digitalRead(p2.id) && a == 1) { // a = 0; // digitalWrite(latchPin, LOW); // shiftOut(dataPin, clockPin, MSBFIRST, 0); // digitalWrite(latchPin, HIGH); // delay(200); // } // } void loop() { setPoints(0); gameLoop(); } // Setzt Status des Playerbuttons void anticheat(int l) { if (digitalRead(p1.id) && l != LMAX) { p1.pressed = 1; } if (digitalRead(p2.id) && l != LMIN) { p2.pressed = 1; } } void release(int l, dir d) { if (l == LMAX - 1 && d == down) p1.pressed = 0; if (l == LMIN + 1 && d == up) p2.pressed = 0; } void ledOn(int l) { digitalWrite(l, HIGH); } void ledOff(int l) { digitalWrite(l, LOW); } void ledActive(int l, dir d) { // Rand speed in der Mitte if (l == LMID) { speed = random(30, 120); // speed = 800; } if (d == up) { ledOff(l - 1); } else { ledOff(l + 1); } ledOn(l); // Abfrage was zu tun ist (warten oder Knopf checken) if (l == LMIN) { if (pressLoop(&p2)) { p2.binarynum >>= 1; p2.punkte += p2.binarynum; setPoints(p1.punkte + p2.punkte); } } else if (l == LMAX) { if (pressLoop(&p1)) { p1.binarynum >>= 1; p1.punkte += p1.binarynum; setPoints(p1.punkte + p2.punkte); } } else { delay(speed); anticheat(l); release(l, d); } } // ret 1 wenn in zeit gedrückt, 0 sonst int pressLoop(player *p) { // Falls gecheated wurde, aussetzen if (p->pressed) { delay(speed); return 0; } // Abfrageloop for (int i = 0; i < speed; ++i) { if (digitalRead(p->id)) { return 1; } delay(1); } return 0; } void gameLoop() { int led = LMID; dir d = (random(0,11) < 5) ? up : down; // dir d = up; while (true) { // Richtung bei erreichen von letzter LED wechseln if (led == LMAX && d == up) { d = down; } else if (led == LMIN && d == down) { d = up; } // Je nach Richtung inc oder dec led = (d == up) ? led + 1 : led - 1; // LED aktivieren und buttons checken ledActive(led, d); // GAME OVER if (p1.punkte == 15) { gameEnd(&p1); return; } if (p2.punkte == 240) { gameEnd(&p2); return; } } } void setPoints(int p) { digitalWrite(latchPin, LOW); // shift out the bits: // 1, 2, 4, 8, 16, 32, 64, 128 shiftOut(dataPin, clockPin, MSBFIRST, p); // take the latch pin high so the LEDs will light up: digitalWrite(latchPin, HIGH); } void resetPlayer() { // Player 1 Init p1.id = 15; // Analog 1 p1.binarynum = 16; p1.punkte = 0; p1.pressed = 0; // Player 2 Init p2.id = 14; // Analog 0 p2.binarynum = 256; p2.punkte = 0; p2.pressed = 0; } void gameEnd(player *p) { for (int i = 0; i < 5; ++i) { digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, 0); digitalWrite(latchPin, HIGH); delay(80); digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, p->punkte); digitalWrite(latchPin, HIGH); delay(80); } endAnimation(); digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, 0); digitalWrite(latchPin, HIGH); delay(80); resetPlayer(); } void endAnimation() { int speed = 25; for (int i = 0; i < 10; ++i) { for (int i = 0; i < 6; ++i) { ledOn(LMID + i); ledOn(LMID - i); delay(speed); ledOff(LMID + i); ledOff(LMID - i); } for (int i = 0; i < 6; ++i) { ledOn(LMIN + i); ledOn(LMAX - i); delay(speed); ledOff(LMIN + i); ledOff(LMAX - i); } } } void startupAnimation() { for (int j = 0; j < 2; j++) { for (int i = 1; i < 200; i *= 2) { digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, i); digitalWrite(latchPin, HIGH); delay(100); } } }