ELEC2645 (2018/19) / Mbed 2 deprecated el17szs

Dependencies:   mbed

Cricket/Cricket.cpp

Committer:
shahidsajid
Date:
2019-05-07
Revision:
28:d0b0a64a832d
Parent:
26:6427f09cf8d3
Child:
29:f7a2d2a755ec

File content as of revision 28:d0b0a64a832d:

#include "Cricket.h"


Cricket::Cricket()
{

}

Cricket::~Cricket()
{

}

void Cricket::init()
{
   ux.init();
   bat.init(4,5);
   ball.init(2,3);
   scoreboard.init();
   _new_round=1;
   _direction_set=0;
   _new_game=1;
   _fielders_count=0;
   _init_field_counter=0;
   init_positions();
   _set_hit=0;
   _set_loft=0;
   _position_no=-1;
   _check_bowled=0;
   _ball_limit=3;
   _check_hit=0;
   _loft_check=0;
   _check_update=-1;
}
void Cricket::round_reset(){
   ball.reset();
   bat.reset();
   _new_round=0;
   _direction_set=0;
   _fielders_count=0;
   _loft_check=0;
   _check_hit=0;
   _set_hit=0;
   ballHit=0;
   _set_loft=0;
   _init_field_counter=0;
   init_positions();
   _position_no=-1;
   _check_bowled=0;
   _check_update=-1;
}
void Cricket::game_reset(){
    //pad.leds_off();
    round_reset();
    _new_game=1;
    scoreboard.reset();
    ball.reset_ball_count();
}
void Cricket::intro(N5110 &lcd){
    ux.first_menu(lcd);
}
void Cricket::game(N5110 &lcd,Gamepad &pad){
     if (_new_game==1){
         printf("TEST 1\n");
         scoreboard.generate_target();
         ux.second_menu(lcd);
         _new_game=0;       
     }
     if (_new_round==1){  
        if (game_status(lcd)==false){
            game_reset();
            ux.second_menu(lcd);
        }
        else{
          check_ball_count(lcd);
          pad.leds_off();
          round_reset();
          set_field(lcd);
          ball.increment_ball_count();
          play_game(lcd,pad);
          _new_round=0;
        }
    }
    else
        play_game(lcd,pad);
}
bool Cricket::game_status(N5110 &lcd){
    if (scoreboard.compare_target()==true){
             printf("COMING FROM HERE");
             ux.victory_menu(lcd);
             game_reset();
             return false;
           //}
        }
        else if(check_ball_count(lcd)==true){
           ux.game_over_menu(lcd,1);
           game_reset();
           return false;
        }
        else{
            return true;
        }
}
    
bool Cricket::check_ball_count(N5110 &lcd){
    int count=ball.get_ball_count();
    if (count==_ball_limit){
        _new_round=1;
        ball.reset_ball_count();
        _new_game=1;
        return true;
    }
    else{
        return false;
    }
}
void Cricket::check_victory(N5110 &lcd){
    bool _victory_check=scoreboard.compare_target();
        if (_victory_check==true){
            ux.victory_menu(lcd);
            _new_game=1;
            ball.reset_ball_count();
        }
}
void Cricket::init_positions(){
    set_init_positions(42,15,N,1);
    set_init_positions(84,30,E,2);
    set_init_positions(0,30,W,3);
    set_init_positions(2,44,SW,4);
    set_init_positions(0,2,NW,5);
    set_init_positions(65,2,NE,6);
    set_init_positions(60,44,SE,7);
}

