I am new in arduino trying to make race game. My problem is that my button (all buttons) is working sometimes and sometimes not. I am pretty sure that it's because of my code. Could you please help me with it? Here is my code:
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int pausebetween = 1;
int spaceBetween = 1;
int maxElemnets = 4;
int obstacleArray[4][2];
int obstacles[4] = {3,3,2,3};
bool gameStart = false;
byte player[8] =
{
B00000,
B00000,
B10100,
B11110,
B11111,
B11110,
B10100,
B00000
};
byte obstacle[8] =
{
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111
};
byte enemy[8] =
{
B00000,
B00000,
B00101,
B01111,
B00101,
B00000,
B00000
};
byte empty[8] =
{
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
B00000
};
byte fire[8] =
{
B00000,
B00000,
B00000,
B11111,
B00000,
B00000,
B00000
};
int mat[2][24] = {
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
};
int up = 0;
int down = 0;
int reset=0;
int atack=0;
void setup() {
pinMode(9, INPUT);
pinMode(8, INPUT);
pinMode(7, INPUT);
pinMode(6, INPUT);
Serial.begin(9600);
lcd.createChar(0, player);
lcd.createChar(1, empty);
lcd.createChar(2, enemy);
lcd.createChar(3, obstacle);
lcd.createChar(4, fire);
lcd.begin(16, 2);
}
void loop() {
up = digitalRead(9);
down = digitalRead(8);
atack = digitalRead(7);
reset = digitalRead(6);
if(atack){
for(int i = 0; i<2;i++){
for(int j = 0; j<23; j++){
if(mat[j][i]==1){
mat[j+1][i]=4;
Serial.println(mat[j+1][i]);
}
}
}
}
if(reset){
clearStage();
gameStart = true;
}
if(gameStart){
generateObstacles();
redrawGame();
moveObstacles();
}
delay(1000);
}
void generateObstacles(){
int obscount = random(1,4);
int types[4][2] = {{1,3},{2,1},{1,1},{2,1}} ;
int type = random(0,4);
for(int i = 0; i< obscount; i++){
mat[0][16+i] = types[type][0];
mat[1][16+i] = types[type][1];
}
int spacecount = random(2,5);
pausebetween = obscount + spacecount;
}
void redrawGame(){
for(int j = 15; j >= 0; j--){
for(int i = 0; i < 2; i++){
lcd.setCursor(j,i);
lcd.write(mat[i][j]);
}
}
}
void clearStage(){
for(int i = 0; i<2;i++){
for(int j = 0; j<23; j++){
if(i!=1 && j!=1){
mat[i][j] =1;
}
}
}
}
void moveObstacles(){
for(int i = 0; i<2;i++){
for(int j = 0; j<23; j++){
if(mat[i][j]!=0){
mat[i][j] = mat[i][j+1];
}else{
mat[i][j-1]=1;
}
if(mat[i][j]==4){
mat[i][j-1]=0;
mat[i][j-2]=1;
}
}
}
}
Scheme: enter image description here
1 Answer 1
I have two suggestions.
Get rid of the delay(1000); in the loop and replace it with code from the BlinkWithoutDelay example that comes with the Arduino IDE: https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay.
Debounce the buttons. There are several libraries on Github that simplify this, for example: https://playground.arduino.cc/Code/Bounce.
Explore related questions
See similar questions with these tags.