Kamikaze Race. Bin Mohd Kamaludin. 200876993.

Dependencies:   el14hzbm_Final_Project mbed

Fork of el14hzbm_FinalProject by ELEC2645 (2015/16)

Revision:
1:58b4f9dda460
Parent:
0:211360300ec1
Child:
3:c2227b3e2f0c
--- a/main.cpp	Tue May 03 10:37:41 2016 +0000
+++ b/main.cpp	Thu May 05 11:34:33 2016 +0000
@@ -1,192 +1,128 @@
+/**
+@file main.cpp
+@brief Program implementation
+*/
+
 #include "mbed.h"
 #include "N5110.h"
 #include "tone.h"
+#include "main.h"
 
 #define PI 3.14159265359
 #define PAUSE 1
 #define PLAY 0
 
-//connection for Nokia LCD
-N5110 lcd(PTE26,PTA0,PTC4,PTD0,PTD2,PTD1,PTC3);
-
-// connections for joystick
-InterruptIn button(PTB11);
-AnalogIn yPot(PTB2);
-AnalogIn xPot(PTB3);
-// Serial for debug
-Serial serial(USBTX,USBRX);
-
-// struct for state
-struct State {
-    int output;  // output value for current state
-    float time;  // wait time for state
-    int next_state[4]; // next state (depending on direction 0 - UP, 1 - DOWN)
-};
-typedef const struct State STyp;
-
-// array of states in the FSM, each element is the output of the counter, wait time, next state(s)
-STyp fsm[4] = {
-    {1,0.2,{1,0}},
-    {2,0.2,{2,1}},
-    {4,0.2,{3,2}},
-    {8,0.2,{0,3}}
-};
-
-void intro();
-void firstView();
-void firstViewPointer();
-void gameView();
-void initialGameInterface();
-void crash(int carValue[],int opponent_y,int g_score,int g_level,int k,int l,int delay);
-void game_interface(int g_score,int g_level,int g_liveleft);
-void live(int liveleft);
-void roadline(int moving);
-void playermovement(int g_level);
-void checkLastCar(int g_level);
-void finishLevel(int g_level);
-void optionView();
-void optionPointer();
-void finishView(int g_level);
-void brightnessController();
-void brightnessView();
-void instructionView();
-void button_isr();
-void gameplaysound(float duration);
-void crashsound();
-void pausesound();
-void score(int m,int my);
-void level(int x1,int y1);
-
-// all the stuff for tone creation
-DigitalOut buzzer(PTA2);
-DigitalOut green_led(PTC2);
-Timer noteTimer;
-void initArray();  // function to initialise sample array
-void tone(float frequency,float duration);  // play a tone of set frequency for given duration
-int n = 32;  // number of samples
-float y[32]; // array to store samples
-float BPM = 73.0;  // beats per minute
-
-int pointer_x=20;
-int pointer_y=40;
-int loop=0;
-int output=0;
-int state=0;
-float brightness_adjuster=0.0;
-volatile int g_button_flag=0;
-int g_crash=0;
-int g_liveleft=3;
-float duration=0;
-int playerSpeed=0;
-int g_level=1;
-int g_score=0;
-int carValue[10000];
-int car_x=22;          //initiate car position_x
-int car_y=38;          //initiate car position_y
-int delay=0;
-int lastCar=0;
-int game = PLAY;
-
 int main()
 {
-    lcd.init();
-    initArray();
-    button.rise(&button_isr);
-    button.mode(PullDown);
-    int output=0;
-    int state=0;
-    intro();
+    lcd.init();                     //initialize the lcd
+    initArray();                    //fill array with sine sample
+    button.rise(&button_isr);       //will read the rise edge when button is pressed
+    button.mode(PullDown);          //external button is set as PullDown
 
     while(1)    {
-        // set output of current state (use dot syntax to access struct members)
-        output = fsm[state].output;
-        // implement required delay
-        //wait(fsm[state].time);
-        // set the next state depending on direction
-        //state = fsm[state].next_state[direction];
+
+        intro();                            //state 0 - introduction interface
+        firstView();                        //state 1 - main menu interface
+        gameView();                         //state 2 - game interface
+        optionView();                       //state 3 - option interface
+        instructionView();                  //state 4 - how to play interface
+        brightnessView();                   //state 5 - set up brightness interface
+        finishView(g_score);                //state 6 - final score interface
+    }
+}
+                                                                
+void intro()                                                        //state 0 - introduction interface
+{
+    if(state==0)    {
 
-        firstView();
-        gameView();
-        optionView();
-        brightnessView();
-        instructionView();
+        for(int k=90; k>5; k--)   {
+            lcd.printString("KAMIKAZE",k,1);                        //display game title in left moving motion
+            lcd.printString("RACE",k+12,2);
+            lcd.refresh();
+            wait(0.1);
+            lcd.clear();
+
+            if(g_button_flag==1)    {
+                g_button_flag=0;
+                state=1;
+                break;
+            }
+        }
+        state=1;
     }
 }
 
