exit status 1 'action2' was not declared in this scope

#include <Wire.h>
#include <LiquidCrystal.h>
#define VITESSE_PAC 150
#define VITESSE_FANT 2000
#define MAXX 15
#define MAXY 1

#define btnRight 0
#define btnUp 1
#define btnDown 2
#define btnLeft 3
#define btnSelect 4
#define btnNone 5

void(* resetFunc) (void) = 0;
byte pacman[8] = {
B00000,
B00000,
B01110,
B11011,
B11100,
B01110,
B00000,
B00000
};

// Charactère spécifique fantome
byte fantome[8] = {
B00000,
B00000,
B01110,
B10101,
B11111,
B11111,
B10101,
B00000
};

byte point[8] = {
B00000,
B00000,
B00000,
B01110,
B01110,
B00000,
B00000,
B00000
};

// Tableau des points à manger
byte points[MAXX + 1][MAXY + 1];

int xpac = 2; // Position de pacman en X (colone)
int ypac = 1; //position de pacmanen y (ligne)
int xfant = 15; // Position du fantome en X (colone)
int yfant = 0; // Position du fantome en Y (ligne)
byte light = true; //Eclairage
long keystruck = 0; //dernier appui sur un bouton
long poursuite = 0; //dernier movement du fantome
byte partieEnCours = true; // pour eviter de boucler sur la fin
byte vide = false; // pour tester si tout est manger

byte level = 0; // niveau
int score = 0; // niveau

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

int upButton = 10;
int downButton = 11;
int selectButton = 12;
int menu = 1;

void setup() {
lcd.begin(16, 2);
pinMode(upButton, INPUT_PULLUP);
pinMode(downButton, INPUT_PULLUP);
pinMode(selectButton, INPUT_PULLUP);
updateMenu();
}

void loop() {
if (!digitalRead(downButton)) {
menu++;
updateMenu();
delay(100);
while (!digitalRead(downButton));
}
if (!digitalRead(upButton)) {
menu--;
updateMenu();
delay(100);
while (!digitalRead(upButton));
}
if (!digitalRead(selectButton)) {
executeAction();
updateMenu();
delay(100);
while (!digitalRead(selectButton));
}
}

void updateMenu() {
switch (menu) {
case 0:
menu = 1;
break;
case 1:
lcd.clear();
lcd.print(">MenuItem1");
lcd.setCursor(0, 1);
lcd.print(" MenuItem2");
break;
case 2:
lcd.clear();
lcd.print(" MenuItem1");
lcd.setCursor(0, 1);
lcd.print(">MenuItem2");
break;
case 3:
lcd.clear();
lcd.print(">MenuItem3");
lcd.setCursor(0, 1);
lcd.print(" MenuItem4");
break;
case 4:
lcd.clear();
lcd.print(" MenuItem3");
lcd.setCursor(0, 1);
lcd.print(">MenuItem4");
break;
case 5:
menu = 4;
break;
}
}

void executeAction() {
switch (menu) {
case 1:
action1();
break;
case 2:
action2();
break;
case 3:
action3();
break;
case 4:
action4();
break;
}
}

