// Cloned by Adam Gray on 8 Nov 2022 from Mind "sheepdog3mind(Submission)" by Neil Geoghegan
// Please leave this clone trail here.
/*
====== ====== ======
1 2/pen 3
====== ====== ======
4 5 6
====== ====== ======
7 8 9
====== ====== ======
The dog/mind will use the zones to determine where to move
if the dog is in a different zone to the sheep it will go find it
once in the same zone the dog will try to push the sheep into another zone
the goal is to push the sheep into the middle so they can then be pushed into
the pen
*/
function randomPick ( a, b )
{
if ( randomBoolean() )
return a;
else
return b;
}
/*uses location of the enemy and agent
*/
function agentGetAction(agenti, agentj, enemyi ,enemyj){
if( (zone(agenti,agentj) == zone(enemyi,enemyj)) && (zone(enemyi,enemyj) == 1) ){
if( (agentj >= enemyj) && (agenti != enemyi)){
return ( ACTION_UP)
}
if( (agentj < enemyj) && (agenti > enemyi)){
return ( ACTION_LEFT)
}
if( (agentj < enemyj) && (agenti < enemyi)){
return ( ACTION_RIGHT)
}
if( (agentj < enemyj) && (agenti == enemyi)){
return ( ACTION_DOWN)
}
if( (agentj > enemyj) && (agenti == enemyi)){
return randomPick(ACTION_LEFT, ACTION_RIGHT)
}
}
//zone2
if( (zone(agenti,agentj) == zone(enemyi,enemyj)) && (zone(enemyi,enemyj) == 2) ){
}
//zone3
if( (zone(agenti,agentj) == zone(enemyi,enemyj)) && (zone(enemyi,enemyj) == 3) ){
if( (agentj >= enemyj) && (agenti != enemyi)){
return ( ACTION_UP)
}
if( (agentj < enemyj) && (agenti > enemyi)){
return ( ACTION_LEFT)
}
if( (agentj < enemyj) && (agenti < enemyi)){
return ( ACTION_RIGHT)
}
if( (agentj < enemyj) && (agenti == enemyi)){
return ( ACTION_DOWN)
}
if( (agentj > enemyj) && (agenti == enemyi)){
return randomPick(ACTION_LEFT, ACTION_RIGHT)
}
}
//zone4
if( (zone(agenti,agentj) == zone(enemyi,enemyj) ) && (zone(enemyi,enemyj) == 4) ){
if( (agenti >= enemyi) && (agentj != enemyj)){
return ( ACTION_LEFT)
}
if( (agenti < enemyi) && (agentj > enemyj)){
return ( ACTION_UP)
}
if( (agenti < enemyi) && (agentj < enemyj)){
return ( ACTION_DOWN)
}
if( (agenti < enemyi) && (agentj == enemyj)){
return ( ACTION_RIGHT)
}
if( (agenti > enemyi) && (agenti == enemyi)){
return randomPick(ACTION_LEFT)
}
}
//zone5
if( (zone(agenti,agentj) == zone(enemyi,enemyj)) && (zone(enemyi,enemyj) == 5) ){
if((agenti == enemyi) && (agentj < enemyj)){
return randomPick(ACTION_LEFT,ACTION_RIGHT)
}
}
//zone6
if( (zone(agenti,agentj) == zone(enemyi,enemyj)) && (zone(enemyi,enemyj) == 6) ){
if( (agenti <= enemyi) && (agentj != enemyj)){
return ( ACTION_RIGHT)
}
if( (agenti > enemyi) && (agentj < enemyj)){
return ( ACTION_DOWN)
}
if( (agenti > enemyi) && (agentj > enemyj)){
return ( ACTION_UP)
}
if( (agenti > enemyi) && (agentj == enemyj)){
return ( ACTION_LEFT)
}
if( (agentj > enemyj) && (agenti == enemyi)){
return randomPick(ACTION_UP,ACTION_DOWN)
}
}
//zone7
if( (zone(agenti,agentj) == zone(enemyi,enemyj)) && (zone(enemyi,enemyj) == 7) ){
if( (agenti > enemyi) && (agenti != enemyi)){
return ( ACTION_LEFT)
}
if( (agenti < enemyi) && (agentj > enemyj)){
return ( ACTION_UP)
}
if( (agenti < enemyi) && (agentj < enemyj)){
return ( ACTION_DOWN)
}
if( (agenti < enemyi) && (agentj == enemyj)){
return ( ACTION_RIGHT)
}
if( (agentj == enemyj) && (agenti > enemyi)){
return randomPick(ACTION_UP, ACTION_DOWN)
}
}
//zone8
if( (zone(agenti,agentj) == zone(enemyi,enemyj)) && (zone(enemyi,enemyj) == 8) ){
if((agenti == enemyi) && (agentj < agentj)){
return randomPick(ACTION_LEFT,ACTION_RIGHT)
}
}
//zone9
if( (zone(agenti,agentj) == zone(enemyi,enemyj)) && (zone(enemyi,enemyj) == 9) ){
if( (agenti <= enemyi) && (agentj != enemyj)){
return ( ACTION_RIGHT)
}
if( (agenti > enemyi) && (agentj < enemyj)){
return ( ACTION_DOWN)
}
if( (agenti > enemyi) && (agentj > enemyj)){
return ( ACTION_UP)
}
if( (agenti > enemyi) && (agentj == enemyj)){
return ( ACTION_LEFT)
}
if( (agentj < enemyj) && (agenti == enemyi)){
return randomPick(ACTION_UP, ACTION_DOWN)
}
}
//if not in same zone, dog will search for sheep
if ( agentj <= enemyj ) return ( ACTION_DOWN)
if ( (agentj > enemyj) && (agenti < enemyi) ) return ( ACTION_RIGHT)
if ( (agentj > enemyj) && (agenti > enemyi) ) return ( ACTION_LEFT)
if ( (agentj > enemyj) && (agenti = enemyi) ) return ( ACTION_UP)
if ( (agentj < enemyj) && (agenti = enemyi) ) return (randomPick(ACTION_LEFT,ACTION_RIGHT))
}
function zone(i,j){
if( (i => 1) && (i <= 6) && (j => 1) && (j <= 6 ) ) return 1
if( (i > 6) && (i <= 12) && (j => 1) && (j <= 6 ) ) return 2
if( (i > 12) && (i <= 18) && (j => 1) && (j <= 6 ) ) return 3
if( (i => 1) && (i <= 7) && (j > 6) && (j <= 12 ) ) return 4
if( (i > 7) && (i <= 11) && (j > 6) && (j <= 12 ) ) return 5
if( (i >= 12) && (i <= 18) &&(j > 6) && (j <= 12 ) ) return 6
if( (i => 1) && (i <= 7) && (j > 12) && (j <= 18 ) ) return 7
if( (i > 7) && (i <= 11) && (j > 12) && (j <= 18 ) ) return 8
if( (i >= 12) && (i <= 18) &&(j > 12) && (j <= 18 ) ) return 9
}
function Mind() {
var ignoreEnemy1 = false;
var ignoreEnemy2 = false;
var ignoreEnemy3 = false;
//dog knows if a sheep has been put in the pen
//--- public functions / interface / API ----------------------------------------------------------
this.newRun = function()
{
};
this.endRun = function()
{
};
this.getAction = function ( x ) // x is an array of [ ai, aj, ei, ej ]
{
var ai = x[0];
var aj = x[1];
var ei = x[2];
var ej = x[3];
var e2i = x[4];
var e2j = x[5];
var e3i = x[6];
var e3j = x[7];
//System.log("Enemy in zone " + zone(ei, ej));
//looks for sheep in order 1,2,3
//improvement would be to look for nearset sheep
if(ignoreEnemy1 == false){
if(zone(ei,ej) == 2){
ignoreEnemy1 = true;
}
return agentGetAction(ai,aj,ei,ej)
}
else if(ignoreEnemy2 == false){
if(zone(e2i,e2j) == 2){
ignoreEnemy2 = true;
}
return agentGetAction(ai,aj,e2i,e2j)
}
else if(ignoreEnemy3 == false){
if(zone(e3i,e3j) == 2){
ignoreEnemy3 = true;
}
return agentGetAction(ai,aj,e3i,e3j)
}
else{
return (ACTION_DOWN)
}
};
}