void Cricket::set_init_positions(int x,int y, Direction direction,int no){
    positions[_init_field_counter].x=x;
    positions[_init_field_counter].y=y;
    positions[_init_field_counter].dir=direction;
    positions[_init_field_counter].no=no;
    _init_field_counter++;
}
void Cricket::play_game(N5110 &lcd,Gamepad &pad){
    _check_hit=bat.get_hitBall(ux);
    if (_check_hit==1){
        _set_hit=1;
    }
    _loft_check=bat.get_loft_ball(ux);
    if (_loft_check==1){
        _set_loft=1;
    }
    Direction dir=pad.get_direction();
    if (_check_bowled!=1){
        _check_bowled=ball.ball_start(pad);
    }
    else{
        update_game(_set_hit, _set_loft, dir,pad,lcd);
    }
}
void Cricket::update_game(int checkHit,int loft_check, Direction dir,Gamepad &pad,N5110 &lcd){
  set_ball_direction(dir);
  int fielder_check=check_fielder(_ball_direction); 
  if (checkHit!=1)
      batsman_out(2,pad,lcd);
  if(_direction_set==1 && checkHit==1){
  if (fielder_check!=-1){
      _check_update=ball.update_ball(field[fielder_check].x,field[fielder_check].y);
     //printf("Location x %i y %i\n",field[fielder_check].x,field[fielder_check].y);
     if (loft_check==1){
         if (_check_update==1)
           batsman_out(3,pad,lcd);
     }
     else
         update_scoreboard(_check_update,field[fielder_check].position+1,pad);    
  }
  if (fielder_check==-1){
        _check_update=ball.update_ball(positions[_position_no].x,positions[_position_no].y);
        printf("location x %i y %i\n  update %i\n",positions[_position_no].x,positions[_position_no].y,_check_update);
        if (loft_check==1)
         update_scoreboard(_check_update,6,pad);
        else
            update_scoreboard(_check_update,4,pad);      
    }
}
} 
void Cricket::update_scoreboard(int checkUpdate, int runs,Gamepad &pad){
    if (checkUpdate==1){
        
        //Hitting the ball straight would be an easy way to score runs so i have restricted it to no runs     
        if (_ball_direction==N){
            scoreboard.update_score(0);
            pad.led(3,1.0);
            wait(0.5);
            _new_round=1;
        }
        else{
            scoreboard.update_score(runs);
            pad.led(3,1.0);
            wait(0.5);
            _new_round=1;
        }  
    }
    pad.leds_off();
}

void Cricket::batsman_out(int option,Gamepad &pad, N5110 &lcd){
    scoreboard.reset();
    pad.led(1,1.0);
    //pad.tone(750.0,0.5);
    ball.reset_ball_count();
    ux.game_over_menu(lcd,option);
    game_reset();
    _new_game=1;
    wait(2);
    pad.leds_off();
     ux.second_menu(lcd);
}    
void Cricket::draw(N5110 &lcd){
    lcd.drawCircle((WIDTH/2),HEIGHT/2,23,FILL_TRANSPARENT);
    lcd.drawRect(37,11,12,30,FILL_TRANSPARENT);
    ball.draw(lcd);
    draw_field(lcd);
    bat.draw(lcd);
    scoreboard.draw(lcd);
}
void Cricket::set_ball_direction(Direction dir){
    if (_direction_set!=1){ 
        for (int i=0;i<_init_field_counter+1;i++){
            if(dir==positions[i].dir){
                _ball_direction=dir;
                printf(" BALL DIRECTION %i x %i y %i \n",positions[i].no,positions[i].x,positions[i].y);
                _position_no=i;
                _direction_set=1;
                break; 
            }
        }
    }
}
int Cricket::check_fielder(Direction dir){
    Vector2D p;
    if (dir==N){
        return -1;
    }
    for (int i=0;i<8;i++){
      if(dir == field[i].dir){
         return i;
     }
   }
   return -1;
  }
