dsryr-william
Published © GPL3+

LCD Bow and arrow game

A cool game where you are an arrow.

BeginnerFull instructions provided250
LCD Bow and arrow game

Things used in this project

Hardware components

Arduino UNO
Arduino UNO
×1
Standard LCD - 16x2 White on Blue
Adafruit Standard LCD - 16x2 White on Blue
×1
Breadboard (generic)
Breadboard (generic)
×1
Rotary potentiometer (generic)
Rotary potentiometer (generic)
10K POTENTIOMETER
×1
Pushbutton switch 12mm
SparkFun Pushbutton switch 12mm
×2
Jumper wires (generic)
Jumper wires (generic)
×21
Resistor 1k ohm
Resistor 1k ohm
×2

Story

Read more

Schematics

LCD ARROW AND BOW GAME CIRCUIT DIAGRAM

LCD ARROW AND BOW GAME CIRCUIT DIAGRAM

Code

LCD BOW AND ARROW GAME

C/C++
#include <LiquidCrystal.h>

const int buttonPin1 = 6;
const int buttonPin2 = 1;
int button1state = 0;
int button2state = 0;
int arrowRow = 0;
int newRow = 0;
int sameRowCounter = 0;

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
byte weakblock[] = {
  B01100,
  B01100,
  B01100,
  B01100,
  B01100,
  B01100,
  B01100,
  B01100
};
byte strongblock[] = {
  B00000,
  B00000,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B00000
};
byte bow[] = {
  B00000,
  B00110,
  B01110,
  B10010,
  B11111,
  B10010,
  B01110,
  B00110
};
byte bow2[] = {
  B00100,
  B00110,
  B00110,
  B00101,
  B00101,
  B00110,
  B00110,
  B00100
};
byte arrow[] = {
  B00000,
  B00000,
  B00100,
  B00010,
  B11111,
  B00010,
  B00100,
  B00000
};
byte superarrow[] = {
  B00000,
  B01000,
  B00100,
  B00110,
  B11111,
  B00110,
  B00100,
  B01000
};

struct OneBlock
{
  int row;
  int col;
  int type;
};

OneBlock blocks[15];
int counter;
int score;
int scoreCol;
unsigned long prevScoreMillis = 0;
unsigned long prevBlockMillis = 0;
unsigned long prevArrowMillis = 0;
unsigned long prevSuperMillis = 0;
bool gameOver = false;
bool superArrow = false;

void setup()
{
  pinMode(buttonPin1, INPUT);
  pinMode(buttonPin2, INPUT);
  lcd.begin(16, 2);
  lcd.createChar(0, weakblock);
  lcd.createChar(1, strongblock);
  lcd.createChar(2, bow);
  lcd.createChar(3, bow2);
  lcd.createChar(4, arrow);
  lcd.createChar(5, superarrow);
  randomSeed(analogRead(0));
  arrowRow = 0;
  superArrow = false;
  score = 0;
  counter = 0;
  blocks[0].row = random(0, 2);
  blocks[0].col = 15;
  for (int i = 0; i < 15; ++i)
    blocks[i].row = -1;
}

void EndGame()
{
  lcd.clear();
  lcd.setCursor(3, 0);
  lcd.print("Game Over");
  lcd.setCursor(3, 1);
  lcd.print("Score:");
  lcd.setCursor(9, 1);
  lcd.print(score);
  gameOver = true;
}

void IncrementScore()
{
  score++;
  if (score > 9999)
    scoreCol = 11;
  else if (score > 999)
    scoreCol = 12;
  else if (score > 99)
    scoreCol = 13;
  else if (score > 9)
    scoreCol = 14;
  else
    scoreCol = 15;
}

void loop()
{
  if (gameOver)
  {
    button1state = digitalRead(buttonPin1);
    button2state = digitalRead(buttonPin2);
    if (button1state == HIGH || button2state == HIGH)
    {
      gameOver = false;
      delay(1000);
      setup();
    }
    else
      return;
  }

  unsigned long currentMillis = millis();
  button1state = digitalRead(buttonPin1);
  button2state = digitalRead(buttonPin2);

  if (currentMillis - prevArrowMillis >= 450)
  {
    if (button1state == HIGH && !superArrow)
    {
      lcd.setCursor(1, arrowRow);
      lcd.print(" ");
      if (arrowRow == 0)
      {
        arrowRow = 1;
        prevArrowMillis = currentMillis;
      }
      else if (arrowRow == 1)
      {
        arrowRow = 0;
        prevArrowMillis = currentMillis;
      }
    }
  }

  if (currentMillis - prevSuperMillis >= 450)
  {
    if (button2state == HIGH)
    {
      superArrow = !superArrow;
      prevSuperMillis = currentMillis;
    }
  }

  if (currentMillis - prevScoreMillis >= 1000)
  {
    prevScoreMillis = currentMillis;
    IncrementScore();
  }

  bool redraw = false;
  if (score > 9999 && currentMillis - prevBlockMillis >= 1)
  {
    prevBlockMillis = currentMillis;
    redraw = true;
  }
  else if (score > 500 && currentMillis - prevBlockMillis >= 200)
  {
    prevBlockMillis = currentMillis;
    redraw = true;
  }
  else if (score > 99 && currentMillis - prevBlockMillis >= 350)
  {
    prevBlockMillis = currentMillis;
    redraw = true;
  }
  else if (score > 9 && currentMillis - prevBlockMillis >= 450)
  {
    prevBlockMillis = currentMillis;
    redraw = true;
  }
  else if (currentMillis - prevBlockMillis >= 500)
  {
    prevBlockMillis = currentMillis;
    redraw = true;
  }

  if (score > 0)
  {
    lcd.setCursor(scoreCol, 0);
    lcd.print(score);
  }

  if (score >= 5)
  {
    lcd.setCursor(1, arrowRow);
    if (superArrow)
      lcd.write(byte(5));
    else
      lcd.write(byte(4));
  }

  if (score < 5)
  {
    lcd.setCursor(0, 0);
    lcd.write(byte(2));
  }

  if (score == 10)
  {
    lcd.setCursor(0, 0);
    lcd.print(" ");
  }

  if (score < 10 && score >= 5)
  {
    lcd.setCursor(0, 0);
    lcd.write(byte(3));
  }

  if (!redraw)
    return;

  lcd.clear();

  for (int i = 0; i < 15; ++i)
  {
    if (blocks[i].row != -1)
    {
      lcd.setCursor(blocks[i].col, blocks[i].row);
      lcd.write(byte(blocks[i].type));
      blocks[i].col--;
      if (blocks[i].col < 0)
      {
        if (arrowRow == blocks[i].row)
        {
          if (!superArrow || superArrow && blocks[i].type == 1)
          {
            EndGame();
            return;
          }
        }
        blocks[i].row = -1;
      }

      if (superArrow && arrowRow == blocks[i].row && blocks[i].col == 1 && blocks[i].type == 0)
      {
        IncrementScore();
        blocks[i].row = -1;
      }
    }
  }
  if (sameRowCounter > 0)
  {
    counter++;
    if (counter == 15)
      counter = 0;
    blocks[counter].row = newRow;
    blocks[counter].col = 15;
    blocks[counter].type = random(0, 2);
    sameRowCounter--;
  }
  else
  {
    sameRowCounter = random(1, 5);
    if (newRow == 1)
      newRow = 0;
    else
      newRow = 1;
  }
}

Credits

dsryr-william

dsryr-william

0 projects • 0 followers

Comments

Add projectSign up / Login