The team Debrecen Deep Forest FC++ is
further developed from the team Debrecen Great Forest
FC++. We focus on the implementation of the
playOn function.
We do not make major changes, but make fine-tuning adjustments in the code of Debrecen Great Forest FC++:
The goals scored by the Debrecen Great Forest FC++ are typically own goals or accidental goals due to the fact that this team cannon play organized attacking or defending football. The players should be positioned higher up on the pitch in order to improve the team's play. Therefore we introduce that the players are able to pass only forward.
The main cause of the own goals is a slide tackle that is done in the wrong direction. Therefore we impove the angle for slide tackles.
We modify the method of gaining the ball.
For example, as the following two figures show, player 3 and player 6 should go to the ball, but they do not do it because we use the method introduced above for the throw-in and the corner kick: the player agent will only go to the ball if it cannot see the teammates.
Now an opposing player gains possession of the ball, therefore we will modify the agent: if the ball can be seen closer than the teammates, the agent will also go to the ball.
Like in the cases of the throw-in and the corner kick, the player possessing the ball will turn around in a circle to see where the teammates are.
We have also made further small improvements, for example the goalkeeper agent does not run out to a distance of 30 meters from its goal.
The source code of the improvements are the following:
static void playOn(Client * thisclient)
{ char buf[1024]; int time = thisclient->bl.get_time(); int
squad_number = thisclient->bl.get_squad_number() -1; int lr =
thisclient->bl.get_lr(); // egész pályás felállásba kapcsol
(középkezdéskor még fél pályás volt, most átmegy "támadásba")
thisclient->coach.set_formation(Formations::F_4_3_3_F); // mint a
FerSML-ben a (celx, cely) ennek felel meg most intuíciusan a
t(arget)x, t(arget)x int tx =
thisclient->coach.get_formation().get_formation_x(squad_number,
lr); int ty =
thisclient->coach.get_formation().get_formation_y(squad_number); //
ha látja a lasztit if (thisclient->bl.get_see_ball()) { int to =
thisclient->bl.pass_to_nearest(2); int pd =
(to!=-1)?thisclient->bl.get_own_player(to).getDist():0; // és olyan
közel, hogy meg tudja rúgni if (squad_number == 0 &&
thisclient->bl.get_ball_dist() < 1.2) { std::snprintf(buf, 64,
"(catch %f)\0", thisclient->bl.get_ball_ang());
thisclient->sndCmd(buf); // std::cout << " kapus bravur "
<< std::endl; } else if (thisclient->bl.get_ball_dist() <
.8) { //std::cout <<
thisclient->bl.get_squad_number()<< " < .8 " <<
std::endl; // akkor // esetleg ide passzol majd int pass_to; // az
ellen kapuját SeenFlag & sf_opp =
(lr=='l')?thisclient->bl.get_flag(Flag::GR):thisclient->bl.get_flag(Flag::GL);
// a sajátját SeenFlag & sf_own =
(lr=='l')?thisclient->bl.get_flag(Flag::GL):thisclient->bl.get_flag(Flag::GR);
// látta mostanság if (time - sf_opp.get_time_stamp() < 2 // és
elég közel van (30m) && sf_opp.getDist() < 30.0) { // felé
rúgja ha látja kick(thisclient, 100, sf_opp.getAng()); std::cout
<< thisclient->bl.get_squad_number()<< " kapura lo "
<< std::endl; // ha nincs elég közel, akkor próbál passzolni }
else if ((pass_to = thisclient->bl.pass_to_farthest_fwd()) != -1
&& (time - sf_own.get_time_stamp() > 3)) { kick(thisclient,
thisclient->bl.tavhozEro(thisclient->bl.get_own_player(pass_to).getDist()),
thisclient->bl.get_own_player(pass_to).getAng() ); // ha nem tud
passzolni és közel a saját kapu, akkor (feltéve, hogy bal oldali a
saját kapu) } else if (time - sf_own.get_time_stamp() < 1 // és
elég közel van (25m) && sf_own.getDist() < 16.0) { // ha
azt nem látja, akkor becsúszik kick(thisclient, 100, 180 +
sf_own.getAng()); std::cout <<
thisclient->bl.get_squad_number()<< " becsuszik " <<
std::endl; } else { if (++thisclient->bl.nof_possessing_quantums
< 7) { thisclient->sndCmd("(turn 30)\0"); std::cout <<
thisclient->bl.get_squad_number()<< " turn for finding
targets " << std::endl; } else { kick(thisclient, 10, 20);
std::cout << thisclient->bl.get_squad_number()<< " kis
kick " << std::endl; } } } else if
(std::abs(thisclient->bl.get_ball_ang()) > 20.0) {
std::snprintf(buf, 64, "(turn %f)\0",
thisclient->bl.get_ball_ang()); thisclient->sndCmd(buf); //
std::cout << thisclient->bl.get_squad_number()<< "turn"
<< thisclient->bl.get_ball_ang() << std::endl; } else
if (squad_number != 0 && thisclient->bl.get_ball_dist()
< 40.0 && to == -1) { // legyen agresszívabb a
labdaszerzés: 40-ről is sprintel bedobni, ha nincs közelebbi társ
dash_to_ball_100(thisclient, thisclient->bl.get_ball_dist());
//std::cout << thisclient->bl.get_squad_number()<< "
egyedul megyek labdara 100" << std::endl; } else if
(squad_number > 4 && thisclient->bl.get_ball_dist() <
30 && thisclient->bl.get_ball_dist() < pd && to
!= -1) { // legyen agresszívabb a labdaszerzés: 40-ről is sprintel
bedobni, ha nincs közelebbi társ dash_to_ball_100(thisclient,
thisclient->bl.get_ball_dist()); //std::cout <<
thisclient->bl.get_squad_number()<< " megyunk a labdara 100"
<< std::endl; } else if (squad_number != 0 &&
thisclient->bl.get_ball_dist() < 16.0 &&
(thisclient->bl.nof_seen_teammates()) < 1) { // 40-ról is jön
bedobni, ha esetleg lát is társakat (mert az előző ág nem teljesült)
dash_to_ball_100(thisclient, thisclient->bl.get_ball_dist());
//std::cout << thisclient->bl.get_squad_number()<< "
megyUNK a labdara " << std::endl; } else if
(thisclient->bl.get_ball_dist() < 9.0) {
dash_to_ball_100(thisclient, thisclient->bl.get_ball_dist());
//std::cout << thisclient->bl.get_squad_number()<< "
megyUNK a labdara, aki csak latja " << std::endl; } else if
(thisclient->bl.get_ball_dist() < 30.0) { std::snprintf(buf, 64,
"(pos %d %d 50)\0", tx, ty); thisclient->sndCmd(buf); //std::cout
<< thisclient->bl.get_squad_number()<< " helyezkedik
"<< "(" << tx << ", " << ty << ")"
<< std::endl; } else { std::snprintf(buf, 64, "(pos %d %d
30)\0", tx, ty); thisclient->sndCmd(buf); //std::cout <<
thisclient->bl.get_squad_number()<< " helyezkedik "<<
"(" << tx << ", " << ty << ")" <<
std::endl; } } else { // ha nem látja a labdát // visszamegy
"védekezésbe"
thisclient->coach.set_formation(Formations::F_4_3_3_H);
thisclient->sndCmd("(turn 40)\0"); //std::cout <<
thisclient->bl.get_squad_number()<< "meccs van? ..." <<
std::endl; } }Unfortunately the above improvements do not reach the anticipated level, but the Debrecen Deep Forest FC++ can typically defeat the Debrecen Great Forest FC++ as it is shown by the next match results:
201208191102-DForestFC++_13-vs-GForestFC++_2.rcg
201208191116-GForestFC++_1-vs-DForestFC++_5.rcg
201208191128-DForestFC++_4-vs-GForestFC++_3.rcg
201208191200-DForestFC++_4-vs-GForestFC++_6.rcg
201208191212-GForestFC++_2-vs-DForestFC++_3.rcg
201208191223-DForestFC++_9-vs-GForestFC++_1.rcg
201208191235-DForestFC++_6-vs-GForestFC++_2.rcg
201208191247-GForestFC++_2-vs-DForestFC++_4.rcg
201208191301-DForestFC++_10-vs-GForestFC++_8.rcg
201208191318-DForestFC++_5-vs-GForestFC++_3.rcg
But then a test match was played so well that we have recorded it to a video 201208191102-DForestFC++_13-vs-GForestFC++_2.rcg 13:2 that can be found at http://youtu.be/FOb8IQ0AF5w,
.
GForestFC++ - DForestFC++ 1:5
DForestFC++ - GForestFC++ 4:3
DForestFC++ - GForestFC++ 4:6
GForestFC++ - DForestFC++ 2:3
DForestFC++ - GForestFC++ 9:1
DForestFC++ - GForestFC++ 6:2
GForestFC++ - DForestFC++ 2:4
DForestFC++ - GForestFC++ 10:8
DForestFC++ - GForestFC++ 5:3
The Debrecen Deep Forest
FC++ also produces unintelligible errors. For example,
the players pass backward in some given situations, due to the fact
that the estimated position of the seen player is so wrong that it
impairs the work of the function
pass_to_farthest_fwd.
Example 5.3. Do not pass backward
Improve the code so that the passing backward should occurs as rarely as possible. But for now do not use the advantages of the simplification.
bool fwd(char
lr, float fromx) const { if (lr == 'l') { if (fromx <
this->x) return true; else return false; } else { if (fromx
> this->x) return true; else return false; } }
Example 5.4. A good starting
At kick off the positions of all players are well known. Therefore it is not too hard to program a good kick-off, do it now yourself.
It may be noted that the Debrecen Deep Forest FC++ uses the pos command, but neither the client agent nor the server use the light response data. To be more precise, the client agent does not use and the server does not send the light response data, the latter case can be seen in the next screen snippet:
$ src/rcssserver
rcssserver-15.1.0.light4.df Copyright (C) 1995, 1996, 1997, 1998,
1999 Electrotechnical Laboratory. 2000 - 2012 RoboCup Soccer
Simulator Maintenance Group. Simulator Random Seed: 1345375129
CSVSaver: Ready STDOutSaver: Ready Using simulator's random seed
as Hetero Player Seed: 1345375129 wind factor: rand: 0.000000,
vector: (0.000000, 0.000000) Hit CTRL-C to exit Light response:
false Light response with angle: false Light response with angles:
false