Final Submission. I have read and agreed with Statement of Academic Integrity.

Dependencies:   mbed Gamepad FLAPPY_BIRD

Revision:
0:bfd3317d7773
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Bird/Bird.cpp	Sun May 05 14:57:07 2019 +0000
@@ -0,0 +1,516 @@
+
+#include "Bird.h"
+
+// parameter
+int _vb = 1; 
+
+// initialise the parameter
+void Bird::init(){
+_birdy = 1;
+_x1 = 45; // 21 space interval
+_x2 = 66;
+_x3 = 88;
+_x4 = 109;
+_y1 =rand()%18+2;
+_y2 =rand()%18+2; 
+_y3 =rand()%18+2; 
+_y4 =rand()%18+2;
+_score = 0;  
+}
+
+// welcome screen - FLAPPY BRID
+void Bird::welcome(N5110 &lcd)
+{
+
+//    // F 2*6+7*2+2*5+9*2
+    int F[20][6] = {
+    { 1,1,1,1,1,1 },
+    { 1,1,1,1,1,1 },
+    { 1,1,0,0,0,0 },
+    { 1,1,0,0,0,0 },
+    { 1,1,0,0,0,0 },
+    { 1,1,0,0,0,0 },
+    { 1,1,0,0,0,0 },
+    { 1,1,0,0,0,0 },
+    { 1,1,0,0,0,0 },   
+    { 1,1,1,1,1,0 },
+    { 1,1,1,1,1,0 },
+    { 1,1,0,0,0,0 },
+    { 1,1,0,0,0,0 },
+    { 1,1,0,0,0,0 },
+    { 1,1,0,0,0,0 },
+    { 1,1,0,0,0,0 },
+    { 1,1,0,0,0,0 },
+    { 1,1,0,0,0,0 },
+    { 1,1,0,0,0,0 },
+    { 1,1,0,0,0,0 },
+
+   
+};
+
+    // L 18*2+2*6
+   int L[20][6] = {
+    { 1,1,0,0,0,0 },
+    { 1,1,0,0,0,0 },
+    { 1,1,0,0,0,0 },
+    { 1,1,0,0,0,0 },
+    { 1,1,0,0,0,0 },
+    { 1,1,0,0,0,0 },
+    { 1,1,0,0,0,0 },
+    { 1,1,0,0,0,0 },
+    { 1,1,0,0,0,0 },
+    { 1,1,0,0,0,0 },
+    { 1,1,0,0,0,0 },
+    { 1,1,0,0,0,0 },
+    { 1,1,0,0,0,0 },
+    { 1,1,0,0,0,0 },
+    { 1,1,0,0,0,0 },
+    { 1,1,0,0,0,0 },
+    { 1,1,0,0,0,0 },
+    { 1,1,0,0,0,0 },
+    { 1,1,1,1,1,1 },
+    { 1,1,1,1,1,1 },
+};
+
+    // A 2*6+7*4+2*6+9*4
+    int A[20][6] = {
+    { 1,1,1,1,1,1 },
+    { 1,1,1,1,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,1,1,1,1 },
+    { 1,1,1,1,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+};
+
+    // P 2*6+7*4+2*6+9*2
+    int P[20][6] = {
+    { 1,1,1,1,1,1 },
+    { 1,1,1,1,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },   
+    { 1,1,1,1,1,1 },
+    { 1,1,1,1,1,1 },
+    { 1,1,0,0,0,0 },
+    { 1,1,0,0,0,0 },
+    { 1,1,0,0,0,0 },
+    { 1,1,0,0,0,0 },
+    { 1,1,0,0,0,0 },
+    { 1,1,0,0,0,0 },
+    { 1,1,0,0,0,0 },
+    { 1,1,0,0,0,0 },
+    { 1,1,0,0,0,0 },
+};
+
+    // Y 11*4+9*2
+    int Y[20][6] = {
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 0,0,1,1,0,0 },
+    { 0,0,1,1,0,0 },
+    { 0,0,1,1,0,0 },
+    { 0,0,1,1,0,0 },
+    { 0,0,1,1,0,0 },
+    { 0,0,1,1,0,0 },
+    { 0,0,1,1,0,0 },
+    { 0,0,1,1,0,0 },
+    { 0,0,1,1,0,0 },
+};
+
+    // B 1*4+1*5+1*5+ 5*4+1*5+2*5+1*5+5*4+1*5+1*5+1*4
+    int B[20][6] = {
+    { 1,1,1,1,0,0 },  
+    { 1,1,1,1,1,0 },
+    { 1,1,0,1,1,1 },  
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,1,1,1 },
+    { 1,1,1,1,1,0 },
+    { 1,1,1,1,1,0 },
+    { 1,1,0,1,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,1,1,1 },  
+    { 1,1,1,1,1,0 },
+    { 1,1,1,1,0,0 }, 
+};
+
+    // I 20*2
+    int I[20][2] = {
+    { 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,1 },
+    { 1,1 },
+    { 1,1 },
+    { 1,1 },
+    { 1,1 },
+    { 1,1 },
+    { 1,1 },
+    { 1,1 },    
+};
+
+    // R 2*6+7*4+2*6+1*4+1*5+1*5+6*4
+    int R[20][6] = {
+    { 1,1,1,1,1,1 },
+    { 1,1,1,1,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },   
+    { 1,1,1,1,1,1 },
+    { 1,1,1,1,1,1 },
+    { 1,1,1,1,0,0 },
+    { 1,1,1,1,1,0 },
+    { 1,1,0,1,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },       
+};
+
+    // D 1*4+1*5+1*5+14*4+1*5+1*5+1*4
+    int D[20][6] = {
+    { 1,1,1,1,0,0 },  
+    { 1,1,1,1,1,0 },
+    { 1,1,0,1,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,0,1,1 },
+    { 1,1,0,1,1,1 },  
+    { 1,1,1,1,1,0 },
+    { 1,1,1,1,0,0 },       
+};
+
+//    // drawSprite(x_origin,y_origin,x_rows,y_coloums,sprite)
+         lcd.drawSprite(4,2,20,6,(int *)F);
+         lcd.drawSprite(12,2,20,6,(int *)L);
+         lcd.drawSprite(20,2,20,6,(int *)A);
+         lcd.drawSprite(28,2,20,6,(int *)P);
+         lcd.drawSprite(36,2,20,6,(int *)P);
+         lcd.drawSprite(44,2,20,6,(int *)Y);
+         lcd.drawSprite(55,2,20,6,(int *)B);
+         lcd.drawSprite(63,2,20,2,(int *)I);
+         lcd.drawSprite(67,2,20,6,(int *)R);
+         lcd.drawSprite(75,2,20,6,(int *)D);
+    // draw a rectangular around the title
+         lcd.drawRect(0,0,WIDTH,24,FILL_TRANSPARENT);
+         lcd.printString("  Press Start ",0,4);
+         lcd.printString("    To Play   ",0,5);
+    
+}
+
+// choosing difficulty
+void Bird::mode(N5110 &lcd, Gamepad &pad)
+{
+    lcd.clear();
+    lcd.printString("Difficulty  !",5,0);
+    lcd.printString("Joy to tune,",0,1);
+    lcd.printString("A to select. ",0,2);
+    lcd.printString("Slow",30,3);
+    lcd.printString("Medium",29,4);
+    lcd.printString("Fast",30,5);
+    int select[5][6] = {
+    { 1,1,1,1,0,0 },
+    { 1,1,0,0,1,0 },
+    { 1,1,0,0,0,1 },
+    { 1,1,0,0,1,0 },
+    { 1,1,1,1,0,0 },    
+    };
+    Direction  d  = pad.get_direction();
+    if (d == S){
+       _vb = _vb+1; 
+    }
+    else if (d == N) {
+       _vb = _vb-1; 
+    }
+    if (_vb > 3) {
+    _vb = 1;    
+    }
+    if (_vb < 1){
+    _vb = 3;    
+    }
+    lcd.drawSprite(20,_vb*8+17,5,6,(int *)select);
+    lcd.refresh();
+    wait(0.3);
+}
+
+// display score
+void Bird::score(N5110 &lcd){
+    if(_x1+4 > 14-_vb && _x1+4 < 15){
+    _score = _score +1;    
+    }
+    if(_x2+4 > 14-_vb && _x2+4 < 15){
+    _score = _score +1;    
+    }
+    if(_x3+4 > 14-_vb && _x3+4 < 15){
+    _score = _score +1;    
+    }
+    if(_x4+4 > 14-_vb && _x4+4 < 15){
+    _score = _score +1;    
+    }
+    char buffer1[14];
+    sprintf(buffer1,"%2d",_score);
+    lcd.printString(buffer1,0,1);
+       
+}
+
+// pause display
+void Bird::pause(N5110 &lcd, Gamepad &pad){
+    if ( pad.check_event(Gamepad::BACK_PRESSED) ){
+        while ( pad.check_event(Gamepad::BACK_PRESSED) == false ){
+        lcd.clear();
+        lcd.printString("PAUSE",25,3); 
+        lcd.refresh();   
+        }
+        lcd.clear();
+        lcd.printString("GO !",30,4);
+        lcd.refresh();
+        wait(1.0);    
+    }
+}
+
+// first figure
+void Bird::stru(N5110 &lcd){
+    
+    lcd.drawRect(0,0,WIDTH,HEIGHT-3,FILL_TRANSPARENT);   
+    lcd.drawRect(0,45,WIDTH,3,FILL_BLACK);
+    for (int i=0; i<17; i++){
+    lcd.setPixel(0,i,false);    
+    lcd.setPixel(13,i,true);
+    }
+    for (int i=0; i<14; i++){
+    lcd.setPixel(i,0,false);
+    lcd.setPixel(i,17,true);
+    lcd.setPixel(13,0,true);   
+    }    
+}
+
+// Ready screen
+void Bird::ready(N5110 &lcd){ 
+    char buffer[14];
+    int number3 = 3;
+    int number2 = 2;
+    int number1 = 1;
+    lcd.clear();
+    stru(lcd);
+    sprintf(buffer,"%1d",number3);
+    lcd.printString(buffer,40,4);
+    lcd.refresh();
+    wait(1.0);
+    lcd.clear();
+    stru(lcd);
+    sprintf(buffer,"%1d",number2);
+    lcd.printString(buffer,40,4);
+    lcd.refresh();
+    wait(1.0);
+    lcd.clear();
+    stru(lcd);
+    sprintf(buffer,"%1d",number1);
+    lcd.printString(buffer,40,4);
+    lcd.refresh();
+    wait(1.0);
+    lcd.clear();
+    stru(lcd);
+    lcd.printString("GO !",30,4);
+    lcd.refresh();
+    wait(0.5);
+    
+    
+    
+}
+
+// Game play
+void Bird::barrier(N5110 &lcd){
+     stru(lcd);
+     check();
+    // 1-th barrier
+    lcd.drawRect(_x1,1,4,_y1,FILL_BLACK); 
+    lcd.drawRect(_x1-1,_y1+1,6,2,FILL_BLACK);  // 20 pixel interval between upper
+    lcd.drawRect(_x1-1,_y1+20,6,2,FILL_BLACK); // and lower side
+    lcd.drawRect(_x1,_y1+22,4,22-_y1,FILL_BLACK);
+    _x1 = _x1 - _vb;
+    // 2-th barrier
+    lcd.drawRect(_x2,1,4,_y2,FILL_BLACK); 
+    lcd.drawRect(_x2-1,_y2+1,6,2,FILL_BLACK);  // 20 pixel interval between upper
+    lcd.drawRect(_x2-1,_y2+20,6,2,FILL_BLACK); // and lower side
+    lcd.drawRect(_x2,_y2+22,4,22-_y2,FILL_BLACK);
+    _x2 = _x2 - _vb; 
+    // 3-th barrier
+    lcd.drawRect(_x3,1,4,_y3,FILL_BLACK); 
+    lcd.drawRect(_x3-1,_y3+1,6,2,FILL_BLACK);  // 20 pixel interval between upper
+    lcd.drawRect(_x3-1,_y3+20,6,2,FILL_BLACK); // and lower side
+    lcd.drawRect(_x3,_y3+22,4,22-_y3,FILL_BLACK);
+    _x3 = _x3 - _vb; 
+    // 4-th barrier
+    lcd.drawRect(_x4,1,4,_y4,FILL_BLACK); 
+    lcd.drawRect(_x4-1,_y4+1,6,2,FILL_BLACK);  // 20 pixel interval between upper
+    lcd.drawRect(_x4-1,_y4+20,6,2,FILL_BLACK); // and lower side
+    lcd.drawRect(_x4,_y4+22,4,22-_y4,FILL_BLACK);
+    _x4 = _x4 - _vb;
+
+    
+}
+
+// bird flyup
+void Bird::flyup(N5110 &lcd){
+    int bird[3][6] = {
+    { 0,1,1,0,0,0 },
+    { 1,1,1,1,0,0 },
+    { 1,1,1,1,1,1 },           
+    };
+    _birdy = _birdy - 2;
+    _birdh = _birdy*3+9;
+    lcd.drawSprite(15,_birdh,3,6,(int *)bird);
+}
+
+// bird fly down
+void Bird::flydown(N5110 &lcd){
+    int bird[3][6] = {
+    { 1,1,1,1,1,1 },
+    { 1,1,1,1,0,0 },
+    { 0,1,1,0,0,0 },           
+    };
+    _birdy = _birdy + 1;
+    _birdh = _birdy*3+10;
+    lcd.drawSprite(15,_birdh,3,6,(int *)bird);
+}
+
+// check if x is smaller than 0
+void Bird::check(){
+    if(_x1 < -2){
+    _x1 = 85;
+    _y1 = rand()%18+2;       
+    }
+    if(_x2 < -2){
+    _x2 = 85;
+    _y2 = rand()%18+2;       
+    }
+    if(_x3 < -2){
+    _x3 = 85;
+    _y3 = rand()%18+2;      
+    }
+    if(_x4 < -2){
+    _x4 = 85;
+    _y4 = rand()%18+2;   
+    }
+}
+
+// display failure screen if fail
+void Bird::fail(N5110 &lcd, Gamepad &pad){
+    if (coll()){
+       while ( pad.check_event(Gamepad::START_PRESSED ) == false ){
+       lcd.clear();
+       lcd.printString(" You've lost ! ",0,0);
+       char buffer[14];
+       sprintf(buffer,"You scored: %d", _score);
+       lcd.printString(buffer, 0,1);
+       lcd.printString(" BACK: Author",0,3);
+       lcd.printString(" Press Start",0,4);
+       lcd.printString("to play again",0,5);
+       lcd.refresh();
+           if ( pad.check_event(Gamepad::BACK_PRESSED )){
+                while ( pad.check_event(Gamepad::BACK_PRESSED ) == false ){
+                lcd.clear();
+                lcd.printString(" Author: ",0,1);
+                lcd.printString(" Yang Junyao",10,2);
+                lcd.printString(" ID: 201090191",0,4);
+                lcd.refresh();
+                }
+           }
+       }
+    lcd.init();
+    init();
+    pad.init();          
+    }
+}
+
+// return 1 if collided
+bool Bird::coll(){
+    if ( _x1 < 21 && _x1+4 > 14 ){
+       if( _y1+2 >= _birdh ||  _y1+20 <= _birdh+2 ){
+         return true;  
+        }
+       else {return false; }   
+    }
+    if ( _x2 < 21 && _x2+4 > 14 ){
+       if( _y2+2 >= _birdh ||  _y2+20 <= _birdh+2 ){
+         return true;  
+        }
+      else {return false; }   
+    }
+    if ( _x3 < 21 && _x3+4 > 14 ){
+       if( _y3+2 >= _birdh ||  _y3+20 <= _birdh+2 ){
+         return true;  
+        }
+       else {return false; }
+    }
+    if ( _x4 < 21 && _x4+4 > 14 ){
+       if( _y4+2 >= _birdh ||  _y4+20 <= _birdh+2 ){
+         return true;  
+        }
+       else {return false; }   
+    }
+    if ( _birdh < 2 || _birdh > 42 ){
+       return true; 
+    }
+    else { return false; }
+}
\ No newline at end of file