Я пытаюсь сделать что то вроде видеоигры с Arduino UNO

это школьный проект, но у меня есть некоторые проблемы с выбором меню. В ЖК-дисплее все символы перезаписываются, я начинающий, поэтому я не имею ни малейшего представления о том, что я делал неправильно (ps.: извините за мой английский, я бразилец. Вот код: //Портативный игровой проект "atari", включающий в себя 3 игры

#include <LiquidCrystal.h>
//define os pinos a ser utilizados no arduino uno,etc.
#define btcima 9
#define btbaixo 8
#define bttiro 10
#define menu 11

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

int vel=100;
 int pxnave,pynave,pxaste,pyaste,pxtiro,pytiro;//px=posição x, py=posição y, etc
bool game1,game2,game3,vtiro;//vtiro=variavel de tiro
int pontos;
int maxpontos=15;
int vtela;
byte nave[8]={B00000,B01100,B00110,B11111,B00110,B01100,B00000,B00000};
byte asteroide[8]={B01110,B10111,B11111,B11101,B10111,B01110,B00000,B00000};
byte explosao[8]={B10101,B00010,B11000,B10101,B01010,B10110,B01101,B10011};
byte tiro3[8]={B00000,B00000,B11110,B11111,B11111,B11110,B00000,B00000};

int      line[4] = {0,1,2,3},
         line_bk[4],
         index,
         menu_number = 0;

boolean  menu_flag  = 0,
         enter_flag = 0,
         sub_menu = 0;

void readButts();
void list_menu();
void menu_select();



void setup()
{
  //--configuração do menu--
 pinMode(menu,  INPUT_PULLUP);
  pinMode(bttiro, INPUT_PULLUP);



 lcd.begin (16,4);
 //lcd.setBacklight(HIGH);--apenas para lcd i2c
 lcd.clear();
 lcd.setCursor(0,0);
 lcd.print(">");

pxnave=pynave=pyaste=pontos=pytiro=0;
pxtiro=-1;
pxaste=12;
vtela=0;
lcd.createChar(1,nave);
lcd.createChar(2,asteroide);
lcd.createChar(4,explosao);
lcd.createChar(6,tiro3);
//lcd.begin(16,2);
//lcd.clear();
game1=-false;
game2=false;
game3=false;
vtiro=false;
}


void loop(){

  if(!sub_menu)
  {
   lcd.clear();
    lcd.setCursor(1,line[0]);
    lcd.print("1) NAVE: THE GaMe       ");
    lcd.setCursor(1,line[1]);
    lcd.print("2) PING PONG       ");
    lcd.setCursor(1,line[2]);
    lcd.print("3) lula & dilma      ");
    lcd.setCursor(1,line[3]); 
    lcd.print("4) Creditos     "); 

  }


  readButts();

  if(game1){
    lcd.clear();
    vtela=0;

  if (digitalRead(btcima)==1){
    pynave=0;

  }
  if(digitalRead(btbaixo)==1){
    pynave=1;
  }
  if(digitalRead(bttiro)==1){
    pxtiro=1;
    vtiro=true;
pytiro=pynave;    
  }
  pxaste-=1;
  desenhaNave(pxnave, pynave);
  desenhaAsteroide(pxaste, pyaste);
  if(vtiro){
    desenhaTiro3(pxtiro, pytiro);
    pxtiro+=1;
  }

  if(pxaste<0){
  pxaste=12;
  pyaste=random(0,2);
  }
  if(pxtiro>16){
    vtiro=false;
    pxtiro-=1;
  }
  if (((pxtiro==pxaste+1)&&(pytiro==pyaste))||((pxtiro==pxaste)&&(pytiro==pyaste))){
  vtiro=false;
  pxtiro=-1;
  desenhaExplosaoAsteroide(pxaste, pyaste);
  pyaste=random(0,2);
  pxaste=12;
  pontos+=5;
  if((pontos>=maxpontos)){
    game1=0;
    vtela=7;//rever
  }
}
if((pxnave==pxaste)&&(pynave==pyaste)){
game1=0;
desenhaExplosaoNave(pxnave, pynave);
vtela=6;
}

  delay(vel);

  }else{
    tela(vtela);
    if(digitalRead(bttiro)==1){
      reset1();
    }
  }
}

  void readButts()
{

   if(!digitalRead(menu))  menu_flag  = 0x01;
   if(!digitalRead(bttiro)) enter_flag = 0x01;

   if(digitalRead(menu) && menu_flag)
   {
       menu_flag = 0x00;
       list_menu();
       menu_number+=1;
       if(menu_number > 5) menu_number = 1;

   } 

   if(digitalRead(bttiro) && enter_flag)
   {
      enter_flag = 0x00; 
      sub_menu = !sub_menu;
      menu_select();

   } 


} 


void list_menu()
{
  for(int i=4; i>-1; i--) 
  {
     index = i-1;
     line_bk[i] = line[i];

     if(index < 1) line[i] = line_bk[i+4];

     else line[i] = line[i-1];

  }

} 


void menu_select()
{

    switch(menu_number)
    {
       case 1: 
        vtela==0;
        game1= true;
        game2=false;
        game3=false;

               break;
       case 2: 
            vtela==4;
              game1= false;
        game2=true;
        game3=false; 
               break;
       case 3: 
           vtela==5;
           game1= false;
        game2=false;
        game3=true; 
               break;
       case 4: 
               vtela==8;
               game1= false;
        game2=false;
        game3=false;
               break;
       //case 5: ---pensar--- 


    } //end switch


}
  void desenhaNave(int px, int py){
  lcd.setCursor(px,py);
  lcd.write(1);
}
void desenhaAsteroide(int px, int py){
  lcd.setCursor(px,py);
  lcd.write(2);
}

void desenhaTiro3(int px, int py){
  lcd.setCursor(px,py);
  lcd.write(6);
}
void desenhaExplosaoNave(int px, int py){
 lcd.clear();
  lcd.setCursor(px,py);
  lcd.write(4);
  delay(1000);
  lcd.clear();
}
void desenhaExplosaoAsteroide(int px, int py){
  lcd.setCursor(px,py);
  lcd.write(4);
  delay(1000);
  lcd.clear();
}
void reset1(){
  pontos=0;
  game1=true;
  vtela=0;
}
void reset2(){
  pontos=0;
  game2=true;
  vtela=0;
}
void reset3(){
  pontos=0;
  game3=true;
  vtela=0;
}


void tela(int cond){//0=jogo da nave 1=ganhou 2= perdeu 3= menu de seleção 4=jogo pingpong 5=jogo plataforma

if(cond<1){
   lcd.setCursor(3,0);
     lcd.print("Nave: THE GAmE");
     lcd.setCursor(0,1);
lcd.print("PRESSIONE START");
}
if(cond==6){
  lcd.setCursor(9,0);
  lcd.print("pts:");
  lcd.setCursor(13,0);
  lcd.print (pontos);
  lcd.setCursor(1,0);
  lcd.print("Perdeu");
lcd.setCursor(0,1);
lcd.print("PRESSIONE START");
}
if(cond==7){
  lcd.setCursor(9,0);
  lcd.print("pts:");
  lcd.setCursor(13,0);
  lcd.print (pontos);
  lcd.setCursor(1,0);
  lcd.print("Ganhou");
lcd.setCursor(0,1);
lcd.print("PRESSIONE START");
}
if (cond==3){
  sub_menu=true;
  lcd.clear();
}

if(cond==4)
{
  lcd.setCursor(3,0);
  lcd.print ("Ping Pong");
  lcd.setCursor(0,1);
  lcd.print ("PRESSIONE START");

}
if (cond==5)
{
  lcd.setCursor(3,0);
  lcd.print("Lula e Dilma");
  lcd.setCursor (0,1);
  lcd.print ("PRESSIONE START");
}
if (cond==8)
{
  lcd.setCursor(3,0);
  lcd.print("Equipe LULA Livre");
  lcd.setCursor(0,1);
  lcd.print("Obrigado por Jogar");
}
}`enter code here`

, 👍2

Обсуждение

Просто для вдохновения, вы можете взглянуть на [Arduboy](https://arduboy.com/) и библиотеки с открытым исходным кодом, на которых построены его игры., @Edgar Bonet

https://wokwi.com/arduino/projects/297467237377245705 можете ли вы проверить эту ссылку, @ArduinoFan


1 ответ


1

Вероятно, поскольку вы установили курсор в положение посередине строки, только новый текст перезаписывается поверх старого текста. Но если есть какие-то символы из предыдущего текста, они останутся.

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

Некоторые другие советы:

  • Пишите комментарии и имена переменных на английском языке (я знаю, что это не ваш родной язык, но вы можете выучить сразу два языка-C и английский).
  • Выровняйте свой код (убедитесь, что каждый { и } выровнен правильно; это значительно облегчит жизнь и предотвратит ошибки.
  • game1, game2 и game3 являются логическими, где только один может быть истинным. Для этого придумывается перечисление (перечисление). Поэтому создайте игру enum enum { game1, game2, game3 }; в качестве типа и объявите переменную Game currentGame = game1;
  • Вы используете оператор switch для menu_number, но почему бы не для cond?
  • Вы используете много текста, весь текст также занимает драгоценную память памяти SRAM, в которой у вас всего 2048 байт. Если для каждой строки вы добавляете F спереди (например, F("МЕНЮ"); это будет сохранено только во флэш-памяти.
,