SHARE
TWEET

Untitled

a guest Jan 21st, 2019 62 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. package aleu.ga.pacman
  2. ;
  3. import java.util.*;
  4.  
  5. import game.controllers.PacManController;
  6. import game.core.Game;
  7.  
  8. public class FenotypeController implements PacManController {
  9.    
  10.     /**
  11.      * A generic wrapper for the finite state machine actions
  12.      */
  13.     private class FenotypeAction implements Comparable<FenotypeAction> {
  14.         protected int actionId, priority;
  15.        
  16.         /**
  17.          * The global threshold for the closest ghost distance.
  18.          * Used by most of the actions
  19.          */
  20.         protected int thresholdGhostDistance;
  21.        
  22.         /**
  23.          * In the actions the number and the treshold change their
  24.          * meaning depending from the context.
  25.          * Basically an action is triggered when a number of "something" is
  26.          * near < threshold.
  27.          */
  28.         protected int number, threshold;
  29.  
  30.         /**
  31.          * Construct a generic action
  32.          * @param priority the action selection criterion
  33.          * @param actionId the label for the current action
  34.          * @param number number of items considered in the threshold
  35.          * @param threshold the numeric threshold
  36.          * @param distance global distance of the closest ghost
  37.          */
  38.         public FenotypeAction(int priority, int actionId, int number,
  39.                               int threshold, int distance) {
  40.                                    
  41.             this.actionId = actionId;
  42.             this.priority = priority;
  43.             this.number = number;
  44.             this.threshold = threshold;
  45.            
  46.             //global
  47.             this.thresholdGhostDistance = distance;
  48.         }
  49.          
  50.         /**
  51.          * Compares this object with the specified object for order.
  52.          * Returns a negative integer, zero, or a positive integer as
  53.          * this object is less than, equal to, or greater than
  54.          * the specified object.
  55.          * @param o the FenotypeAction to be compared.
  56.          */
  57.         public int compareTo(FenotypeAction o) {   
  58.             if (this.priority > o.priority) return 1;
  59.             else return -1;
  60.         }
  61.        
  62.         /**
  63.          * The only method that is required is getAction(-),
  64.          * which returns the direction to be taken:
  65.          * Up - Right - Down - Left -> 0 - 1 - 2 - 3
  66.          * Any other number is considered to be a lack of action (Neutral).
  67.          * @param game the current game state
  68.          * @return An integer representing the direction
  69.          */
  70.         public int getAction(Game game) {
  71.             return -1;
  72.         }
  73.     }
  74.    
  75.     /**
  76.      * The genotype generated by the <code>Genotype</code> class.
  77.      * Contains a set of priority for actions and thresholds
  78.      * The chromosome contains only integers.
  79.      * It describes a different set of thresholds and priority related to
  80.      * actions.
  81.      * The generated fenotype from this <code>Gene</code> is a finite state
  82.      * machine driven by the gene parameters.
  83.      */
  84.    
  85.     private int[] genotype;
  86.    
  87.     private static int _a1 = 0;
  88.     private static int _a2 = 1;
  89.     private static int _a3 = 2;
  90.     private static int _a4 = 3;
  91.     private static int _a1_i = 1;
  92.     private static int _a2_i = 3;
  93.     private static int _a3_i = 6;
  94.     private static int _a4_i = 9;
  95.    
  96.     //global
  97.     private List<FenotypeAction> actions = new ArrayList<FenotypeAction>();
  98.    
  99.     public FenotypeController(int[] g) {
  100.         this.genotype = g;
  101.        
  102.         //Run away action
  103.         FenotypeAction a1 =
  104.         new FenotypeAction(g[_a1_i], _a1, g[_a1_i+1], g[0], g[0]) {
  105.  
  106.             /* if [number] of non-edible ghost is too close [threshold] run
  107.              * @Ovveride */
  108.             public int getAction(Game game) {
  109.                 int direction = -1;
  110.  
  111.                 int count = 0;
  112.                 int current = game.getCurPacManLoc();
  113.  
  114.                 for (int i = 0; i < Game.NUM_GHOSTS; i++)
  115.                     if (game.getEdibleTime(i) == 0 &&
  116.                         game.getLairTime(i) == 0 &&
  117.                         game.getPathDistance(current,
  118.                         game.getCurGhostLoc(i)) < this.threshold) {
  119.                        
  120.                         //TODO: Incomplete behaviour implementation
  121.                         direction = game.getNextPacManDir(
  122.                                     game.getCurGhostLoc(i),false,Game.DM.PATH);
  123.                        
  124.                         count++;
  125.                     }
  126.                
  127.                 if (count >= this.number && this.number > 0) return direction;
  128.                 else return -1;
  129.             }
  130.         };
  131.        
  132.         //Chase a ghost action
  133.         FenotypeAction a2 =
  134.         new FenotypeAction(g[_a2_i], _a2, g[_a2_i+1], g[_a2_i+2], g[0]) {
  135.            
  136.             /* if[number] of edible ghosts are close to [threshold] eat them
  137.              * @Ovveride */
  138.             public int getAction(Game game) {
  139.                
  140.                 int count = 0;
  141.                 int current = game.getCurPacManLoc();
  142.                
  143.                 // closest ghost
  144.                 int minDist = Integer.MAX_VALUE;
  145.                 int minGhost =- 1; 
  146.  
  147.                 for (int i = 0; i < Game.NUM_GHOSTS; i++)
  148.                    
  149.                     //count the edible ghosts
  150.                     if (game.getEdibleTime(i) > 0) {
  151.                        
  152.                         int d = game.getPathDistance(
  153.                                 current, game.getCurGhostLoc(i));
  154.                        
  155.                         if (d < this.threshold) {
  156.                             minGhost = d < minDist ? i : minGhost;
  157.                             minDist  = d < minDist ? d : minDist;
  158.                             count++;
  159.                         }
  160.                     }
  161.                
  162.                 if (count >= this.number && minGhost > -1 && this.number > 0)
  163.                     return game.getNextPacManDir(
  164.                            game.getCurGhostLoc(minGhost),true,Game.DM.PATH);
  165.                
  166.                 else return -1;
  167.             }
  168.         };
  169.        
  170.         //Go after a powerpill
  171.         FenotypeAction a3 =
  172.         new FenotypeAction(g[_a3_i], _a3, g[_a3_i+1], g[_a3_i+2], g[0]) {
  173.            
  174.             /* if [number] of powerpills are close to [threshold] go for em
  175.              * @Ovveride */
  176.             public int getAction(Game game) {
  177.                
  178.                 int count = 0;
  179.                 int current = game.getCurPacManLoc();
  180.  
  181.                 int[] powerPills = game.getPowerPillIndices();     
  182.                 ArrayList<Integer> targets = new ArrayList<Integer>();
  183.  
  184.                 for (int i = 0; i < powerPills.length; i++)
  185.                     if (game.checkPowerPill(i)) {
  186.                         targets.add(powerPills[i]);
  187.                        
  188.                         int d = game.getPathDistance(current, powerPills[i]);
  189.                        
  190.                         if (d < this.threshold) count++;
  191.                     }
  192.                
  193.                 //convert the targets to scalar
  194.                 int[] targetsArray = new int[targets.size()];      
  195.                
  196.                 for(int i = 0;i < targetsArray.length; i++)
  197.                     targetsArray[i] = targets.get(i);
  198.                
  199.                 if (count >= this.number && this.number > 0)
  200.                     return game.getNextPacManDir(game.getTarget(
  201.                             current,targetsArray, true, Game.DM.PATH),
  202.                             true, Game.DM.PATH);   
  203.                
  204.                 else return -1;
  205.                
  206.             }
  207.         };
  208.        
  209.         //Go after a pill
  210.         FenotypeAction a4 =
  211.         new FenotypeAction(g[_a4_i], _a4, g[_a4_i+1], g[_a4_i+2], g[0]) {
  212.            
  213.             /* if [number] of powerpills are close to [threshold] go for em
  214.              * @Ovveride */
  215.             public int getAction(Game game) {
  216.                
  217.                 int count = 0;
  218.                 int current = game.getCurPacManLoc();
  219.  
  220.                 int[] powerPills = game.getPillIndices();      
  221.                 ArrayList<Integer> targets = new ArrayList<Integer>();
  222.  
  223.                 for (int i = 0; i < powerPills.length; i++)
  224.                     if (game.checkPowerPill(i)) {
  225.                         targets.add(powerPills[i]);
  226.                        
  227.                         int d = game.getPathDistance(current, powerPills[i]);
  228.                        
  229.                         if (d < this.threshold) count++;
  230.                     }
  231.                
  232.                 //convert the targets to scalar
  233.                 int[] targetsArray=new int[targets.size()];    
  234.                
  235.                 for(int i = 0;i < targetsArray.length; i++)
  236.                     targetsArray[i] = targets.get(i);
  237.                
  238.                 if (count >= this.number && this.number > 0)
  239.                     return game.getNextPacManDir(game.getTarget(
  240.                             current,targetsArray, true, Game.DM.PATH),
  241.                             true, Game.DM.PATH);   
  242.                
  243.                 else return -1;
  244.                
  245.             }
  246.         };
  247.        
  248.         //insert the actions in the collection
  249.         this.actions.add(a1);
  250.         this.actions.add(a2);
  251.         this.actions.add(a3);
  252.         this.actions.add(a4);      
  253.        
  254.         //sort the items
  255.         java.util.Collections.sort(this.actions);
  256.     }
  257.  
  258.     @Override
  259.     public int getAction(Game game, long timeDue) {
  260.        
  261.         int direction = 0;
  262.        
  263.         for (FenotypeAction a : this.actions) {
  264.             int d = a.getAction(game);
  265.             if (d > -1) {
  266.                 direction = d;
  267.                 break;
  268.             }
  269.         }
  270.        
  271.        
  272.         return direction;
  273.     }
  274.    
  275.     public String toString() {
  276.         return Arrays.toString(this.genotype);
  277.     }
  278.    
  279. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top