Как запрограммировать кнопку джойстика, чтобы сбросить все?

В этом проекте я делаю игру stickman rush с джойстиком. Где, когда джойстик перемещается вверх и вниз, крупье также перемещается вверх и вниз. И есть препятствия, которые, когда крупье касается одного из них, он печатает "Игра окончена".

Теперь я пытаюсь сделать так, чтобы кнопка в джойстике (SM) была запрограммирована так, чтобы при каждом ее нажатии все сбрасывалось. Другими словами, все возвращается к первоначальному экрану, где впервые появились крупье и препятствие.

Код:

#include <LiquidCrystal.h>


LiquidCrystal lcd(2, 3, 4, 5, 6, 7);

byte customChar[] = {
  B01110,
  B01110,
  B01110,
  B00100,
  B01110,
  B10101,
  B00100,
  B01010
};

byte gameObstical[] = {
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111
};



int vX = A0;
int vY = A1;
int sw = 8;

int xPosition = 0;
int yPosition = 0;
int SW_state = 0;
int mapX = 0;
int mapY = 0;

int screenWidth = 16;
int screenHeight = 2;


void setup() {
  Serial.begin(9600);

  pinMode(vX, INPUT);
  pinMode(vY, INPUT);
  pinMode(sw, INPUT_PULLUP);


  lcd.begin(16, 2);
  lcd.createChar(0, customChar);
  lcd.home();
  lcd.write(byte(0));

  lcd.createChar(1, gameObstical);


}

void loop() {


  int stickManPosition = 0;
  int obsticalPosition = 0;
  int stickManRow = 0;
  int obsticalRow = 0;

  int obsticalPosition2 = 0;
  int obsticalRow2 = 0;

  for (obsticalPosition = 15; obsticalPosition >= 0; obsticalPosition--) {
    lcd.setCursor(obsticalPosition, obsticalRow);
    lcd.write(byte(1));
    lcd.print(" ");
    delay(150);





    xPosition = analogRead(vX);
    yPosition = analogRead(vY);
    SW_state = digitalRead(sw);
    mapX = map(xPosition, 20, 1003, -500, 500);

    Serial.println("-----------");
    Serial.println(mapX);
    Serial.println(SW_state);
    Serial.println("-----------");



    if (mapX > 200) {

      lcd.clear();
      lcd.setCursor(stickManPosition, stickManRow);
      lcd.write(byte(0));

    } else if (mapX < -200) {

      stickManRow = 1;

      lcd.clear();
      lcd.setCursor(stickManPosition, stickManRow);
      lcd.write(byte(0));
    }




    if (stickManPosition == obsticalPosition) {
      if (stickManRow == obsticalRow) {

        lcd.clear();
        lcd.print("Game Over...");
        delay(10000);

      }

      if (obsticalPosition == 12) {

        for (obsticalPosition2 = 11; obsticalPosition2 >= 0; obsticalPosition2--) {
          obsticalRow2 = 1;

          lcd.setCursor(obsticalPosition2, obsticalRow2);
          lcd.write(byte(1));
          lcd.print(" ");
          delay(150);
        }
      }
    }
  }
}

Есть идеи? Спасибо за чтение

, 👍1

Обсуждение

разбейте блок "loop() на разделы ... какой раздел выполняется, зависит от переменной состояния, например, "Режим выполнения"... когда arduino сброшен, начните с " runMode = 0 ... если режим запуска == 0, отобразите приветственное сообщение и переключитесь на режим запуска = 1 .... если режим запуска == 1, проверьте нажатие кнопки "Пуск", если нажата, переключитесь на режим запуска = 2 ... если режим выполнения == 2, то запустите игру ..... если смерть, то переключитесь на режим выполнения = 3 ........ и так далее и тому подобное, @jsotola

А для большей удобства обслуживания разделите каждую фазу (инициализация, запуск, в игре, окончание игры,...) на отдельные функции., @the busybee

То, что описывает @jsotola, называется *машиной с конечным состоянием*. Вам следует узнать о них больше, прежде чем продолжать свой проект., @Majenko