ELEC2645 (2015/16) / Mbed 2 deprecated Game

Dependencies:   N5110 mbed

Fork of Game_StarCraft_III by Chenyu Li

Revision:
1:97ef4864d6fb
Parent:
0:33ba6cd82532
--- a/main.cpp	Thu Apr 28 11:34:51 2016 +0000
+++ b/main.cpp	Wed May 04 19:22:58 2016 +0000
@@ -1,225 +1,433 @@
-
-
-#include "mbed.h"
-
-#include "N5110.h"
-#include <stdio.h>
-#include <stdlib.h>
-#define DIRECTION_TOLERANCE 0.05
-
-
-//    VCC,SCE,RST,D/C,MOSI,SCLK,LED
-N5110 lcd(PTE26 , PTA0 , PTC4 , PTD0 , PTD2 , PTD1 , PTC3);
-PwmOut buzzer(PTA2);
-DigitalIn button(PTB18);
-DigitalIn buttonjoystick(PTB11);
-AnalogIn xPot(PTB3);
-AnalogIn yPot(PTB2);
-Ticker pollJoystick;
-Ticker bullet;
-Ticker enermy;
-Serial serial(USBTX,USBRX);
+#include "main.h"
 
 
-enum DirectionName {
-    UP,
-    DOWN,
-    LEFT,
-    RIGHT,
-    CENTRE,
-    UNKNOWN
-};
-typedef struct JoyStick Joystick;
-struct JoyStick {
-    float x;    // current x value
-    float x0;   // 'centred' x value
-    float y;    // current y value
-    float y0;   // 'centred' y value
-    int buttonjoystick; // button state (assume pull-down used, so 1 = pressed, 0 = unpressed)
-    DirectionName direction;  // current direction
-};
-// create struct variable
-Joystick joystick;
-
-int printFlag = 0;
-int enermyFlag = 0;
-int bulletFlag = 0;
-void calibrateJoystick();
-void updateJoystick();
-void createbullet();
-void createenermy();
-int status =1;
-
-
-bool hit = false;
 int main()
 {
+
     // first need to initialise display
-    lcd.init();
-    button.mode(PullDown);
-    buttonjoystick.mode(PullDown);
+    lcd.init();/// turn on the lcd screen.
+    button.rise(&button_isr);/// return the value of button_isr to here.
+    button.mode(PullDown);/// set the mode of the button to make the user can press the botton.
+    /* while(1){
+         lcd.clear();
+     if(g_button_flag) {
+        // g_button_flag = 0;
+         lcd.printString("button is on",0,0);
+     }else {
+         lcd.printString("button is off",0,0);
+     }
+     lcd.refresh();
+     wait(0.1);
+     }*/
+    buttonjoystick.mode(PullDown);/// set the mode of the button of joystick to make the user can press the botton.
     calibrateJoystick();  // get centred values of joystick
     pollJoystick.attach(&updateJoystick,1.0/10.0);  // read joystick 10 times per second
-//joystick
 
- 
-        // these are default settings so not strictly needed
-        lcd.normalMode();      // normal colour mode
-        lcd.setBrightness(1.0); // put LED backlight on 50%
-        
-        lcd.printString("Welcome To",15,1);
-        lcd.printString("Starcraft III!",4,3);
-        lcd.refresh();
-        wait(5.0);
-        lcd.clear();
-               lcd.printString("Menu",30,0);
-       lcd.drawLine(0,10,83,10,1);
-       lcd.printString("New Game",20,3);
-       lcd.refresh();
-      
-      while(1){ 
-               if (buttonjoystick){
-               //buzzer.period_ms(2.9);
-               //buzzer.pulsewidth_ms(1.9);
-               wait(0.5);
-               lcd.clear();
-               lcd.refresh();
-               break;               
-               }
-               
-            }
-//loading
-        lcd.printString("Loading......",6,1);
-
-        for (int x = 0; x < WIDTH ; x+=10) {
-            
-            lcd.drawRect(0,36,10+x,10,1);
-            wait(0.1);
-            lcd.refresh();
-        }
-        lcd.clear();
-        
-        
-        int x = 41 ;
-        lcd.drawLine(x,40,x,47,1);
-        lcd.drawLine(x-4,42,x+4,42,1);
-        lcd.drawLine(x-1,43,x+1,43,1);
-        lcd.drawLine(x-1,47,x+1,47,1);
-        lcd.refresh();
-        int z = 41;
-        int q = 0;
-        int p = 0;
-        int a;
-        int b;
-        a = rand() % 76;
-        b = rand() % 76;
-        int y = 39;
-        int buttonjoystickpress = 0;
-        //bullet.attach(&createbullet,0.1);
-        //enermy.attach(&createenermy,2.0);
 
 
-while(1){
+    // these are default settings so not strictly needed
+    lcd.normalMode();      // normal colour mode
+    lcd.setBrightness(1.0); // put LED backlight on 50%
+    
+    // welcome screen
+    lcd.printString("Welcome To",15,1);
+    lcd.printString("Starcraft III!",4,3);
+    lcd.refresh();
+    wait(5.0);
+    lcd.clear();
+    
+    lcd.printString("How to Play",10,0);
+    
+    // draw Enemy.
+    lcd.printString("Enemy",30,2);
+    // draw the arrow.
+    lcd.drawLine(15,19,22,19,1);
+    lcd.drawLine(22,19,20,17,1);
+    lcd.drawLine(22,19,20,21,1);
+    
+    lcd.drawLine(0,10,83,10,1);
+    
+    lcd.drawLine(2,18,3,17,1);
+    lcd.drawLine(3,17,7,17,1);
+    lcd.drawLine(7,17,8,18,1);
+    lcd.drawLine(5,17,5,21,1);
+    //You
+    lcd.printString("You",30,4);
+    lcd.drawLine(15,35,22,35,1);
+    lcd.drawLine(22,35,20,33,1);
+    lcd.drawLine(22,35,20,37,1);
+    
+    lcd.drawLine(6,32,6,39,1);
+    lcd.drawLine(6-4,34,6+4,34,1);
+    lcd.drawLine(6-1,35,6+1,35,1);
+    lcd.drawLine(6-1,39,6+1,39,1);
+    lcd.refresh();
+    
+    //to make the screen stick in this while loop when the user press the botton then goes to next page.
+    while(1) {
+        if (button) {
+            //buzzer.period_ms(2.9);
+            //buzzer.pulsewidth_ms(1.9);
+            wait(0.5);
+            lcd.clear();
+            lcd.refresh();
+            break;
+        }
+    }
+    
+    // the screen to tell user how to control the Movement
+    lcd.printString("How to Play",10,0);
+    lcd.drawLine(0,10,83,10,1);
+    lcd.drawLine(41,15,41,22,1);
+    lcd.drawLine(41-4,17,41+4,17,1);
+    lcd.drawLine(41-1,18,41+1,18,1);
+    lcd.drawLine(41-1,22,41+1,22,1);
+    
+    lcd.drawLine(48,19,55,19,1);
+    lcd.drawLine(55,19,53,17,1);
+    lcd.drawLine(55,19,53,21,1);
+    
+    lcd.drawLine(27,19,34,19,1);
+    lcd.drawLine(27,19,29,17,1);
+    lcd.drawLine(27,19,29,21,1);
+
+    lcd.drawCircle(41,33,3,1);
+
+    lcd.drawLine(48,33,55,33,1);
+    lcd.drawLine(55,33,53,31,1);
+    lcd.drawLine(55,33,53,35,1);
+    
+    lcd.drawLine(27,33,34,33,1);
+    lcd.drawLine(27,33,29,31,1);
+    lcd.drawLine(27,33,29,35,1);
+    lcd.printString("JoyStick",19,5);
+    lcd.refresh();
+    
+    //to make the screen stick in this while loop when the user press the botton then goes to next page.
+    while(1) {
+        if (button) {
+            //buzzer.period_ms(2.9);
+            //buzzer.pulsewidth_ms(1.9);
+            wait(0.5);
+            lcd.clear();
+            lcd.refresh();
+            break;
+        }
+    }
+    
+    // describe how to use the button and the joystick button
+    lcd.printString("How to Play",10,0);
+    lcd.drawLine(0,10,83,10,1);
+    
+    lcd.printString("Button:",20,2);
+    lcd.printString("Viking Missile",0,3);
+    lcd.printString("JoyStick:",18,4);
+    lcd.printString("Bomb X3",19,5);
+    //to make the screen stick in this while loop when the user press the botton then goes to next page.
+    while(1) {
+        if (button) {
+            //buzzer.period_ms(2.9);
+            //buzzer.pulsewidth_ms(1.9);
+            wait(0.5);
+            lcd.clear();
+            lcd.refresh();
+            break;
+        }
+    }
+    
+    //prepare for battle screen
+    lcd.printString("Prepare for",10,0);
+    lcd.printString("Battle",23,1);
+    lcd.drawLine(0,20,83,20,1);
+    lcd.printString("Start!",25,4);
+    lcd.refresh();
+    //to make the screen stick in this while loop when the user press the joystick botton then goes to next page.
+    while(1) {
+        if (buttonjoystick) {
+            //buzzer.period_ms(2.9);
+            //buzzer.pulsewidth_ms(1.9);
+            wait(0.5);
+            lcd.clear();
+            lcd.refresh();
+            break;
+        }
+
+    }
+//loading screen
+    lcd.printString("Loading......",6,1);
+
+    for (int x = 0; x < WIDTH ; x+=10) {
+
+        lcd.drawRect(0,36,10+x,10,1);
+        wait(0.1);
+        lcd.refresh();
+    }
+    lcd.clear();
+
+
+    int x = 41 ;/// set 'x' to 41 originally.
+    // draw the player's unit.
+    lcd.drawLine(x,40,x,47,1);
+    lcd.drawLine(x-4,42,x+4,42,1);
+    lcd.drawLine(x-1,43,x+1,43,1);
+    lcd.drawLine(x-1,47,x+1,47,1);
+    lcd.refresh();
+    //the constant will be used in the code below
+    int z=41; ///the x axis value of the bullet, start from the middle of the screen 
+    int q = 0; ///the y axis value of the enemy unit, start from 0.
+    int p = 0;
+    int a;
+    int b;
+    a = rand() % 76; /// 'a' is a random number from 0-76.
+    //b = rand() % 76;
+    int yHit = 39;/// y axis value of the bullet. 
+    int buttonjoystickpress = 0;/// player can only use the bomb for 3 time, set the value to 0 originally.
+    int bu = 0;/// the constant which keep the bullet move in a straight line.
+    int score = 0;/// set the score value start from 0.
+    int rect = 0;/// y axis value of the left hand side wall.
+    int rect1 = 0;/// y axis value of the right hand side wall.
+    int width;/// the width of the left hand side wall.
+    width = rand() %30;/// set the width of the left hand side wall as a random value between 0-30.
+    int width2;/// the width of the right hand side wall.
+    width2 = 83 - rand() %30;// set the width of the right hand side wall as a random value between 53-83.
+    //bullet.attach(&createbullet,0.1);
+    //enermy.attach(&createenermy,2.0);
+
+
+    while(1) {
 
 
         if (printFlag) {  // if flag set, clear flag and print joystick values to serial port
             printFlag = 0;
             // check joystick direction
-        a-b > 7;
-        b-a > 7;
-        a + b < 83;
-        
+            //a-b > 7;
+            //b-a > 7;
+            //a + b < 83;
+            
+            // make the movement of the left hand side wall
+            if(!wall) {
+                lcd.drawRect(0,rect,width,5,2);
+                
+                rect++;/// set the wall moves 1 pixels per time.
+                
+                lcd.drawRect(0,rect,width,5,1);
+                lcd.refresh();
+                }
+            // return the 'rect' value back to 0 and set the random number again after the wall go out of the screen.
+            if(rect > 50) {
+                rect = 0;
+                width = rand() %30;
+            }
+            // make the movement of the right hand side wall
+            if(!wall) {
+                lcd.drawRect(width2,rect1,83-width2,5,2);
+                
+                rect1++;/// set the wall moves 1 pixels per time.
+                
+                lcd.drawRect(width2,rect1,83-width2,5,1);
+                lcd.refresh();
+                }
+            // return the 'rect1' value back to 0 and set the random number again after the wall go out of the screen.
+            if(rect1 > 50) {
+                rect1 = 0;
+                width2 = 83 - rand()%30;
+            }
+            
+            if(!hit) {
+                // make the movement of the enemy.
+                lcd.drawLine(a,q+1,a+1,q,0);
+                lcd.drawLine(a+1,q,a+5,q,0);
+                lcd.drawLine(a+5,q,a+6,q+1,0);
+                lcd.drawLine(a+3,q,a+3,q+4,0);
+                q+=2;/// set the enemy moves 2 pixels per time.
 
-        if(!hit){
-        lcd.drawLine(a,q+1,a+1,q,0);
-        lcd.drawLine(a+1,q,a+5,q,0);
-        lcd.drawLine(a+5,q,a+6,q+1,0);
-        lcd.drawLine(a+3,q,a+3,q+4,0);
-        q++;
-        
+                lcd.drawLine(a,q+1,a+1,q,1);
+                lcd.drawLine(a+1,q,a+5,q,1);
+                lcd.drawLine(a+5,q,a+6,q+1,1);
+                lcd.drawLine(a+3,q,a+3,q+4,1);
 
-        
-        lcd.drawLine(a,q+1,a+1,q,1);
-        lcd.drawLine(a+1,q,a+5,q,1);
-        lcd.drawLine(a+5,q,a+6,q+1,1);
-        lcd.drawLine(a+3,q,a+3,q+4,1);
-        
-        lcd.refresh();
-        }
-        hit = false;
-        /*
-        if(!hit){
-        lcd.drawLine(a+b,p+1,a+1+b,p,0);
-        lcd.drawLine(a+1+b,p,a+5+b,p,0);
-        lcd.drawLine(a+5+b,p,a+6+b,p+1,0);
-        lcd.drawLine(a+3+b,p,a+3+b,p+4,0);
-        
-        p++;
-        lcd.drawLine(a+b,p+1,a+1+b,p,1);
-        lcd.drawLine(a+1+b,p,a+5+b,p,1);
-        lcd.drawLine(a+5+b,p,a+6+b,p+1,1);
-        lcd.drawLine(a+3+b,p,a+3+b,p+4,1);
-        lcd.refresh();  
+                lcd.refresh();
             }
-        hit = false;
-        */
-        if(q > 50){
-            q = 0;
-            p = 0;
-            a = rand () % 76;
-            b = rand () % 76;
-            }        
+            hit = false;
+            /*
+            if(!hit){
+            lcd.drawLine(a+b,p+1,a+1+b,p,0);
+            lcd.drawLine(a+1+b,p,a+5+b,p,0);
+            lcd.drawLine(a+5+b,p,a+6+b,p+1,0);
+            lcd.drawLine(a+3+b,p,a+3+b,p+4,0);
+
+            p++;
+            lcd.drawLine(a+b,p+1,a+1+b,p,1);
+            lcd.drawLine(a+1+b,p,a+5+b,p,1);
+            lcd.drawLine(a+5+b,p,a+6+b,p+1,1);
+            lcd.drawLine(a+3+b,p,a+3+b,p+4,1);
+            lcd.refresh();
+                }
+            hit = false;
+            */
+            
+            // creat a new enemy when it has been hit or go out of the screen.
+            if(q > 50) {
+                q = 0;
+                p = 0;
+                a = rand () % 76;
+                b = rand () % 76;
+            }
+
+            // movement of the player's unit controlled by the joystick.
+            if (joystick.direction == UP && x > 4) {
+
+                score += 1;/// get 1 score after moving the joystick once and move for 1 pixel
+                lcd.drawLine(x,40,x,47,0);
+                lcd.drawLine(x-4,42,x+4,42,0);
+                lcd.drawLine(x-1,43,x+1,43,0);
+                lcd.drawLine(x-1,47,x+1,47,0);
+                x-=1;/// set the player's unit move 1 pixels per time.
+
+                lcd.drawLine(x,40,x,47,1);
+                lcd.drawLine(x-4,42,x+4,42,1);
+                lcd.drawLine(x-1,43,x+1,43,1);
+                lcd.drawLine(x-1,47,x+1,47,1);
+                lcd.refresh();
+
+            }
             
-        if (joystick.direction == UP && x > 4){
-        
- 
-        lcd.drawLine(x,40,x,47,0);
-        lcd.drawLine(x-4,42,x+4,42,0);
-        lcd.drawLine(x-1,43,x+1,43,0);
-        lcd.drawLine(x-1,47,x+1,47,0);
-        x-=1;
-        --z;
-        lcd.drawLine(x,40,x,47,1);
-        lcd.drawLine(x-4,42,x+4,42,1);
-        lcd.drawLine(x-1,43,x+1,43,1);
-        lcd.drawLine(x-1,47,x+1,47,1);
-        lcd.refresh();
+            if (joystick.direction == DOWN && x < 78) {
+                score += 1;/// get 1 score after moving the joystick once and move for 1 pixel
+                lcd.drawLine(x,40,x,47,0);
+                lcd.drawLine(x-4,42,x+4,42,0);
+                lcd.drawLine(x-1,43,x+1,43,0);
+                lcd.drawLine(x-1,47,x+1,47,0);
+                x+=1;/// set the player's unit move 1 pixels per time.
 
-        
-        }
-        if (joystick.direction == DOWN && x < 78){
+                lcd.drawLine(x,40,x,47,1);
+                lcd.drawLine(x-4,42,x+4,42,1);
+                lcd.drawLine(x-1,43,x+1,43,1);
+                lcd.drawLine(x-1,47,x+1,47,1);
+                lcd.refresh();
+            }
+            /*
+            if(z < width && yHit > rect && yHit < rect+5){
+                bullethit = true;
+            }
+            */
+            
+            //bullet movement and the calculation which make the bullet start from wherever the player's unit is and make it move in a stright line.
+            if(g_button_flag && !bullethit) {
+                
+                
+                //g_button_flag = 0;
+                if(joystick.direction == UP && x > 4) {
+                    bu--;
+                }
+                if(joystick.direction == DOWN && x < 78) {
+                    bu++;
+                }
+                z = x -bu;
+                lcd.drawLine(z,yHit,z,yHit-1,0);
+                
+                yHit-=2;/// set the bullet move 2 pixels per time.
+
+                lcd.drawLine(z,yHit,z,yHit-1,1);
+                
+                // detect if the bullet hits the enemy.
+                if(z>=a && z <=a+7 && yHit<=q) {
+                    hit = true;
+                    // clear the enemy.
+                    lcd.drawLine(a,q+1,a+1,q,0);
+                    lcd.drawLine(a+1,q,a+5,q,0);
+                    lcd.drawLine(a+5,q,a+6,q+1,0);
+                    lcd.drawLine(a+3,q,a+3,q+4,0);
+                    // recreate the enemy
+                    q=0;
+                    a = rand() % 76;
+                    score += 100; /// get 100 score after player hit an enermy
+                }
 
-        lcd.drawLine(x,40,x,47,0);
-        lcd.drawLine(x-4,42,x+4,42,0);
-        lcd.drawLine(x-1,43,x+1,43,0);
-        lcd.drawLine(x-1,47,x+1,47,0);
-        x+=1;
-        ++z;
-        lcd.drawLine(x,40,x,47,1);
-        lcd.drawLine(x-4,42,x+4,42,1);
-        lcd.drawLine(x-1,43,x+1,43,1);
-        lcd.drawLine(x-1,47,x+1,47,1);
-        lcd.refresh();
-              
-        
-        }
+                /*
+                if(z == a+1 && q == yHit) {
+                    hit = true;
+                    lcd.drawLine(a,q+1,a+1,q,0);
+                    lcd.drawLine(a+1,q,a+5,q,0);
+                    lcd.drawLine(a+5,q,a+6,q+1,0);
+                    lcd.drawLine(a+3,q,a+3,q+4,0);
+                    q=0;
+                    a = rand() % 76;
+                }
+                if(z == a+2 && q == yHit) {
+                    hit = true;
+                    lcd.drawLine(a,q+1,a+1,q,0);
+                    lcd.drawLine(a+1,q,a+5,q,0);
+                    lcd.drawLine(a+5,q,a+6,q+1,0);
+                    lcd.drawLine(a+3,q,a+3,q+4,0);
+                    q=0;
+                    a = rand() % 76;
+                }
+                if(z == a+3 && q+4 == yHit) {
+                    hit = true;
+                    lcd.drawLine(a,q+1,a+1,q,0);
+                    lcd.drawLine(a+1,q,a+5,q,0);
+                    lcd.drawLine(a+5,q,a+6,q+1,0);
+                    lcd.drawLine(a+3,q,a+3,q+4,0);
+                    q=0;
+                    a = rand() % 76;
+                }
+                if(z == a+5 && q == yHit) {
+                    hit = true;
+                    lcd.drawLine(a,q+1,a+1,q,0);
+                    lcd.drawLine(a+1,q,a+5,q,0);
+                    lcd.drawLine(a+5,q,a+6,q+1,0);
+                    lcd.drawLine(a+3,q,a+3,q+4,0);
+                    q=0;
+                    a = rand() % 76;
+                }
+                if(z == a+6 && q+1 == yHit) {
+                    hit = true;
+                    lcd.drawLine(a,q+1,a+1,q,0);
+                    lcd.drawLine(a+1,q,a+5,q,0);
+                    lcd.drawLine(a+5,q,a+6,q+1,0);
+                    lcd.drawLine(a+3,q,a+3,q+4,0);
+                    q=0;
+                    a = rand() % 76;
+                }
+*/
 
-        
-        
-        if(button){
-               
-                for (int y = 39; y > -5 ; y--) {
-                
-                lcd.drawLine(z,y,z,y-2,1);
-                if(y<39) 
-                    lcd.drawLine(z,y+1,z,y-2+1,0);
-                }
+                //lcd.drawLine(z,yHit,z,yHit-1,0);
+                //yHit--;
+                //lcd.drawLine(z,yHit,z,yHit-1,1);
                 lcd.refresh();
                 wait(0.1);
-        }
+            }
+            if (yHit < -3) {
+                g_button_flag = 0;/// set g_button_flag to 0 
+                yHit = 39;/// set 'yHit' back to 39
+                bu=0;/// set 'bu' back to 0.
+                z = x -bu;/// reset the x axis value of the bullet
+            }
         }
-        
-        if(buttonjoystick && buttonjoystickpress < 3){
+        //detect if the enemy hit the left hand side wall, the player won't get any score.
+        if(width>=a && rect <= q+4 && rect >= q) {
+            
+            hit = true;
+            lcd.drawLine(a,q+1,a+1,q,0);
+            lcd.drawLine(a+1,q,a+5,q,0);
+            lcd.drawLine(a+5,q,a+6,q+1,0);
+            lcd.drawLine(a+3,q,a+3,q+4,0);
+            q=0;
+            a = rand() % 76;
+        }
+        //detect if the enemy hit the right hand side wall, the player won't get any score.
+        if(a+6 >= width2 && rect <= q+4 && rect >= q){
+            hit = true;
+            lcd.drawLine(a,q+1,a+1,q,0);
+            lcd.drawLine(a+1,q,a+5,q,0);
+            lcd.drawLine(a+5,q,a+6,q+1,0);
+            lcd.drawLine(a+3,q,a+3,q+4,0);
+            q=0;
+            a = rand() % 76;
+            }
+        //set the player can only use 3 bombs per game using joystick button.
+        if(buttonjoystick && buttonjoystickpress < 3) {
             ++buttonjoystickpress;
             hit = true;
             lcd.drawLine(a,q+1,a+1,q,0);
@@ -228,46 +436,425 @@
             lcd.drawLine(a+3,q,a+3,q+4,0);
             q=0;
             a = rand() % 76;
+            score += 300;// player get 300 score after using the bomb.
+            
+            // destroy all enemy and keep the wall and the play's unit on the screen.
             for (int r = 5; r < 100; r+=8) {
-                lcd.drawCircle(z,45,r,0);
-                if(r < 100){
-                    lcd.drawCircle(z,45,r-7,2);
+                lcd.drawCircle(x,45,r,0);
+                if(r < 100) {
+                    lcd.drawCircle(x,45,r-8,2);/// the action of the bomb.
+                    //draw the player's unit again
                     lcd.drawLine(x,40,x,47,1);
                     lcd.drawLine(x-4,42,x+4,42,1);
                     lcd.drawLine(x-1,43,x+1,43,1);
                     lcd.drawLine(x-1,47,x+1,47,1);
+                    //draw the wall again
+                    lcd.drawRect(0,rect,width,5,1);
+                    lcd.drawRect(width2,rect1,83-width2,5,1);
                 }
                 lcd.refresh();
                 wait(0.1);
-                
-                }
+
             }
-        if(z == a && q+1 == y){
-            hit = true;
-            lcd.drawLine(a,q+1,a+1,q,0);
-            lcd.drawLine(a+1,q,a+5,q,0);
-            lcd.drawLine(a+5,q,a+6,q+1,0);
-            lcd.drawLine(a+3,q,a+3,q+4,0);
-            q=0;
-            a = rand() % 76;
-            }
+        }
         
-        }
+        //detect Game Over if the wall or the enemy hit the player.
 
-        if(a == x-4 && q+1 == 42){
+        if(a == x-4 && q+1 == 42) {
+            lcd.clear();/// clear the screen first.
+            // print out the game over information.
+            lcd.printString ("Game Over",18,1);
+            lcd.printString ("Viking",24,2);
+            lcd.printString ("Destroyed",18,3);
+            lcd.refresh();
+            wait(2.0);
+            // after 2 sec show score on the screen.
+            lcd.clear();
+            char buffer[14];/// put the score which have calculated into the array.
+            int length = sprintf(buffer,"Score: %d",score);
+            if (length <= 14)
+            lcd.printString(buffer,0,1);/// print out the score.
+            lcd.refresh();
+            break;
+        }
+        // the code below also dectect if the player hit the wall or enemy than jump into 'game over' condition.
+        if(a+1 == x-4 && q ==42) {
+            lcd.clear();
+            lcd.printString ("Game Over",18,1);
+            lcd.printString ("Viking",24,2);
+            lcd.printString ("Destroyed",18,3);
+            lcd.refresh();
+            wait(2.0);
+            lcd.clear();
+            char buffer[14];
+            int length = sprintf(buffer,"Score: %d",score);
+            if (length <= 14)
+            lcd.printString(buffer,0,1);
+            lcd.refresh();
+            break;
+        }
+        if(a+2 == x-4 && q == 42) {
+            lcd.clear();
+            lcd.printString ("Game Over",18,1);
+            lcd.printString ("Viking",24,2);
+            lcd.printString ("Destroyed",18,3);
+            lcd.refresh();
+            wait(2.0);
+            lcd.clear();
+            char buffer[14];
+            int length = sprintf(buffer,"Score: %d",score);
+            if (length <= 14)
+            lcd.printString(buffer,0,1);
+            lcd.refresh();
+            break;
+        }
+        if(a+3 == x-4 && q+4 ==42) {
+            lcd.clear();
+            lcd.printString ("Game Over",18,1);
+            lcd.printString ("Viking",24,2);
+            lcd.printString ("Destroyed",18,3);
+            lcd.refresh();
+            wait(2.0);
+            lcd.clear();
+            char buffer[14];
+            int length = sprintf(buffer,"Score: %d",score);
+            if (length <= 14)
+            lcd.printString(buffer,0,1);
+            lcd.refresh();
+            break;
+        }
+        if(a+4 == x-4 && q ==42) {
+            lcd.clear();
+            lcd.printString ("Game Over",18,1);
+            lcd.printString ("Viking",24,2);
+            lcd.printString ("Destroyed",18,3);
+            lcd.refresh();
+            wait(2.0);
+            lcd.clear();
+            char buffer[14];
+            int length = sprintf(buffer,"Score: %d",score);
+            if (length <= 14)
+            lcd.printString(buffer,0,1);
+            lcd.refresh();
+            break;
+        }
+        if(a+5 == x-4 && q ==42) {
+            lcd.clear();
+            lcd.printString ("Game Over",18,1);
+            lcd.printString ("Viking",24,2);
+            lcd.printString ("Destroyed",18,3);
+            lcd.refresh();
+            wait(2.0);
+            lcd.clear();
+            char buffer[14];
+            int length = sprintf(buffer,"Score: %d",score);
+            if (length <= 14)
+            lcd.printString(buffer,0,1);
+            lcd.refresh();
+            break;
+        }
+        if(a+6 == x-4 && q+1 ==42) {
+            lcd.clear();
+            lcd.printString ("Game Over",18,1);
+            lcd.printString ("Viking",24,2);
+            lcd.printString ("Destroyed",18,3);
+            lcd.refresh();
+            wait(2.0);
+            lcd.clear();
+            char buffer[14];
+            int length = sprintf(buffer,"Score: %d",score);
+            if (length <= 14)
+            lcd.printString(buffer,0,1);
+            lcd.refresh();
+            break;
+        }
+        if(a+3 == x-4 && q == 42) {
+            lcd.clear();
+            lcd.printString ("Game Over",18,1);
+            lcd.printString ("Viking",24,2);
+            lcd.printString ("Destroyed",18,3);
+            lcd.refresh();
+            wait(2.0);
+            lcd.clear();
+            char buffer[14];
+            int length = sprintf(buffer,"Score: %d",score);
+            if (length <= 14)
+            lcd.printString(buffer,0,1);
+            lcd.refresh();
+            break;
+        }
+        if(a+3 == x-3 && q ==42) {
+            lcd.clear();
+            lcd.printString ("Game Over",18,1);
+            lcd.printString ("Viking",24,2);
+            lcd.printString ("Destroyed",18,3);
+            lcd.refresh();
+            wait(2.0);
+            lcd.clear();
+            char buffer[14];
+            int length = sprintf(buffer,"Score: %d",score);
+            if (length <= 14)
+            lcd.printString(buffer,0,1);
+            lcd.refresh();
+            break;
+        }
+        if(a+3 == x-2 && q == 42) {
+            lcd.clear();
+            lcd.printString ("Game Over",18,1);
+            lcd.printString ("Viking",24,2);
+            lcd.printString ("Destroyed",18,3);
+            lcd.refresh();
+            wait(2.0);
+            lcd.clear();
+            char buffer[14];
+            int length = sprintf(buffer,"Score: %d",score);
+            if (length <= 14)
+            lcd.printString(buffer,0,1);
+            lcd.refresh();
+            break;
+        }
+        if(a+3 == x-1 && q ==42) {
+            lcd.clear();
+            lcd.printString ("Game Over",18,1);
+            lcd.printString ("Viking",24,2);
+            lcd.printString ("Destroyed",18,3);
+            lcd.refresh();
+            wait(2.0);
+            lcd.clear();
+            char buffer[14];
+            int length = sprintf(buffer,"Score: %d",score);
+            if (length <= 14)
+            lcd.printString(buffer,0,1);
+            lcd.refresh();
+            break;
+        }
+        if(a+3 == x && q == 40) {
             lcd.clear();
             lcd.printString ("Game Over",18,1);
             lcd.printString ("Viking",24,2);
             lcd.printString ("Destroyed",18,3);
             lcd.refresh();
+            wait(2.0);
+            lcd.clear();
+            char buffer[14];
+            int length = sprintf(buffer,"Score: %d",score);
+            if (length <= 14)
+            lcd.printString(buffer,0,1);
+            lcd.refresh();
+            break;
+        }
+        if(a+3 == x+1 && q ==42) {
+            lcd.clear();
+            lcd.printString ("Game Over",18,1);
+            lcd.printString ("Viking",24,2);
+            lcd.printString ("Destroyed",18,3);
+            lcd.refresh();
+            wait(2.0);
+            lcd.clear();
+            char buffer[14];
+            int length = sprintf(buffer,"Score: %d",score);
+            if (length <= 14)
+            lcd.printString(buffer,0,1);
+            lcd.refresh();
+            break;
+        }
+        if(a+3 == x+2 && q == 42) {
+            lcd.clear();
+            lcd.printString ("Game Over",18,1);
+            lcd.printString ("Viking",24,2);
+            lcd.printString ("Destroyed",18,3);
+            lcd.refresh();
+            wait(2.0);
+            lcd.clear();
+            char buffer[14];
+            int length = sprintf(buffer,"Score: %d",score);
+            if (length <= 14)
+            lcd.printString(buffer,0,1);
+            lcd.refresh();
+            break;
+        }
+        if(a+3 == x+3 && q ==42) {
+            lcd.clear();
+            lcd.printString ("Game Over",18,1);
+            lcd.printString ("Viking",24,2);
+            lcd.printString ("Destroyed",18,3);
+            lcd.refresh();
+            wait(2.0);
+            lcd.clear();
+             char buffer[14];
+            int length = sprintf(buffer,"Score: %d",score);
+            if (length <= 14)
+            lcd.printString(buffer,0,1);
+            lcd.refresh();
+            break;
+        }
+        if(a+3 == x+4 && q ==42) {
+            lcd.clear();
+            lcd.printString ("Game Over",18,1);
+            lcd.printString ("Viking",24,2);
+            lcd.printString ("Destroyed",18,3);
+            lcd.refresh();
+            wait(2.0);
+            lcd.clear();
+             char buffer[14];
+            int length = sprintf(buffer,"Score: %d",score);
+            if (length <= 14)
+            lcd.printString(buffer,0,1);
+            lcd.refresh();
+            break;
+        }
+        if(a == x+4 && q+1 == 42) {
+            lcd.clear();
+            lcd.printString ("Game Over",18,1);
+            lcd.printString ("Viking",24,2);
+            lcd.printString ("Destroyed",18,3);
+            lcd.refresh();
+            wait(2.0);
+            lcd.clear();
+            char buffer[14];
+            int length = sprintf(buffer,"Score: %d",score);
+            if (length <= 14)
+            lcd.printString(buffer,0,1);
+            lcd.refresh();
+            break;
+        }
+        if(a+1 == x+4 && q ==42) {
+            lcd.clear();
+            lcd.printString ("Game Over",18,1);
+            lcd.printString ("Viking",24,2);
+            lcd.printString ("Destroyed",18,3);
+            lcd.refresh();
+            wait(2.0);
+            lcd.clear();
+            char buffer[14];
+            int length = sprintf(buffer,"Score: %d",score);
+            if (length <= 14)
+            lcd.printString(buffer,0,1);
+            lcd.refresh();
+            break;
+        }
+        if(a+2 == x+4 && q == 42) {
+            lcd.clear();
+            lcd.printString ("Game Over",18,1);
+            lcd.printString ("Viking",24,2);
+            lcd.printString ("Destroyed",18,3);
+            lcd.refresh();
+            wait(2.0);
+            lcd.clear();
+            char buffer[14];
+            int length = sprintf(buffer,"Score: %d",score);
+            if (length <= 14)
+            lcd.printString(buffer,0,1);
+            lcd.refresh();
+            break;
+        }
+        if(a+3 == x+4 && q+4 ==42) {
+            lcd.clear();
+            lcd.printString ("Game Over",18,1);
+            lcd.printString ("Viking",24,2);
+            lcd.printString ("Destroyed",18,3);
+            lcd.refresh();
+            wait(2.0);
+            lcd.clear();
+            char buffer[14];
+            int length = sprintf(buffer,"Score: %d",score);
+            if (length <= 14)
+            lcd.printString(buffer,0,1);
+            lcd.refresh();
+            break;
+        }
+        if(a+4 == x+4 && q ==42) {
+            lcd.clear();
+            lcd.printString ("Game Over",18,1);
+            lcd.printString ("Viking",24,2);
+            lcd.printString ("Destroyed",18,3);
+            lcd.refresh();
+            wait(2.0);
+            lcd.clear();
+            char buffer[14];
+            int length = sprintf(buffer,"Score: %d",score);
+            if (length <= 14)
+            lcd.printString(buffer,0,1);
+            lcd.refresh();
+            break;
+        }
+        if(a+5 == x+4 && q ==42) {
+            lcd.clear();
+            lcd.printString ("Game Over",18,1);
+            lcd.printString ("Viking",24,2);
+            lcd.printString ("Destroyed",18,3);
+            lcd.refresh();
+            wait(2.0);
+            lcd.clear();
+            char buffer[14];
+            int length = sprintf(buffer,"Score: %d",score);
+            if (length <= 14)
+            lcd.printString(buffer,0,1);
+            lcd.refresh();
+            break;
+        }
+        if(a+6 == x+4 && q+1 ==42) {
+            lcd.clear();
+            lcd.printString ("Game Over",18,1);
+            lcd.printString ("Viking",24,2);
+            lcd.printString ("Destroyed",18,3);
+            lcd.refresh();
+            wait(2.0);
+            lcd.clear();
+            char buffer[14];
+            int length = sprintf(buffer,"Score: %d",score);
+            if (length <= 14)
+            lcd.printString(buffer,0,1);
+            lcd.refresh();
+            break;
+        }
+        
+        //dectect if the player hit the left hand side wall.
+        if(width+9 > x+4 && rect+5 >= 40){
+            lcd.clear();
+            lcd.printString ("Game Over",18,1);
+            lcd.printString ("Viking",24,2);
+            lcd.printString ("Destroyed",18,3);
+            lcd.refresh();
+            wait(2.0);
+            lcd.clear();
+            char buffer[14];
+            int length = sprintf(buffer,"Score: %d",score);
+            if (length <= 14)
+            lcd.printString(buffer,0,1);
+            lcd.refresh();
+            break;
+            }
+        //dectect if the player hit the right hand side wall.
+        if(x+4 >= width2 && rect1+5 >= 40){
+            lcd.clear();
+            lcd.printString ("Game Over",18,1);
+            lcd.printString ("Viking",24,2);
+            lcd.printString ("Destroyed",18,3);
+            lcd.refresh();
+            wait(2.0);
+            lcd.clear();
+            char buffer[14];
+            int length = sprintf(buffer,"Score: %d",score);
+            if (length <= 14)
+            lcd.printString(buffer,0,1);
+            lcd.refresh();
+            break;
+            }
+        //detect victory. Whenever player's score is over 5000.
+        if (score >= 5000)
+        {
+            lcd.clear();
+            lcd.printString("Congratulation!",0,1);
+            lcd.printString("Mission",20,2);
+            lcd.printString("Complete!",18,3);
+            lcd.refresh();
             break;
             }
 
-
     }
 }
 
-
 void calibrateJoystick()
 {
     button.mode(PullDown);
@@ -302,60 +889,67 @@
     // set flag for printing
     printFlag = 1;
 }
+// code below is just used to testing.
 void createbullet()
 {
-            int z = 41;
-            if (joystick.direction == UP && z > 4){
-                --z;
-                }
-            if (joystick.direction == UP && z > 78){
-                ++z;
-                }
-            if(button){
-               
-                for (int y = 39; y > -5 ; y-=7) {
-                
-                lcd.drawLine(z,y,z,y-2,1);
-                if(y<39) {
-                        lcd.drawLine(z,y+7,z,y-2+7,0);
-                }
-                lcd.refresh();
-                
-                
+    int z = 41;
+    if (joystick.direction == UP && z > 4) {
+        --z;
+    }
+    if (joystick.direction == UP && z > 78) {
+        ++z;
+    }
+    if(button) {
+
+        for (int y = 39; y > -5 ; y-=7) {
+
+            lcd.drawLine(z,y,z,y-2,1);
+            if(y<39) {
+                lcd.drawLine(z,y+7,z,y-2+7,0);
+            }
+            lcd.refresh();
+
+
         }
-        }
-        bulletFlag = 1;
-        
+    }
+    bulletFlag = 1;
+
 }
+// code below is just used to testing.
 void createenermy()
 {
-        int a;
-        int b;
-        a = rand() % 76;
-        b = rand() % 76;
-        for (int q=0 ;q < 52; q+=2){
+    int a;
+    int b;
+    a = rand() % 76;
+    b = rand() % 76;
+    for (int q=0 ; q < 52; q+=2) {
         lcd.drawLine(a,q+1,a+1,q,1);
         lcd.drawLine(a+1,q,a+5,q,1);
         lcd.drawLine(a+5,q,a+6,q+1,1);
         lcd.drawLine(a+3,q,a+3,q+4,1);
-        
-        
+
+
         lcd.drawLine(a+b,q+1,a+1+b,q,1);
         lcd.drawLine(a+1+b,q,a+5+b,q,1);
         lcd.drawLine(a+5+b,q,a+6+b,q+1,1);
         lcd.drawLine(a+3+b,q,a+3+b,q+4,1);
-        if (q < 52){
-                lcd.drawLine(a,q+1-2,a+1,q-2,0);
-                lcd.drawLine(a+1,q-2,a+5,q-2,0);
-                lcd.drawLine(a+5,q-2,a+6,q+1-2,0);
-                lcd.drawLine(a+3,q-2,a+3,q+4-2,0);
-                
-                lcd.drawLine(a+b,q+1-2,a+1+b,q-2,0);
-                lcd.drawLine(a+1+b,q-2,a+5+b,q-2,0);
-                lcd.drawLine(a+5+b,q-2,a+6+b,q+1-2,0);
-                lcd.drawLine(a+3+b,q-2,a+3+b,q+4-2,0);
-                }
+        if (q < 52) {
+            lcd.drawLine(a,q+1-2,a+1,q-2,0);
+            lcd.drawLine(a+1,q-2,a+5,q-2,0);
+            lcd.drawLine(a+5,q-2,a+6,q+1-2,0);
+            lcd.drawLine(a+3,q-2,a+3,q+4-2,0);
+
+            lcd.drawLine(a+b,q+1-2,a+1+b,q-2,0);
+            lcd.drawLine(a+1+b,q-2,a+5+b,q-2,0);
+            lcd.drawLine(a+5+b,q-2,a+6+b,q+1-2,0);
+            lcd.drawLine(a+3+b,q-2,a+3+b,q+4-2,0);
+        }
     }
     enermyFlag = 1;
-    
+
 }
+// set g_button_flag equals to 1 and return to button_isr().
+void button_isr()
+{
+    g_button_flag =1;
+}
\ No newline at end of file