-void intro()
+void firstView()                                                    //state 1 - main menu interface
 {
-    for(int k=90; k>5; k--)   {
-        lcd.printString("KAMIKAZE",k,1);
-        lcd.printString("RACE",k,2);
-        lcd.refresh();
-        wait(0.1);
-        lcd.clear();
-        if(g_button_flag==1)    {
-            g_button_flag=0;
-            break;
-        }
-    }
-}
-void firstView()
-{
-    if(state==0)    {
+    if(state==1)    {
         pointer_x=20;
-        pointer_y=35;
+        pointer_y=31;
+
         while(loop==0) {
-            lcd.printString("KAMIKAZE",5,1);
-            lcd.printString("RACE",5,2);
-            lcd.printString("START",25,4);
-            lcd.printString("OPTION",25,5);
-            firstViewPointer();
-            lcd.drawCircle(20,pointer_y,2,1);
-            lcd.refresh();
-            wait(0.1);
-            lcd.clear();
-            if(g_button_flag==1)    {
-                g_button_flag=0;
-                loop=1;
-                if(pointer_y==35)   {
-                    state=1;//task for game
-                } else {
-                    state=2;
+            sleepTimer.start(); // start timer
+
+            if(sleepTimer.read()<15)    {                           //display all the main menu interface
+                lcd.printString("KAMIKAZE",5,1);
+                lcd.printString("RACE",17,2);
+                lcd.drawLine(58,46,58,2,2);
+                lcd.drawLine(67,46,67,2,2);
+                lcd.drawLine(76,46,76,2,2);
+                lcd.drawCar(60,10,1);
+                lcd.drawCar(60,25,1);
+                lcd.drawCar(69,23,1);
+                lcd.printString("Start",14,4);
+                lcd.printString("Option",14,5);
+                firstViewPointer();
+                lcd.drawCar(5,pointer_y,1);
+                lcd.refresh();
+                wait(0.1);
+                lcd.clear();
+
+                if(g_button_flag==1)    {
+                    g_button_flag=0;
+                    loop=1;
+
+                    if(pointer_y==31)   {
+                        state=2;    //go to game state
+                    } else {
+                        state=3;    //go to option state
+                    }
                 }
+            } else {                                                //go to sleep mode after 15 second has passed
+                sleepTimer.stop();  // stop the timer
+                sleepTimer.reset(); // reset to 0
+                SleepView();
             }
         }
         loop=0;
+        sleepTimer.stop();  // stop the timer
+        sleepTimer.reset(); // reset to 0
     }
 }
 
-void firstViewPointer()
+void gameView()                                                     //state 2 - game interface
 {
-    if(yPot>0.7f)    {
-        pointer_y=35;
-    }
-    if(yPot<0.3f)    {
-        pointer_y=43;
-    }
-}
+    if(state==2)    {
 
-void gameView()
-{
-    if(state==1)    {
+        initialGameInterface();                                     //function to initialize the game with countdown timer.
+        initGameVar();                                              //function to initiate all variable used in the game
 
-        initialGameInterface();
-
-        while(g_crash==0)    {
+        while(g_crash==0)    {                                      //0 - crash not occur
 
             for(int i=1; i<=g_level*20; i++)    {
-                carValue[i]=9*((rand()%6)+1)-5;                                     //generate all opponent car
+                carValue[i]=9*((rand()%6)+1)-5;                                     //generate random position for all vehicle on the road
             }
 
             for(int y_move=-5; y_move<100000; y_move++)  {
 
-                if(game==PLAY) {
+                if(game==PLAY) {                                                 //when game is played
                     crash(carValue,y_move,g_score,g_level,car_x,car_y,delay);    //function to check whether crash occur
-                    playermovement(g_level);
+                    playermovement(g_level);                                     //function to control the player's car movement
                     lcd.refresh();
-                    checkLastCar(g_level);
-                    if((y_move-(lastCar))>40)   {
-                        finishLevel(g_level);
+                    checkLastCar(g_level);                                      //function to check when will the last last car go out from the screen to finish level
+                    
+                    if((y_move-(lastCar))>40)   {                               
+                        finishLevel(g_level);                                   //finish level when last car has passed through
                         break;
                     }
                     if(g_crash==1)    {
@@ -196,24 +132,24 @@
                         if(g_liveleft<=1)   {                       //check if live is zero after crash occured
                             lcd.clear();                            // if zero, game stop
                             break;
-                        } else    {                                                 //if not zero
-                            g_crash=0;                                              //reduce the live,and continue the game
-                            g_liveleft=g_liveleft-1;                                //return the car back to initial position
-                            g_level=g_level-1;
-                            car_x=22;
+                        } else    {                                                 //if still has life
+                            g_crash=0;                                              //continue the game
+                            g_liveleft=g_liveleft-1;                                //reduce the life
+                            g_level=g_level-1;                                      //start at same level when crash occur
+                            car_x=22;                                               //return the car back to initial position
                             car_y=38;
                             break;
                         }
                     }
                     lcd.clear();
                     g_score=g_score+1;                                  //increase the score by 1 after every loop
-                } else {
-                    y_move=y_move-1;
-                    game_interface(g_score,g_level,g_liveleft);
-                    lcd.printString("Paused",15,1);
+                } else {                                                //when game is paused
+                    y_move=y_move-1;                                    //fix y_move to make the vehicle static
+                    game_interface(g_score,g_level,g_liveleft);         
+                    lcd.printString("Paused",15,2);                     //display pause on the screen
                     lcd.refresh();
                 }
-                if (g_button_flag==1) {
+                if (g_button_flag==1) {                                 //press button to paused/play the game.
                     g_button_flag=0;
                     pausesound();
                     wait(0.1);
@@ -225,141 +161,321 @@
                 }
             }
             g_level=g_level+1;
-            //game coding here
-            /*if(g_button_flag==1)    {
-                g_button_flag=0;
-                loop=1;
-                state=3;
-            }*/
+        }                                                               //when the game finished, move to finish View(display high score) 
+        state=6;
+        finishView(g_score);
+        state=0;                                                        //goes back to main menu
+    }
+}
+
+void optionView()                                                       //state 3 - option interface
+{
+    if(state==3)    {
+        pointer_x=5;
+        pointer_y=7;
+        
+        while(loop==0)    {
+            sleepTimer.start(); // start timer
+            
+            if(sleepTimer.read()<15)    {
+                lcd.printString("Instruction",13,1);
+                lcd.printString("Brightness",13,2);
+                lcd.printString("Achievement",13,3);
+                lcd.printString("Back",13,4);
+                optionPointer();
+                lcd.drawCar(4,pointer_y,1);
+                lcd.refresh();
+                wait(0.1);
+                lcd.clear();
+                
+                if(g_button_flag==1)    {
+                    g_button_flag=0;
+                    loop=1;
+                    
+                    if(pointer_y==7)   {
+                        state=4;//go to instruction
+                    } else if(pointer_y==15)   {
+                        state=5;//go to brightness
+                    } else if(pointer_y==31)   {
+                        state=1;//go back
+                    } else { //pointer====23
+                        state=6;//go to achievement
+                    }
+                }
+            } else {
+                sleepTimer.stop();  // stop the timer
+                sleepTimer.reset(); // reset to 0
+                SleepView();
+            }
         }
-        finishView(g_score);
-        g_crash=0;
-        g_liveleft=3;
-        g_level=1;
+        loop=0;
+        sleepTimer.stop();  // stop the timer
+        sleepTimer.reset(); // reset to 0
     }
 }
 
-void crash(int carValue[],int opponent_y,int g_score,int g_level,int k,int l,int delay)
+void instructionView()                                                  //state 4 - how to play interface
+{
+    if(state==4)    {
+        
+        while(loop==0)    {
+            sleepTimer.start(); // start timer
+            
+            if(sleepTimer.read()<15)    {
+                lcd.printString("Make your way",0,0);                   //explain how to play the game
+                lcd.printString("through the",0,1);
+                lcd.printString("traffic by ",0,2);
+                lcd.printString("avoiding all",0,3);
+                lcd.printString("vehicles on",0,4);
+                lcd.printString("the highway.",0,5);
+                lcd.refresh();
+                wait(0.1);
+                lcd.clear();
+                
+                if(g_button_flag==1)    {
+                    g_button_flag=0;
+                    loop=1;
+                    state=9;
+                }
+            } else {
+                sleepTimer.stop();  // stop the timer
+                sleepTimer.reset(); // reset to 0
+                SleepView();
+            }
+        }
+        loop=0;
+        sleepTimer.stop();  // stop the timer
+        sleepTimer.reset(); // reset to 0
+    }
+    if(state==9)    {
+        
+        while(loop==0)    {
+            sleepTimer.start(); // start timer
+            
+            if(sleepTimer.read()<15)    {
+                lcd.printString("You have ",0,0);
+                lcd.printString("three lives",0,1);
+                lcd.printString("at the ",0,2);
+                lcd.printString("start of",0,3);
+                lcd.printString("the game.",0,4);
+                lcd.printString("Good Luck!!!",0,5);
+                lcd.refresh();
+                wait(0.1);
+                lcd.clear();
+                
+                if(g_button_flag==1)    {
+                    g_button_flag=0;
+                    loop=1;
+                    state=3;
+                }
+            } else {
+                sleepTimer.stop();  // stop the timer
+                sleepTimer.reset(); // reset to 0
+                SleepView();
+            }
+        }
+        loop=0;
+        sleepTimer.stop();  // stop the timer
+        sleepTimer.reset(); // reset to 0
+    }
+}
+
+void brightnessView()                                                //state 5 - set up brightness interface
 {
-    float carPixel[84][48];
+    if(state==5)    {
+        brightness_adjuster=5;
+        
+        while(loop==0)    {
+            sleepTimer.start(); // start timer
+            
+            if(sleepTimer.read()<15)    {
+                brightnessController();
+                lcd.printString("Adjust",25,1);
+                lcd.printString("Brightness",13,2);
+                lcd.printString("+",78,4);
+                lcd.printString("-",2,4);
+                lcd.setBrightness(brightness_adjuster/10);
+                lcd.drawRect(1,27,brightness_adjuster*8,4,1);
+                lcd.drawRect(1,27,81,4,0);
+                lcd.refresh();
+                wait(0.1);
+                lcd.clear();
+                
+                if(g_button_flag==1)    {
+                    g_button_flag=0;
+                    loop=1;
+                    state=3;
+                }
+            } else {
+                sleepTimer.stop();  // stop the timer
+                sleepTimer.reset(); // reset to 0
+                SleepView();
+            }
+        }
+        loop=0;
+        sleepTimer.stop();  // stop the timer
+        sleepTimer.reset(); // reset to 0
+    }
+}
+
+void finishView(int g_score)                                        //state 6 - final score interface
+{
+    if(state==6)    {
+        
+        while(loop==0)    {
+            sleepTimer.start(); // start timer
+            
+            if(sleepTimer.read()<15)    {
+                char buffer[14];
+                int length = sprintf(buffer,"%2d",g_score/20);      //display final score
+                lcd.printString("Your",30,1);
+                lcd.printString("Final Score",10,2);
+                lcd.printString("Is",34,3);
+                lcd.printString(buffer,34,4);
+                lcd.refresh();
+                wait(0.1);
+                lcd.clear();
+                
+                if(g_button_flag==1)    {
+                    g_button_flag=0;
+                    loop=1;
+                    state=3;
+                }
+            } else {
+                sleepTimer.stop();  // stop the timer
+                sleepTimer.reset(); // reset to 0
+                SleepView();
+            }
+        }
+        loop=0;
+    }
+}
+
+void SleepView()            //this function applies the sleep mode concept
+{                           //improve power effciency for the game system
+    while(loop==0)  {       //expand the battery lifetime.
+        lcd.turnOff();      //also turn off the lcd scrren when not in used
+        sleep(); 
+                           
+        if(g_button_flag==1)  {
+            g_button_flag=0;        //if button pressed, turn on the screen back.
+            lcd.init();
+            loop=1;
+        }
+    }
+    loop=0;
+}
+
+
+
+void crash(int carValue[],int opponent_y,int g_score,int g_level,int k,int l,int delay)     //function to check if crash occur
+{
+    float carPixel[84][48];     //create array for vehicle on the road
     float enemyPixel[84][48];
 
     lcd.clear();
     lcd.drawCar(k,l,1);
     lcd.refresh();
+    
     for(int i=0; i<=54; i++) {
         for(int j=0; j<=48; j++) {
-            carPixel[i][j]=lcd.getPixel(i,j);
+            carPixel[i][j]=lcd.getPixel(i,j);       //check player's car pixel
         }
     }
     lcd.clear();
 
-
     for(int i=1; i<=(g_level*20); i++)    {
 
-        if (g_level>=9) {
-            lcd.drawCar(carValue[i],opponent_y-delay,1);
+        if (g_level>=9) {                                               //for this part, it draw different type of vehicle for given road lane.
+            if (carValue[i]<10) {                                         
+                lcd.drawTruck(carValue[i],opponent_y-delay,1);          //truck is drawn on most left lane
+            } else if (carValue[i]<20) {
+                lcd.drawVan(carValue[i],opponent_y-delay,1);            //van is drawn second left lane
+            } else if (carValue[i]<40) {
+                lcd.drawCar(carValue[i],opponent_y-delay,1);            //car is drawn on lane three and four
+            }  else {
+                lcd.drawCarReverse(carValue[i],opponent_y-delay,1);     //car is drawn  in opposite direction for opposite lane
+            }
             if(i%3==0) {
                 delay=delay+20;
             }
-        } else if(g_level>=5) {
-            lcd.drawCar(carValue[i],opponent_y-delay,1);
+        } else if(g_level>=5) {                                         //the step is repeat for different level
+            if (carValue[i]<10) {                                       //higher the level, more car will be on the road to make it more difficult
+                lcd.drawTruck(carValue[i],opponent_y-delay,1);
+            } else if (carValue[i]<20) {
+                lcd.drawVan(carValue[i],opponent_y-delay,1);
+            } else if (carValue[i]<40) {
+                lcd.drawCar(carValue[i],opponent_y-delay,1);
+            } else {
+                lcd.drawCarReverse(carValue[i],opponent_y-delay,1);
+            }
             if(i%2==0) {
                 delay=delay+20;
             }
         } else {
-            lcd.drawCar(carValue[i],opponent_y-delay,1);
+            if (carValue[i]<10) {
+                lcd.drawTruck(carValue[i],opponent_y-delay,1);
+            } else if (carValue[i]<20) {
+                lcd.drawVan(carValue[i],opponent_y-delay,1);
+            } else if (carValue[i]<40) {
+                lcd.drawCar(carValue[i],opponent_y-delay,1);
+            } else {
+                lcd.drawCarReverse(carValue[i],opponent_y-delay,1);
+            }
             delay=delay+20;
         }
     }
-    /*if(opponent_x0==22) {
-        lcd.printString("+",opponent_x1,2);
-        lcd.drawCircle(opponent_x1+2,opponent_y,3,0);
-        lcd.printString("x",opponent_x1,2);
-        lcd.drawCircle(opponent_x1+2,opponent_y,3,0);
-    }*/
     lcd.refresh();
     for(int i=0; i<=54; i++) {
         for(int j=0; j<=48; j++)  {
-            enemyPixel[i][j]=lcd.getPixel(i,j);
+            enemyPixel[i][j]=lcd.getPixel(i,j);                     //now, check the pixel for traffic's car
         }
     }
-
     for(int i=0; i<=54; i++) {
         for(int j=0; j<=48; j++)  {
-            if(enemyPixel[i][j]!=0 && carPixel[i][j]!=0)    {
-                lcd.printString("!!CRASH!!",2,2);
+            if(enemyPixel[i][j]!=0 && carPixel[i][j]!=0)    {       //now, check if player's car pixel overlap with traffic's car pixel
+                lcd.printString("!!CRASH!!",2,2);                   //if yes, print crash
                 g_crash=1;
-
             }
         }
     }
-    game_interface(g_score,g_level,g_liveleft);
+    game_interface(g_score,g_level,g_liveleft);                     //put all the other displaying stuff to finish off the interface
     lcd.drawCar(k,l,1);
     lcd.refresh();
     double ki=-((g_level));
-    duration=(0.02*exp(ki))+0.005;                //0.03*exp(ki))+0.005
+    duration=(0.02*exp(ki))+0.005;                                  //use exponential decay equation to be used for speed control at increasing level
+    
     if(opponent_y%5==0)  {
         gameplaysound(duration);
     } else {
-        wait(duration); //0.05*pow(0.9,time)+0.004
+        wait(duration); 
     }
-    //lcd.clear();
 }
 
-void game_interface(int g_score,int g_level,int g_liveleft)
+void game_interface(int g_score,int g_level,int g_liveleft)         //function to provide game interface during gameplay
 {
     score(61,2);
     level(61,18);
     char buffer[14];
-    int length = sprintf(buffer,"%2d",g_score/10);
+    int length = sprintf(buffer,"%2d",g_score/20);
     lcd.printString(buffer,62,1);
     int length1 = sprintf(buffer,"%2d",g_level);
     lcd.printString(buffer,62,3);
     live(g_liveleft);
     roadline(g_score);
-    lcd.drawRect(59,33,22,4,1);
-}
-
-void live(int liveleft)
-{
-    lcd.drawHeart(59,40,liveleft,1);
-    lcd.refresh();
+    lcd.drawRect(59,33,g_level*2,4,1);
+    lcd.drawRect(59,33,22,4,0);
 }
 
-void roadline(int moving)
+void playermovement(int g_level)            //function to control the player's car movement
 {
-    lcd.drawLine(11,46,11,2,2);
-    lcd.drawLine(20,46,20,2,2);
-    lcd.drawLine(29,46,29,2,2);
-    lcd.drawLine(38,45,38,2,1);
-    lcd.drawLine(47,46,47,2,2);
-
-    lcd.drawLine(0,47,0,0,1);
-    lcd.drawLine(83,47,83,0,1);
-    lcd.drawLine(83,0,0,0,1);
-    lcd.drawLine(83,47,0,47,1);
-
-    if(moving%2!=0) {
-        lcd.drawLine(2,46,2,2,2);
-        lcd.drawLine(56,46,56,2,2);
-        lcd.refresh();
-    } else    {
-        lcd.drawLine(2,45,2,1,2);
-        lcd.drawLine(56,45,56,1,2);
-        lcd.refresh();
-    }
-}
-
-void playermovement(int g_level)
-{
-    if (g_level<3)  {
-        playerSpeed=3;
-    } else if(g_level<6) {
+    if (g_level>=3)  {                      //at higher level, speed is faster, so give small scale movement to give better handling 
         playerSpeed=1;
+    } else if(g_level<3) {                  //at lower level, speed is slower, so high scale movemement is allowed.
+        playerSpeed=2;
     }
 
-    if(xPot>=0.7f)    {
+    if(xPot>=0.7f)    {                     //joystick movement control the screen is shown here
         if(car_x>-3 && car_x<49) {
             car_x=car_x+playerSpeed;
         }
@@ -382,9 +498,9 @@
     }
 }
 
-void checkLastCar(int g_level)
-{
-    if(g_level>=9)   {
+void checkLastCar(int g_level)          //check for last car will be on the screen
+{                                       //needed in order to stop the for loop and finish the level
+    if(g_level>=9)   {                  
         lastCar=g_level*33*4;
     } else if(g_level>=5) {
         lastCar=g_level*50*4;
@@ -393,7 +509,7 @@
     }
 }
 
-void finishLevel(int g_level)
+void finishLevel(int g_level)           //display the high score screen when the game is finish
 {
     char buffer[48];
     int length = sprintf(buffer,"%2d",g_level);
@@ -408,13 +524,13 @@
     car_y=38;
 }
 
-void initialGameInterface()
+void initialGameInterface()                                 //provide initial countdown before the game start
 {
-    for(int countdown=5; countdown>=1; countdown--)  {
-        score(62,2);
-        level(62,18);
-        lcd.printString("0",62,1);
-        lcd.printString("1",62,3);
+    for(int countdown=5; countdown>=1; countdown--)  {      //countdown from 5-1
+        score(61,2);
+        level(61,18);
+        lcd.printString("0",68,1);
+        lcd.printString("1",68,3);
         lcd.drawHeart(59,40,3,1);
 
         lcd.drawLine(0,47,0,0,1);
@@ -436,155 +552,54 @@
     }
 }
 
-void optionView()
+void initGameVar()             //initiate every variable use in the game before the game start
 {
-    if(state==2)    {
-        pointer_x=5;
-        pointer_y=11;
-        while(loop==0)    {
-            lcd.printString("INSTRUCTION",10,1);
-            lcd.printString("BRIGHTNESS",10,2);
-            lcd.printString("ACHIEVEMENT",10,3);
-            lcd.printString("BACK",10,4);
-            optionPointer();
-            lcd.drawCircle(5,pointer_y,2,1);
-            lcd.refresh();
-            wait(0.1);
-            lcd.clear();
-            if(g_button_flag==1)    {
-                g_button_flag=0;
-                loop=1;
-                if(pointer_y==11)   {
-                    state=5;//task for instruction
-                } else if(pointer_y==19)   {
-                    state=4;//task for high score
-                } else if(pointer_y==35)   {
-                    state=0;//task for go back
-                } else {
-                    //state=2;
-                }
-            }
-        }
-        loop=0;
+    g_crash=0;
+    g_liveleft=3;
+    g_level=1;
+    g_score=0;
+    car_x=22;
+    car_y=38;
+}
+
+void firstViewPointer()         //control the pointer on main menu
+{
+    if(yPot>0.7f)    {
+        pointer_y=31;
+    }
+    if(yPot<0.3f)    {
+        pointer_y=39;
     }
 }
 
-void optionPointer()
+void optionPointer()            //control the pointer on option menu
 {
     if(yPot>0.7f)    {
-        if(pointer_y>11 && pointer_y<38) {
+        if(pointer_y>11 && pointer_y<32) {
             pointer_y=pointer_y-8;
         }
     }
     if(yPot<0.3f)    {
-        if(pointer_y>5 && pointer_y<35) {
+        if(pointer_y>5 && pointer_y<28) {
             pointer_y=pointer_y+8;
         }
     }
 }
 
-void button_isr()
-{
-    g_button_flag=1;
-}
-
-void finishView(int g_score)
-{
-    char buffer[14];
-    int length = sprintf(buffer,"%2d",g_score/10);
-    lcd.printString("Your",30,1);
-    lcd.printString("Final Score",10,2);
-    lcd.printString("Is",34,3);
-    lcd.printString(buffer,34,4);
-    lcd.refresh();
-    wait(3.0);
-    lcd.clear();
-    state=0;
-    g_score=0;
-}
-
-void brightnessView()
+void brightnessController()         //control the brightness by using joystick
 {
-    if(state==4)    {
-        brightness_adjuster=5;
-        while(loop==0)    {
-            brightnessController();
-            lcd.setBrightness(brightness_adjuster/10);
-            char buffer[14];
-            int length = sprintf(buffer,"%2f",brightness_adjuster);
-            lcd.printString(buffer,20,2);
-            lcd.refresh();
-            wait(0.1);
-            lcd.clear();
-            if(g_button_flag==1)    {
-                g_button_flag=0;
-                loop=1;
-                state=2;
-            }
-        }
-        loop=0;
-    }
-}
-void brightnessController()
-{
-    if(yPot>0.7f)    {
+    if(xPot>0.7f)    {
         if(brightness_adjuster>=0 && brightness_adjuster<=9) {
             brightness_adjuster=brightness_adjuster+1;
         }
     }
-    if(yPot<0.3f)    {
+    if(xPot<0.3f)    {
         if(brightness_adjuster>=1 && brightness_adjuster<=10) {
             brightness_adjuster=brightness_adjuster-1;
         }
     }
 }
 
-void achievementView()
-{
-    lcd.printString("Your",30,1);
-    lcd.printString("Final Score",10,2);
-    lcd.printString("Is",34,3);
-    lcd.printString("40000",25,4);
-}
-
-
-void instructionView()
-{
-    if(state==5)    {
-        while(loop==0)    {
-            lcd.printString("Pass Through",0,0);
-            lcd.printString("The Traffic",0,1);
-            lcd.printString("As Many As You",0,2);
-            lcd.printString("Can You Will",0,3);
-            lcd.printString("Be Given",0,4);
-            lcd.printString("Three Life",0,5);
-            lcd.refresh();
-            wait(0.1);
-            lcd.clear();
-            if(g_button_flag==1)    {
-                g_button_flag=0;
-                loop=1;
-                state=2;
-            }
-        }
-        loop=0;
-    }
-}
-
-void gameplaysound(float duration)
-{
-    float noteArray[] = {
-        // provide sound during the time game is played
-        NOTE_G3,
-    };
-
-    int notes = sizeof(noteArray)/sizeof(float);
-    for(int i=0; i < notes; i++) {
-        tone(noteArray[i],duration);
-
-    }
-}
-
 void initArray()
 {
     // create LUT - loop through array and calculate sine wave samples
@@ -596,7 +611,7 @@
 
 void tone(float frequency,float duration)
 {
-    green_led=1;        //turn on LED
+    green=1;        //turn on LED
 
     if (frequency > 0) {  // a frequency of 0 indicates no note played so only play a note if frequency is not 0
 
@@ -619,7 +634,21 @@
         wait(duration);
     }
 
-    green_led = 0;   // turn off LEDs
+    green = 0;   // turn off LEDs
+}
+
+void gameplaysound(float duration)
+{
+    float noteArray[] = {
+        // provide sound during the time game is played
+        NOTE_G3,
+    };
+
+    int notes = sizeof(noteArray)/sizeof(float);
+    for(int i=0; i < notes; i++) {
+        tone(noteArray[i],duration);
+
+    }
 }
 
 void crashsound()
@@ -654,7 +683,53 @@
     }
 }
 
-void score(int m,int my)
+void finishsound()
+{
+    float noteArray[] = {
+        // provide sound during the time game is played
+        NOTE_E6,NOTE_C6,NOTE_E6,NOTE_C6,
+    };
+    float noteDuration[] = {
+        8,8,8,8
+    };
+    int notes = sizeof(noteArray)/sizeof(float);
+    for(int i=0; i < notes; i++) {
+        tone(noteArray[i],60.0f/(BPM*noteDuration[i]));
+
+    }
+}
+
+void live(int liveleft)         //draw how many life left on the screen
+{
+    lcd.drawHeart(59,40,liveleft,1);
+    lcd.refresh();
+}
+
+void roadline(int moving)           //draw the road line +border line on the screen
+{   //road line
+    lcd.drawLine(11,46,11,2,2);
+    lcd.drawLine(20,46,20,2,2);
+    lcd.drawLine(29,46,29,2,2);
+    lcd.drawLine(38,45,38,2,1);
+    lcd.drawLine(47,46,47,2,2);
+    //border line 
+    lcd.drawLine(0,47,0,0,1);
+    lcd.drawLine(83,47,83,0,1);
+    lcd.drawLine(83,0,0,0,1);
+    lcd.drawLine(83,47,0,47,1);
+
+    if(moving%2!=0) {
+        lcd.drawLine(2,46,2,2,2);
+        lcd.drawLine(56,46,56,2,2);
+        lcd.refresh();
+    } else    {
+        lcd.drawLine(2,45,2,1,2);
+        lcd.drawLine(56,45,56,1,2);
+        lcd.refresh();
+    }
+}
+    
+void score(int m,int my)            //display the score text on the screen
 {
     //show score title
     lcd.setPixel(m,my);
@@ -712,7 +787,7 @@
     lcd.setPixel(m+18,my+4);
 }
 
-void level(int x1,int y1)
+void level(int x1,int y1)           //display the level text on the screen
 {
     int x0=x1;
     int y0=y1;
@@ -731,4 +806,9 @@
     lcd.setPixel(x1+13,y1+2);
     lcd.drawLine(x1+16,y1+4,x0+16,y0,1);
     lcd.drawLine(x1+18,y1+4,x0+16,y0+4,1);
+}
+
+void button_isr()               //use for interrupt
+{
+    g_button_flag=1;
 }
\ No newline at end of file