/***********************************/ /* Player2.java */ /* subclass of Player1.java */ /***********************************/ import java.util.*; import java.lang.*; class Player2 extends Player1 { boolean DEBUG = false; // mode = 1; normal run. // 4; after goal. return initial posotion. // 5; time over. save some information for next game. // 2; My free -kick. // 3; Opponent free -kick. int mode = 1; // parameters in SoccerServer Configure file. // radius of Kickable Area = kickable_margin + ball_size + player_size double kickable_area; double kickable_margin = 0.7; // radius of Kickable margin(ver.5.25) double ball_size = 0.085; // radius of ball(ver.5.25) double player_size = 0.3; // radius of player(ver.5.25) int half_time = 500; // length of half time match. ObjectInfo object; GoalInfo object_g; public void ready() { int turn = 0, turnMax = 8; boolean ok = false; kickable_area = kickable_margin + ball_size + player_size; send("(move " + Double.toString(initial_pos[p_no][0]) + " " + Double.toString(initial_pos[p_no][1]) + ")"); do { message = receive(); parse(message); object = getObject("ball"); if(object == null) send("(turn 60)") ; else { if (Math.abs( object.m_direction ) > 5.0) send("(turn " + object.m_direction + ")") ; else ok = true; } try{ Thread.sleep(s_time); }catch(Exception e){ } } while( (!ok) && ((turn++) < turnMax)); if (turn >= turnMax) System.out.println(" I cannot see the ball. I MUST move."); } protected void parseHear(String message) { // get hear information StringTokenizer h_tokenizer = new StringTokenizer(message,"() "); String sender; // skipp hear token h_tokenizer.nextToken(); m_time = Integer.parseInt( h_tokenizer.nextToken() ); sender = h_tokenizer.nextToken(); if( sender.compareTo("referee") == 0 ) { sender = h_tokenizer.nextToken(); if(DEBUG) System.out.println("Referee says:" + sender); parseReferee(sender); } else if( sender.compareTo("self") != 0 ) { String mate_says =message.substring(message.indexOf("self") + 3, message.length()-2).trim(); if(DEBUG){ System.out.println("No Selfsays:" + mate_says); System.out.println("Someone says:" + message);} } else System.out.println("From Direction:" + message); } protected ObjectInfo getObject(String name) { for(int j = 0; j < m_objects.size(); j++) { ObjectInfo object = (ObjectInfo)m_objects.elementAt(j); if(object.m_type.compareTo("ball") == 0) return object; } return null; } protected GoalInfo getObject_goal() { for(int j = 0; j < m_objects.size(); j++) { GoalInfo object = (GoalInfo)m_objects.elementAt(j); if(object.m_type.compareTo("goal") == 0) return object; } return null; } protected void parseReferee(String message) { if( message.charAt(0) == 'o') // "offside" { // needs to save offside_line information. fk_team(message.charAt(8)); } else if ( message.charAt(0) == 'c') // "corner_kick_l" fk_team(message.charAt(12)); else if ( message.charAt(0) == 'f') // "free_kick_side" fk_team(message.charAt(10)); else if ( message.charAt(0) == 'g') { if ( message.charAt(5) == 'k') // "goal_kick_side" fk_team(message.charAt(10)); else // "goal"ed. mode = 4; } else if ( message.charAt(0) == 'k') { if( message.charAt(5) == 'o') // "kick_off_side" fk_team(message.charAt(9)); else if( message.charAt(5) == 'i') // "kick_in_side" fk_team(message.charAt(8)); } else if ( message.charAt(0) == 'p') // "play_on" { mode = 1; } else if ( message.charAt(0) == 't') // "time_over" { System.out.println("Referee says:" + message); mode = 5; } else if( message.charAt(0) == 'b') // "before_kick_off" System.out.println("says:before_kick_off"); else { System.out.println("Referee says:" + message); System.out.println(" However, I DON'T know what todo!"); } } protected void fk_team(char side) { if(this.side == side) mode = 2; // my ball. else mode = 3; } public void run() { while(m_time < half_time) { if (can_shoot()) shoot(); else go_to_ball(); } } protected boolean can_shoot() { message = receive(); parse(message); object = getObject("ball"); if (DEBUG) if (object != null) { System.out.println("Ball found IN can_shoot()."); System.out.println("object.m_distance=" + object.m_distance + " kickable_area=" +kickable_area);} else System.out.println("Ball not found IN can_shoot()."); if((object != null) && (Math.abs(object.m_distance) < kickable_area)) { // (1) see a ball, AND (2) ball is near, // object_g = (GoalInfo) getObject("goal"); object_g = (GoalInfo) getObject_goal(); if(object_g != null) // (3) see goal. { if (DEBUG) { System.out.println("Goal found IN can_shoot()."); object_g.print(); } return true; } } return false; } protected void shoot() { // shoot opponent goal. if (this.side == object_g.m_side) { // own goal, so kick opposite direction. if (object_g.m_direction >= 0.0) send("(kick 50 -170)"); else send("(kick 50 170)"); } else { // opponent side. send("(kick 50 " + object_g.m_direction + ")"); } } protected void go_to_ball() { if(DEBUG) { System.out.println("Now in go_to_ball()"); if(object != null) object.print(); if(object_g != null) object_g.print(); } if(object == null) // cannot see the ball. send("(turn 60)"); else { if(object_g == null) // ball is near, but cann not see goal. send("(dash 50)"); else { // dash to th ball. send("(dash 50)"); } } } }