void Cricket::draw_field(N5110 &lcd){
    lcd.drawCircle(field[0].x,field[0].y,2,FILL_TRANSPARENT);
    lcd.drawCircle(field[1].x,field[1].y,2,FILL_TRANSPARENT);
    lcd.drawCircle(field[2].x,field[2].y,2,FILL_TRANSPARENT);
    lcd.drawCircle(field[3].x,field[3].y,2,FILL_TRANSPARENT);
    lcd.drawCircle(field[4].x,field[4].y,2,FILL_TRANSPARENT);
}
void Cricket::set_field(N5110 &lcd){
    int d=0;
    int pos=0;
    int i=0;
    int continueCount=0;
    srand(time(NULL));
    while (_fielders_count!=5){
        d = 1+ rand() % 6;
        pos=rand()%2;    
        for (int j=0;j<10;j++){
           if (field_numbers[j]==d){
                continueCount=1;
            }
        }
        if (continueCount==1){
            continueCount=0;
            continue;
        }
        if (d==1){ //NW
            if (pos==1){
              field[i].dir=NW;
              field[i].x=30;
              field[i].y=9;
              field[i].position=1;
              field_numbers[i]=d;
              i++;
              _fielders_count++;
            }
            else{
              field[i].dir=NW;
              field[i].x=25;
              field[i].y=2;
              field[i].position=0;
              field_numbers[i]=d;
              i++;
              _fielders_count++;
            }
        }
        if (d==2){ //NE
            if (pos==1){
            field[i].dir=NE;
            field[i].x=55;
            field[i].y=9;
            field[i].position=1;
            field_numbers[i]=d;
              i++;
              _fielders_count++;
            }
            else{
            field[i].dir=NE;
                field[i].x=65;
                 field[i].y=2;
                 field[i].position=0;
                 field_numbers[i]=d;
                  i++;
                  _fielders_count++;
            }
        }
        if (d==3){ //SW
            if (pos==1){
                field[i].dir=SW;
                field[i].x=33;
                field[i].y=40;
                field[i].position=1;
                field_numbers[i]=d;
                i++;
                _fielders_count++;
            }
                
            else{
              field[i].dir=SW;
              field[i].x=25;
              field[i].y=44;
              field[i].position=0;
              field_numbers[i]=d;
              i++;
              _fielders_count++;
            }
        }
        
        if (d==4){ //SE
            if (pos==1){
              field[i].dir=SE;
              field[i].x=55;
              field[i].y=40;
              field[i].position=1;
              field_numbers[i]=d;
              i++;
              _fielders_count++;
            }
            else{
              field[i].dir=SE;
              field[i].x=65;
              field[i].y=44;
              field[i].position=0;
              field_numbers[i]=d;
              i++;
              _fielders_count++;
            }
        }
        
        if (d==5){ //W
            if (pos==1){
              field[i].dir=W;
              field[i].x=3;
              field[i].y=30;
              field[i].position=1;
              field_numbers[i]=d;
              i++;
              _fielders_count++;
            }
            else{
              field[i].dir=W;
              field[i].x=25;
              field[i].y=30;
              field[i].position=0;
              field_numbers[i]=d;
              i++;
              _fielders_count++;
            }
        }  
        if (d==6){ //W
            if (pos==1){
                field[i].dir=E;
                field[i].x=80;
                field[i].y=30;
                field[i].position=1;
                field_numbers[i]=d;
                i++;
                _fielders_count++;
            }
            else{
                 field[i].dir=E;
                field[i].x=60;
                field[i].y=30;
                field[i].position=0;
                field_numbers[i]=d;
                i++;
                _fielders_count++;
            }       
        }
  }
}
  void Cricket::info_screen(N5110 &lcd,int target){
    lcd.clear();
    lcd.printString("YOU ARE GIVEN",2,1); 
    lcd.printString("10 BALLS ",3,2); 
    lcd.refresh();
    wait(0.5);
    char buffer[5];
    int length=sprintf(buffer,"SCORE %i RUNS",target);
    lcd.printString(buffer,2,4);
    lcd.refresh();
    wait(0.5);
    lcd.printString("GOOD LUCK!!!",0,5);
    lcd.refresh();
    wait(3);
  }