河原林研究室 >> EcoBe!世界一への道 >> GKのアルゴリズム
if(ball_y < y * 0.4){ if(ball_deg.length < 100){ act = 2; }else{ act = 1; } }else if(my_y >= y * 0.3) act = 0; else act = 0; *actが 0:初期位置移動、1:シュートコースを防げる位置に移動、2:ボールを蹴りにいく
void BasicPlayer :: pv_fixed_position(double my_x , double my_y , double fx , double fy , vector_t my_goal_center , vector_t op_goal_center) { double angle; angle = (op_goal_center.angle * 180.0) / M_PI + 90; if(my_x <= fx + 50.0 && my_x >= fx - 50.0 && my_y <= fy + 50.0 && my_y >= fy - 50.0){ if( fabs(angle) > 10.0) angle < 0.0 ? pv_set_velocity(0 , 30.0):pv_set_velocity(30.0 , 0); else pv_stop(); }else if(my_x <= fx + 50.0 && my_x >= fx - 50.0){ if(my_y > fy + 50.0){ pv_go_to(my_goal_center); }else if(my_y < fy - 50.0){ pv_go_to(op_goal_center); } }else if(my_y <= fy + 50.0 && my_y >= fy - 50.0){ if(my_x > fx + 50.0){ if( fabs(angle) > 10.0) angle < 0.0 ? pv_set_velocity(0 , 30.0):pv_set_velocity(30.0 , 0); else pv_go_straight(-30.0); }else if(my_x < fx - 50.0){ if( fabs(angle) > 10.0) angle < 0.0 ? pv_set_velocity(0 , 30.0):pv_set_velocity(30.0 , 0); else pv_go_straight(30.0); } }else{ pv_go_to(my_goal_center); } }
switch(act){ case 0://初期位置に戻る gPlayer.pv_fixed_position(my_x , my_y , x / 2.0 , y / 6 , my_goal_center, op_goal_center); break; case 1://keeper action if(ball_y < y * 0.4){ if(my_y + 100.0 <= ball_y && my_x <= lsx && my_x >= rsx){//シュートコースにいる時 gPlayer.pv_stop(); }else if(my_y + 100.0 <= ball_y){//シュートコースにいないとき if(my_x > lsx){ if( fabs(angle) > 20.0) angle < 0.0 ? gPlayer.pv_set_velocity(-30.0 , 30.0):gPlayer.pv_set_velocity(30.0 , -30.0); else gPlayer.pv_go_straight(40.0); }else if(my_x < rsx){ if( fabs(angle) > 20.0) angle < 0.0 ? gPlayer.pv_set_velocity(-30.0 , 30.0):gPlayer.pv_set_velocity(30.0 , -30.0); else gPlayer.pv_go_straight(-40.0); } }else if(my_y + 100.0 > ball_y){//ボールが近づいてきたとき if(my_y > ball_y){//ボールが自分より後ろの時 if(ball_x < goal_xl && ball_x > goal_xr){ gPlayer.pv_go_to(ball_rad);//ボールに向かう }else if(ball_x > goal_xl){ gPlayer.pv_go_to(mygoal2);//左ゴールポストに向かう }else if(ball_x < goal_xr){ gPlayer.pv_go_to(mygoal1);//右ゴールポストに向かう } }else if(my_y + 100 > ball_y){//ボールが自分よりすこし前の時 if(ball_x < goal_xl && ball_x > goal_xr){//ボールが中央 if(my_x <= lsx && my_x >= rsx ){ gPlayer.pv_go_to(ball_rad); }else if(my_y < ball_y + 50.0){ if(my_x > lsx){ if( fabs(angle) > 20.0) angle < 0.0 ? gPlayer.pv_set_velocity(-30.0 , 30.0):gPlayer.pv_set_velocity(30.0 , -30.0); else gPlayer.pv_go_straight(40.0); }else if(my_x < rsx){ if( fabs(angle) > 20.0) angle < 0.0 ? gPlayer.pv_set_velocity(-30.0 , 30.0):gPlayer.pv_set_velocity(30.0 , -30.0); else gPlayer.pv_go_straight(-40.0); } } }else if(ball_x > goal_xl){ gPlayer.pv_go_to(mygoal2); }else if(ball_x < goal_xr){ gPlayer.pv_go_to(mygoal1); } } } } break; case 2://味方にパス if(fabs(ball_deg.angle) > 15.0) ball_deg.angle < 0.0 ? gPlayer.pv_set_velocity(0.0 , 40.0):gPlayer.pv_set_velocity(40.0 , 0.0); if(ball_deg.length < 48) ball_deg.angle < 0.0 ? gPlayer.pv_set_velocity( -30 , 30):gPlayer.pv_set_velocity(30 , -30); if(fabs(ball_deg.angle) < 30.0){ if(ball_deg.length > 40) gPlayer.pv_go_straight(30.0); else{ //近く味方にボールを蹴る team_mate = gWorldData.pv_me(); tid = gWorldData.pv_closest_teammate_to(team_mate); team_mate = gWorldData.pv_teammate(tid); gPlayer.pv_kick(team_mate.angle,1.0); } } break; }