//Mainīgie
//gaismas
#define G1 13
#define G2 4
#define R1 12
#define R2 10
#define R3 9
#define R4 8
#define R5 7
#define R6 6
#define R7 5
#define BUZZER 11
unsigned long Time;
unsigned long UzvaraTime = 0;
unsigned long animationEndTime = 0;
int gamestate = 1; //1 - idle; 2 - settings; 3 - game
int Pause = 1000;
int Pause_set = 1;
int lights[] = {G1, R1, R2, R3, R4, R5, R6, R7, G2};
int nr = 0;
int punkti1 = 0;
int punkti2 = 0;
int dir = 1;
int saved_nr = 0;
int saved_dir = 1;
bool saved_led_states[9];
bool animationActive = false;
bool raksts = false;
bool uzvara_ir = false;
bool restarted = true;
//pogas
#define BUTTON_1 3
#define BUTTON_2 2
bool buttonWasPressed = false;
bool buttonWasPressed2 = false;
void buttonPress1(){
bool buttonIsPressed = !digitalRead(BUTTON_1);
if (buttonIsPressed && !buttonWasPressed){
buttonWasPressed = true;
Serial.println("Nospieda pogu 1");
delay(300);
if (gamestate == 1 && uzvara_ir) {
restarted = true;
uzvara_ir = false;
punkti1 = 0;
punkti2 = 0;
gamestate = 3;
nr = 0;
dir = 1;
animationActive = false;
for (int i = 0; i < 9; i++) digitalWrite(lights[i], 0);
}
else if (gamestate == 3) {
if (digitalRead(G2) == 1){
tone(BUZZER, 800, 80);
punkti1++;
animacija1();
} else {
tone(BUZZER, 100, Pause-100);
navpunkts();
}
}
else if (gamestate == 1) {
tone(BUZZER, 800, 500);
digitalWrite(R4, 0);
gamestate = 3;
for (int i = 0; i < 9; i++) digitalWrite(lights[i], 0);
}
else if (gamestate == 2) {
tone(BUZZER, 300, 100);
if (Pause_set == 4) Pause_set = 0;
Pause_set++;
Pause_set = max(1, min(Pause_set, 5));
}
}
buttonWasPressed = buttonIsPressed;
}
void settings(){
if (gamestate == 2){
for (int i = 0; i < 9; i++) {
digitalWrite(lights[i], 0);
}
digitalWrite (R1, 1);
Pause = 1000;
if (Pause_set > 1){
digitalWrite(R2, 1);
Pause = 700;
}
if (Pause_set > 2){
digitalWrite(R3, 1);
Pause = 500;
}
if (Pause_set > 3){
digitalWrite(R4, 1);
Pause = 200;
}
}
}
void buttonPress2() {
bool buttonIsPressed = !digitalRead(BUTTON_2);
if (buttonIsPressed && !buttonWasPressed2) {
buttonWasPressed2 = true;
Serial.println("Nospieda pogu 2");
delay(300);
if (gamestate == 1 && uzvara_ir) {
nr = 0;
dir = 1;
restarted = true;
uzvara_ir = false;
punkti1 = 0;
punkti2 = 0;
gamestate = 2;
animationActive = false;
for (int i = 0; i < 9; i++) digitalWrite(lights[i], 0);
}else if (gamestate == 3){
if (digitalRead(G1) == 1) {
tone(BUZZER, 800, 80);
punkti2++;
animacija2();
} else {
tone(BUZZER, 100, Pause-100);
navpunkts();
}
} else if (gamestate == 1){
tone(BUZZER, 800, 500);
gamestate = 2;
for (int i = 0; i < 9; i++) {
digitalWrite(lights[i], 0);
}
} else if (gamestate == 2){
tone(BUZZER, 800, 500);
for (int i = 0; i < 9; i++) {
digitalWrite(lights[i], 0);
}
gamestate = 1;
}
}
buttonWasPressed2 = buttonIsPressed;
}
void navpunkts(){
if (millis()> animationEndTime){
saved_nr = nr;
saved_dir = dir;
for (int i = 0; i < 9; i++) {
saved_led_states[i] = digitalRead(lights[i]);
}
lightsoff();
delay(100);
//gaismas
for (int i=1; i < 8; i++){
digitalWrite(lights[i], 1);
}
digitalWrite(G1, 0);
digitalWrite(G2, 0);
animationActive = true;
delay(100);
animationEndTime = millis() + Pause - 100;}
//animationActive = false;
}
void uzvara1(){
gamestate = 1;
for (int i = 0; i < 9; i++) {
digitalWrite(lights[i], 0);
}
digitalWrite(G1, 1);
uzvara_ir = true;
UzvaraTime = millis();
}
void uzvara2(){
gamestate = 1;
for (int i = 0; i < 9; i++) {
digitalWrite(lights[i], 0);
}
digitalWrite(G2, 1);
uzvara_ir = true;
UzvaraTime = millis();
}
void uzvaras_raksts(){
if (!uzvara_ir){
return;
}
if (gamestate != 1){
return;
}
if (millis() - UzvaraTime >= 500){
UzvaraTime = millis();
raksts = !raksts;
if (raksts){
tone(BUZZER, 1000, 500);
digitalWrite(R2, 1);
digitalWrite(R4, 1);
digitalWrite(R6, 1);
digitalWrite(R1, 0);
digitalWrite(R3, 0);
digitalWrite(R5, 0);
digitalWrite(R7, 0);
}
else{
tone(BUZZER, 1500, 500);
digitalWrite(R2, 0);
digitalWrite(R4, 0);
digitalWrite(R6, 0);
digitalWrite(R1, 1);
digitalWrite(R3, 1);
digitalWrite(R5, 1);
digitalWrite(R7, 1);
}
}
}
void animacija1(){
if (animationActive = true) return;
//saglaba info
saved_nr = nr;
saved_dir = dir;
for (int i = 0; i < 9; i++) {
saved_led_states[i] = digitalRead(lights[i]);
}
lightsoff();
//rada cik punktu
digitalWrite(G1, 1);
if (punkti1 > 0){
digitalWrite(R1, 1);
}
if (punkti1 > 1){
digitalWrite(R2, 1);
}
if (punkti1 > 2){
digitalWrite(R3, 1);
}
if (punkti1 > 3){
digitalWrite(R4, 1);
}
if (punkti1 > 4){
digitalWrite(R5, 1);
uzvara1();
}
delay(100);
animationActive = true;
animationEndTime = millis() + Pause-100;
}
void animacija2(){
//saglaba info
saved_nr = nr;
saved_dir = dir;
for (int i = 0; i < 9; i++) {
saved_led_states[i] = digitalRead(lights[i]);
}
lightsoff();
//rada cik punktu
digitalWrite(G2, 1);
if (punkti2 > 0){
digitalWrite(R7, 1);
}
if (punkti2 > 1){
digitalWrite(R6, 1);
}
if (punkti2 > 2){
digitalWrite(R5, 1);
}
if (punkti2 > 3){
digitalWrite(R4, 1);
}
if (punkti2 > 4){
digitalWrite(R3, 1);
uzvara2();
}
delay(100);
animationActive = true;
animationEndTime = millis() + Pause-100;
}
void lightsoff(){
for (int i = 0; i < 9; i++) {
digitalWrite(lights[i], 0);
}
}
void setup() {
pinMode(R1, OUTPUT);
pinMode(R2, OUTPUT);
pinMode(R3, OUTPUT);
pinMode(R4, OUTPUT);
pinMode(R5, OUTPUT);
pinMode(R6, OUTPUT);
pinMode(R7, OUTPUT);
pinMode(G1, OUTPUT);
pinMode(G2, OUTPUT);
pinMode(BUTTON_1, INPUT_PULLUP);
pinMode(BUTTON_2, INPUT_PULLUP);
pinMode(BUZZER, OUTPUT);
Serial.begin(9600);
Serial.println("Programma uzsākta");
digitalWrite(R4, 1);
}
void loop() {
//uzvaras parbaude
uzvaras_raksts();
if (uzvara_ir) gamestate = 1;
//animacijas parbaude
if (animationActive) {
if (millis() >= animationEndTime) {
animationActive = false;
for (int i = 0; i < 9; i++) {
digitalWrite(lights[i], 0);
}
// atgriez gaismu iepriekseja pozicija
nr = saved_nr;
dir = saved_dir;
for (int i = 0; i < 9; i++) {
digitalWrite(lights[i], saved_led_states[i]);
}
}
}
//gaismu kustiba
if (gamestate == 3 && millis() >= Time + Pause) {
if (restarted){
restarted = false;
for (int i = 0; i < 9; i++) digitalWrite(lights[i], 0);
}
Time = millis();
digitalWrite(lights[nr], 1);
if ((nr >= 1)&&(dir == 1)) {
digitalWrite(lights[nr - 1], 0);
}
if ((nr <= 7)&&(dir == -1)) {
digitalWrite(lights[nr + 1], 0);
}
if ((nr == 0)){
digitalWrite(lights[1], 0); dir = 1;
}
if ((nr == 8)){
digitalWrite(lights[7], 0); dir=-1;
}
nr += dir;
}
if (gamestate == 2) {
settings();
}
buttonPress1();
buttonPress2();
}