void action1() {
lcd.clear();
lcd.print(
void bouge(int x, int y) // fonction pour bouger pacman
{
int oldx = xpac;
int oldy = ypac;
if (((xpac + x) >= 0) & ((xpac + x) <= MAXX)) xpac = xpac + x; //Si pas sorti d'ecran, on change x
if (((ypac + y) >= 0) & ((ypac + y) <= MAXY)) ypac = ypac + y; //Si pas sorti d'ecran, on change y
lcd.setCursor(xpac, ypac); // On se place en nouvelle position
lcd.write(byte(0)); // et on pose le caractere 0 (Pacman)
lcd.setCursor(oldx, oldy); // On se place en ancienne position
if ((xpac != oldx) || (ypac != oldy)) lcd.print(" "); // et on efface Pacman (s'il a bougé)
if (points[xpac][ypac]) {
points[xpac][ypac] = false; // mange le truc
score++;
}
vide = true;
for (int i = 0; i <= MAXX; i = i + 1)
for (int j = 0; j <= MAXY; j = j + 1)
if (points[i][j]) vide = false;
if ((vide) && (partieEnCours)) gagne();
}

void perdu() {
lcd.setCursor(0, 0); // on se place au point 0,0 (1ere ligne, 1er caractere)
lcd.print("Game Over*"); // on écrit le début du texte de début
lcd.setCursor(0, 1); // on se place au point 0,1 (2eme ligne, 1er caractere)
lcd.print("");
lcd.print(score);
lcd.print("
");
delay(2000);
resetFunc();
}

void gagne()
{
level++;
lcd.setCursor(0, 0); // on se place au point 0,0 (1ere ligne, 1er caractere)
lcd.print("*** Next level "); // on écrit le début du texte de début
lcd.setCursor(0, 1); // on se place au point 0,0 (1ere ligne, 1er caractere)
lcd.print("
");
lcd.print(level, DEC);
lcd.print(" ***"); // on écrit le début du texte de début
delay(2000); // 2 secondes de pause
initLevel(); //reinitialisation du tableau
}

void poursuis() // fonction pour bouger fantome
{
int oldx = xfant;
int oldy = yfant;
if (yfant < ypac) yfant = yfant + 1;
else if (yfant > ypac) yfant = yfant - 1;
else if (xfant < xpac) xfant = xfant + 1;
else if (xfant > xpac) xfant = xfant - 1;
lcd.setCursor(xfant, yfant); // On se place en nouvelle position
lcd.write(1); // et on pose le caractere 0 (Fantome)
lcd.setCursor(oldx, oldy); // On se place en ancienne position
if ((oldx != xfant) || (oldy != yfant)) // et on efface Fantome (s'il a bougé)
{
if (points[oldx][oldy]) lcd.write(2); // remplacé par un point si pas mangé
else lcd.print(" "); // remplacé par un espace si déja magé
}
}

//initialisation du tableau
void initLevel() {
for (int i = 0; i <= MAXX; i = i + 1)
for (int j = 0; j <= MAXY; j = j + 1) {
points[i][j] = true; //initialisation du tableau des trucs à manger
lcd.setCursor(i - 1, j - 1); // on se place au point j,i
lcd.write(2); // on écrit les points
}
lcd.setCursor(xpac, ypac); // On se place en position de départ de pacman
lcd.write(byte(0)); // et on pose le caractere 0 (Pacman)
lcd.setCursor(xfant, yfant); // On se place en position de départ du fantome
lcd.write(1); // et on pose le caractere 1 (fantome)
poursuite = millis(); // On initialise le timer de poursuite (pour eviter un mouvement immédiat)
vide = false;
}

void setup() {
Serial.begin(9600);
//Wire.begin(); // initialisation I2C (obligatoire)
//lcd.init(); // initialisation LCD (obligatoire)
lcd.begin(16, 2);
lcd.createChar(0, pacman); // creation du caractere pacman et affectation au numéro 0
lcd.createChar(1, fantome); // creation du caractere de fantome et affectation au numéro 1
lcd.createChar(2, point); // creation du caractere de point et affectation au numéro 2
//lcd.backLight(true); // on allume le retro eclairage
lcd.setCursor(0, 0); // on se place au point 0,0 (1ere ligne, 1er caractere)
lcd.print("Pacman!"); // on écrit le début du texte de début
delay (5000); // Splash screen
initLevel(); // initialisation du tableau
}

void loop() {
int thisChar = Serial.read();
switch (thisChar)
{
case 'r':
lcd.scrollDisplayRight();
break;
case 'l':
lcd.scrollDisplayLeft();
break;
}
if ((thisChar > 'a') & (thisChar < 'z'))
{
lcd.setCursor(1, 1);
lcd.write(thisChar);
}
if (millis() - keystruck > VITESSE_PAC) // Si plus de 200ms depuis le dernier mouvement de joystick
{
int joy = getKey();
switch (joy)
{
case btnNone:
break;
case btnLeft:
Serial.print("Pacman bouge à gauche.\n"); // envoi de controle sur liaison série
Serial.print(keystruck);
bouge(-1, 0); // déplacement
keystruck = millis(); // remise à zero du timer de mouvement
break;
case btnRight:
Serial.print("Pacman bouge à droite\n");// envoi de controle sur liaison série
bouge(1, 0); // déplacement
keystruck = millis(); // remise à zero du timer de mouvement
break;
case btnUp:
Serial.print("Pacman bouge en haut\n");// envoi de controle sur liaison série
bouge(0, -1); // déplacement
keystruck = millis(); // remise à zero du timer de mouvement
break;
case btnDown:
Serial.print("Pacman bouge en bas\n");
bouge(0, 1); // déplacement
keystruck = millis(); // remise à zero du timer de mouvement
break;
/case 4:
Serial.print("centre\n");
light=!light; //On inverse le statut d'allumage
lcd.backLight(light); // on applique
keystruck=millis(); // remise à zero du timer de mouvement
break;
/
default:
Serial.print(joy); //au cas ou...
keystruck = millis(); // remise à zero du timer de mouvement
};
};
if (millis() - poursuite > VITESSE_FANT / (level + 1) + 10)
{
poursuis();
poursuite = millis();
}
if ((xpac == xfant) && (ypac == yfant) && (partieEnCours))
{
perdu();
}
}

int getKey() {
int b = analogRead(A0);
if (b > 1000) return btnNone;
delay(8);
if (b < 50) return btnRight;
if (b < 180) return btnUp;
if (b < 330) return btnDown;
if (b < 520) return btnLeft;
if (b < 700) return btnSelect;
}
void action2() {
lcd.clear();
lcd.print("Eting #2");
delay(1500);
}
void action3() {
lcd.clear();
lcd.print("Executing #3");
delay(1500);
}
void action4() {
lcd.clear();
lcd.print("Executing #4");
delay(1500);
}

hi everyone i am trying to build a game console with a menu system but i keep getting this error:
exit status 1 'action2' was not declared in this scope
pls help

Welcome to the forum

Please follow the advice given in the link below when posting code, in particular the section entitled 'Posting code and common code problems'

Use code tags (the </> icon above the compose window) to make it easier to read and copy for examination

Your loop() function does not have a closing brace

You have declared the bouge() function inside the action1() function

void action1()
{
  lcd.clear();
  lcd.print(
    void bouge(int x, int y) // fonction pour bouger pacman
  {
    int oldx = xpac;

There may be more problems but I stopped looking

how can I fix that??

Il y a un forum in french aussi...

To fix that, first open your sketch in the Arduino IDE and hit CTRL T to set autoindentation on.
This way, you can better see the blocks in curly brackets { ... }.
Any time you open one, you must close it. This is essential for functions, such as bouge(), action1(), setup() and loop().

     if ((xpac == xfant) && (ypac == yfant) && (partieEnCours))
      {
         perdu();
      }
   }
}  // **************  add } here
   int getKey()
   {
      int b = analogRead(A0);
void action1() {
lcd.clear();
lcd.print(  // ************* incomplete print statement
}  // **************** add closing curly bracket
void bouge(int x, int y) // fonction pour bouger pacman
{
    int oldx = xpac;
case 1:
         action1();
         break;
      case 2:
         action2();  // ************ action2 not declared
         break;
      case 3:
  if (b < 700) return btnSelect;
}
void action2()  // ************** need to add missing ;
{
   lcd.clear();

Read the forum guidelines to see how to properly post code and some good information on making a good post.

Use the IDE autoformat tool (ctrl-t or Tools, Auto format) before posting code in code tags. If you use the autoformat tool, most of the mistakes in your code would have show up as discrepancies in the indentation.

You can go back and fix your original post

A huge problem is that your code has 2 setup() and 2 loop() functions. An Arduino sketch can have only one of each.

Is there no way to have two ?

No, and why would you need 2 ?

You can’t have 2 things with the same name in the same scope. Otherwise the compiler doesn’t know what it is doing. If you call someone’s name in a room of people and two people have the same name then they don’t know who you mean.

It looks like you are mashing two codes together without understanding either of them. I suggest going back to basics and starting again with the examples in the ide until you know more

Please fix ASAP your first post as requested, by using the code tag and replace your code with an indented one. Such unformatted caotical code hurts the brain.:wink:

image

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.