Car Game for Arduino

Introduction: Car Game for Arduino

About: My name is Simao and I love eletronics ,glass art,metal working,casting,paint ,draw...

Here we ave one more game for arduino .

this game is inspired on a vintage electronic game ,on this game you need to drive one car on a autoroute full of trucks you can't crash in anyone ,if you do it the games over and show you how many time you drive for a new game you reset the arduino.

Supplies:

  1. Arduino
  2. breadboard
  3. Jumpers
  4. 220R resistor
  5. 10k variable resistor
  6. 16x2 LCD screen
  7. piezo buzzer
  8. USB cable to program arduino

Step 1: Shcematic:

Wire the components together.

Step 2: The Code:

Program the Arduino with this code:

/* Simple Car game for a 16x2 LCD display
You can use any Hitachi HD44780 compatible LCD.

Wiring explained at http://www.arduino.cc/en/Tutorial/LiquidCrystal

(I used theLCD Electronic Brick on bus 1:

rs on pin 2, rw on pin 3, enable on pin 4,

data on pins 5,6,7,8)

There's also a "steering wheel" potentiometer on analog input 1,

and a Piezo speaker on pin 9 (PWM).

Enjoy,

*/

#include <LiquidCrystal>

// LiquidCrystal display

// You can use any Hitachi HD44780 compatible. Wiring explained at

// http://www.arduino.cc/en/Tutorial/LiquidCrystal

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

// Steering wheel potentiometer

const int POTPIN = 1;

const int MAXPOT = 800; // no need to turn the wheel all the way to 1023 :)

// Piezo speaker

const int SPEAKERPIN = 9;

const int RANDSEEDPIN = 0; // an analog pin that isn't connected to anything

const int MAXSTEPDURATION = 300; // Start slowly, each step is 1 millisec shorter.

const int MINSTEPDURATION = 150; // This is as fast as it gets

const int NGLYPHS = 6;

// the glyphs will be defined starting from 1 (not 0),

// to enable lcd.print() of null-terminated strings

byte glyphs[NGLYPHS][8] = {

// 1: car up

{ B00000,

B01110,

B11111,

B01010,

B00000,

B00000,

B00000,

B00000}

// 2: car down

,{B00000,

B00000,

B00000,

B00000,

B01110,

B11111,

B01010,

B00000}

// 3: truck up

,{B00000,

B11110,

B11111,

B01010,

B00000,

B00000,

B00000,

B00000}

// 4: truck down

,{B00000,

B00000,

B00000,

B00000,

B11110,

B11111,

B01010,

B00000}

// 5: crash up

,{B10101,

B01110,

B01110,

B10101,

B00000,

B00000,

B00000,

B00000}

// 6: crash down

,{B00000,

B00000,

B00000,

B10101,

B01110,

B01110,

B10101,

B00000}

};

const int NCARPOSITIONS = 4;

// Each position is mapped to a column of 2 glyphs

// Used to make sense when I had a 5th position

// where car or crash was drawn as 2 glyphs

// (can't do that since 0 terminates strings),

// so it's kinda silly now, but it ain't broke :)

const char BLANK=32;

char car2glyphs[NCARPOSITIONS][2] = {

{1,BLANK},{2,BLANK},{BLANK,1},{BLANK,2}

};

char truck2glyphs[NCARPOSITIONS][2] = {

{3,BLANK},{4,BLANK},{BLANK,3},{BLANK,4}

};

char crash2glyphs[NCARPOSITIONS][2] = {

{5,BLANK},{6,BLANK},{BLANK,5},{BLANK,6}

};

const int ROADLEN = 15; // LCD width (not counting our car)

int road[ROADLEN]; // positions of other cars

char road_buff[2+ROADLEN]; // aux string for drawRoad()

int road_index;

int car_pos;

// Off-the-grid position means empty column, so MAXROADPOS

// determines the probability of a car in a column

// e.g. 3*NCARPOSITIONS gives p=1/3

const int MAXROADPOS = 3*NCARPOSITIONS;

int step_duration;

int crash; // true if crashed

unsigned int crashtime; // millis() when crashed

const int CRASHSOUNDDURATION = 250;

const char *INTRO1="Trucks ahead,";

const char *INTRO2="Drive carefully";

const int INTRODELAY = 2000;

void setup()

{

crash = crashtime = road_index = 0;

step_duration = MAXSTEPDURATION;

road_buff[1+ROADLEN] = '\0'; // null terminate it

randomSeed(analogRead(RANDSEEDPIN));

for (int i=0; i

lcd.createChar(i+1,glyphs[i]);

}

for (int i=0; i

road[i]=-1;

}

pinMode(SPEAKERPIN,OUTPUT);

analogWrite(SPEAKERPIN,0); // to be on the safe side

lcd.begin(16,2);

getSteeringWheel();

drawRoad();

lcd.setCursor(1,0);

lcd.print(INTRO1);

lcd.setCursor(1,1);

lcd.print(INTRO2);

delay(INTRODELAY);

}

void loop() {

unsigned long now = millis()-INTRODELAY;

if (!crash) {

getSteeringWheel();

crash = (car_pos==road[road_index]);

}

if (crash) {

if (!crashtime) {

crashtime=now;

drawRoad();

// Game over text

// (keep first 2 "crash" columns intact)

lcd.setCursor(2,0);

lcd.print("Crashed after");

lcd.setCursor(2,1);

lcd.print(now/1000);

lcd.print(" seconds.");

}

if ((now-crashtime)

analogWrite(SPEAKERPIN,random(255)); // white noise

}

else {

analogWrite(SPEAKERPIN,0); // dramatic post-crush silence :)

}

delay(10); // Wait a bit between writes

}

else {

int prev_pos = road[(road_index-1)%ROADLEN];

int this_pos = random(MAXROADPOS);

while (abs(this_pos-prev_pos)<2) { // don't jam the road

this_pos = random(MAXROADPOS);

}

road[road_index] = this_pos;

road_index = (road_index+1)%ROADLEN;

drawRoad();

delay(step_duration);

if (step_duration>MINSTEPDURATION) {

step_duration--; // go faster

}

}

}

void getSteeringWheel() {

car_pos = map(analogRead(POTPIN),0,1024,0,NCARPOSITIONS);

}

void drawRoad() {

for (int i=0; i<2; i++) {

if (crash) {

road_buff[0]=crash2glyphs[car_pos][i];

}

else {

road_buff[0]=car2glyphs[car_pos][i];

}

for (int j=0; j

int pos = road[(j+road_index)%ROADLEN];

road_buff[j+1] = pos>=0 && pos

}

lcd.setCursor(0,i);

lcd.print(road_buff);

}

}

Step 3: Download:

Games Contest

Participated in the
Games Contest

Be the First to Share

    Recommendations

    • Holiday Decorations Speed Challenge

      Holiday Decorations Speed Challenge
    • Plywood Challenge

      Plywood Challenge
    • Battery Powered Contest

      Battery Powered Contest

    4 Discussions

    0
    chickenwang
    chickenwang

    9 months ago

    im from afgoonistan i am looking for the answer to arduino car driver

    0
    simaopintocorreia
    simaopintocorreia

    Reply 9 months ago

    Sory but I do not understain the answer.
    Can you explain more?

    0
    Perrin Lozano
    Perrin Lozano

    Question 9 months ago on Step 3

    the code doesnt workk ontinkercade

    0
    simaopintocorreia
    simaopintocorreia

    Reply 9 months ago

    Yes I know. I think that code just work in the real life. If you can try to run this on a real arduino. Anyaway I go to make sure that is every thing Ok. Thanks to say to me.