Code viewer for Mind: Smart Mouse (clone by Abde...

// Cloned by Abdelshafa Abdala on 3 Nov 2022 from Mind "Smart Mouse" by Jack O'Brien 
// Please leave this clone trail here.
 


// Cloned by Jack O'Brien on 7 Nov 2020 from Mind "Complex Mind" by Starter user 
// Please leave this clone trail here.
 

var count =0;
var ringPath =[];
let cornerIndex = 0;
var showPathAgent = false;
var showAllAgent = false;

// let destination;
 
function agentpath(start, destination){
    
    openSetAgent=[];
    closedSetAgent=[];

    openSetAgent.push(start);
     
     while (openSetAgent.length > 0){
        var winner = 0;
        
        for (var i = 0; i < openSetAgent.length; i++) 
          if (openSetAgent[i].f < openSetAgent[winner].f){ 
            winner = i;
          }
            
        var current = openSetAgent[winner];
        
        if (destination.neighbors.includes(current)) 
        {
          let Path = [];
          var temp = current;
          Path.push(temp);
          while (temp.previous) 
          {
            Path.push(temp.previous);
            temp = temp.previous;
          }
          if(showPathAgent)
                drawPath(Path, 0xFF1493);
          return Path;
        }
    
        // Best option moves from openSet to closedSet
        removeFromArray(openSetAgent, current);
        closedSetAgent.push(current);
    
        // Check all the neighbors
        var neighbors = current.blockingNeighbors;
        //--- start of for loop -----------
        if(neighbors){
        for (var i = 0; i < neighbors.length; i++) 
        {
          var neighbor = neighbors[i];

          if (!occupied(neighbor.i, neighbor.j) && !closedSetAgent.includes(neighbor)) 
          {
            var tempG = current.g + dist(neighbor, current);
            
            // Is this a better path than before?
            var newPathAgent = false;
            if (openSetAgent.includes(neighbor)) 
            {
              if (tempG < neighbor.g) 
              {
                neighbor.g = tempG;
                newPathAgent = true;
              }
            }
            else //if(distCToAgent > distNToAgent)
            {
              neighbor.g = tempG;
              newPathAgent = true;
              openSetAgent.push(neighbor);

            }
    
            // Yes, it's a better path
            if (newPathAgent) 
            {
              neighbor.h = dist(neighbor, destination);
              neighbor.f = neighbor.g + neighbor.h;
              neighbor.previous = current;
            }
          }
        }
    }

    if(showAllAgent == true){
          AgentPathSearch = [];
          var temp = current;
          AgentPathSearch.push(temp);
          while (temp.previous) 
          {
            // console.log("X: " + temp.previous.i + " Y: " + temp.previous.j + " added to path");
            AgentPathSearch.push(temp.previous);
            temp = temp.previous;
          }
        
          drawPath(AgentPathSearch, 0x33FFF3);
    }
    }

        return null;
}

function dist(a, b){
    return Math.sqrt(Math.pow(a.i -b.i, 2) + Math.pow(a.j -b.j, 2));
}

// =================================================================================================
// Sample Mind for more complex starter World  
// =================================================================================================

// World tells us agent position and enemy position
// World does not tell us of existence of walls
// if return invalid move (not empty square) World just ignores it and we miss a turn 




	AB.mind.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 corners = [];
        let corner1 = x[4][1][1];
        let corner2 = x[4][x[4].length-2][1];
        let corner3 = x[4][x[4].length-2][x[4].length-2];
        let corner4 = x[4][1][x[4].length-2];
        let temp = 0;
        let returnVal = [];

        corners.push(corner1);
        corners.push(corner2);
        corners.push(corner3);
        corners.push(corner4);
        // if(cornerIndex === null){
        //     cornerIndex = 0;
        // }
        
         
         if(agentpath(agentLocation, corners[cornerIndex]) !== null && agentpath(agentLocation, corners[cornerIndex]).length>2){
             ringPath = agentpath(agentLocation, corners[cornerIndex]);
                 
                var nextMove = ringPath[ringPath.length-2];
                if(nextMove !== null){
                     if ( ai == nextMove.i ){ 
                         if(aj<nextMove.j){
                            return ACTION_UP; 
                             
                         }
                        else if(aj>nextMove.j){
                            return ACTION_DOWN; 
                            
                        }
            		     
            		    
            		 }
            		 else if ( aj == nextMove.j ){ 
                         if(ai<nextMove.i){
                            return ACTION_RIGHT; 
                             
                         }
                        else if(ai>nextMove.i){
                            return ACTION_LEFT; 
                            
                        }
            		     
            		 }
                }
                    
     }
         else{
              if(cornerIndex == corners.length -1)
                    cornerIndex=0;
              else
                    cornerIndex++;
         }
         
         //Code for dumb agent, comment out above and uncomment this section to make agent dumb again
    //      if ( ej < aj ){ 	
    // 		     returnVal.push(AB.randomPick ( ACTION_UP,		AB.randomPick(ACTION_RIGHT,ACTION_LEFT) 	));
    // 		    return returnVal; 
    // 		 }
    // 		 if ( ej > aj ){ 	
    // 		     returnVal.push(AB.randomPick ( ACTION_DOWN,	AB.randomPick(ACTION_RIGHT,ACTION_LEFT) 	));
    // 		    return returnVal; 
    // 		 }
    
    // 		 if ( ei < ai ){
    // 		     returnVal.push(AB.randomPick ( ACTION_RIGHT,	AB.randomPick(ACTION_UP,ACTION_DOWN) 		));
    // 		    return returnVal;
    // 		 }
    // 		 if ( ei > ai ){
    // 		     returnVal.push(AB.randomPick ( ACTION_LEFT,	AB.randomPick(ACTION_UP,ACTION_DOWN) 		));
    // 		    return returnVal;
    // 		 }
            
	};