GKのアルゴリズム


河原林研究室 >> EcoBe!世界一への道 >> GKのアルゴリズム

GKのアルゴリズム

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);
    	}
    }
  • GKメイン行動
    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;
    }