ELEC2645 (2018/19) / Mbed 2 deprecated el18jz_

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers Move.cpp Source File

Move.cpp

00001 #include "Move.h"
00002 
00003 
00004 SnakeBody body;
00005 Food food;
00006 
00007 Move::Move() {
00008     
00009 }
00010 
00011 Move::~Move() {
00012     
00013 }
00014 
00015 void Move::initial() {
00016     _x = 42;
00017     _y = 24;
00018     _length = 5;
00019     body._dir = 1;// 1 for E, 2 for S, 3 for W, 4 for N
00020     for (int i =0; i < _length ; i++){
00021             body._xx[i]= _x - 8 + 2 * i;
00022             body._yy[i]= _y ;
00023         }
00024   
00025             food.a= 0;
00026             food.b= 0;
00027   
00028         
00029     }
00030 
00031 void Move::getfood(){
00032     srand(time(NULL));
00033     food.a = rand() % 40 +1;
00034     food.b = rand() % 22 +1;
00035     }
00036 
00037 void Move::updatebody() {
00038         
00039     //if (_d != CENTRE){
00040         for (int i =0; i < _length - 1; i++){
00041             body._xx[i] = body._xx[i + 1];
00042             body._yy[i] = body._yy[i + 1];
00043             }
00044         body._xx[_length - 1] = _x;
00045         body._yy[_length - 1] = _y;
00046     //}
00047 }
00048 void Move::onlcd(N5110 &lcd) {
00049         
00050        for (int i =0; i < _length; i++){
00051        lcd.drawRect(body._xx[i],body._yy[i],2,2,FILL_BLACK); 
00052             
00053        }
00054        lcd.drawRect(0,0,84,48,FILL_TRANSPARENT);
00055        lcd.drawRect(1,1,82,46,FILL_TRANSPARENT);  
00056        lcd.drawRect(2*food.a, 2*food.b,2,2,FILL_BLACK);
00057 }
00058 
00059 // This function control the dirction and the movement
00060 void Move::update(Gamepad &pad) {
00061     _d = pad.get_direction();
00062     
00063     if (_d == N && body._dir != 2) {
00064         body._dir = 4;
00065         //_y-= 2;
00066     } else if (_d == S && body._dir != 4) {
00067         body._dir = 2;
00068         //_y+= 2;
00069     } else if (_d == E && body._dir != 3) {
00070         body._dir = 1;
00071         //_x+= 2;
00072     } else if (_d == W && body._dir != 1) {
00073         body._dir = 3;
00074         //_x-= 2;
00075     }
00076     
00077     if (body._dir == 4){
00078         _y-= 2; 
00079     }else if (body._dir == 2) {
00080         _y+= 2;
00081     } else if (body._dir == 1) {
00082         _x+= 2;
00083     } else if (body._dir == 3) {
00084         _x-= 2;
00085     }
00086 }
00087 
00088 void Move::die(N5110 &lcd , Gamepad &pad) {
00089     if(body._xx[_length - 1] == 0 || body._xx[_length - 1] == 82 ||  body._yy[_length - 1] == 0 || body._yy[_length - 1] == 46) {
00090         lcd.init();
00091             lcd.printString("Game Over",0,1);
00092             char buffer1[14];
00093             sprintf(buffer1,"Your score:%2d",_length - 5);//As snake length will increase the same as score if one food 
00094             lcd.printString(buffer1,0,2);                 //for 1 score, so i simpley use length to repersant score.
00095             lcd.printString("Press Start", 0 , 3);
00096             lcd.printString("to restart", 0 , 4);
00097         lcd.refresh();
00098         while ( pad.check_event(Gamepad::START_PRESSED) == false){
00099         pad.leds_on();
00100         wait(0.5);
00101         pad.leds_off();
00102         wait(0.5);
00103         }
00104         initial();
00105         getfood();
00106         menu.menus(lcd,pad);
00107         }
00108         
00109         for (int i =0; i < _length - 2; i++) {
00110             if (body._xx[_length - 1] == body._xx[i] && body._yy[_length - 1] == body._yy[i])
00111             {
00112             lcd.init();
00113             lcd.printString("Game Over",0,1);
00114             char buffer1[14];
00115             sprintf(buffer1,"Your score:%2d",_length - 5);
00116             lcd.printString(buffer1,0,2); 
00117             lcd.printString("Press Start", 0 , 3);
00118             lcd.printString("to restart", 0 , 4);
00119             lcd.refresh();
00120                 while ( pad.check_event(Gamepad::START_PRESSED) == false){
00121                 pad.leds_on();
00122                 wait(0.5);
00123                 pad.leds_off();
00124                 wait(0.5);
00125                 }
00126             initial();
00127             getfood();
00128             menu.menus(lcd,pad);
00129             }
00130         }
00131     }
00132     
00133 void Move::eatfood() {
00134     
00135         if (body._xx[_length - 1] == 2 * food.a && body._yy[_length - 1] == 2 * food.b){
00136             _length = _length + 1;
00137             body._xx[_length - 1] = 2 * food.a;
00138             body._yy[_length - 1] = 2 * food.b;
00139             getfood();
00140             }
00141     }