Advertisement
Aseron

MARSAKK

Nov 7th, 2018
455
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 11.76 KB | None | 0 0
  1. import java.util.LinkedList;
  2. import java.util.List;
  3. import java.util.ArrayList;
  4. import java.util.Random;
  5. import java.util.Iterator;
  6.  
  7. import com.sun.javafx.runtime.SystemProperties;
  8.  
  9. import game.engine.utils.Pair;
  10. import game.mc.MCAction;
  11. import game.mc.MCPlayer;
  12. import game.mc.MCGame;
  13.  
  14. public class h353036 extends MCPlayer {
  15.  
  16.   private MCAction prevAction;
  17.   private MCAction shadowPrevAction;
  18.   private int myScore;
  19.   private int shadowMyScore;
  20.   private int enemyScore;
  21.   private int shadowEnemyScore;
  22.   private MCAction bestAction = null;
  23.   private int playersParity = 1;
  24.   private int deep = 0;
  25.   private MCAction lastAction = null;
  26.   private List<MCAction> ancestors = new ArrayList<MCAction>();
  27.   private int count = 0;
  28.   Paritys par;
  29.  
  30.  
  31.  
  32.   public h353036(int color, int[][] board, Random r) {
  33.     super(color, board, r);
  34.     myScore = 0;
  35.     enemyScore = 0;
  36.  
  37.   }
  38.  
  39.  
  40.   public class Paritys
  41.     {
  42.  
  43.         Pair<Integer, Integer> IDandSIZE;
  44.         int size;
  45.    
  46.         public Paritys(int ID, int size)
  47.         {
  48.             this.IDandSIZE = new Pair<>(ID, size);
  49.             this.size = size;
  50.            
  51.         }
  52.    
  53.  
  54.         public void decrementSize(){
  55.             size--;
  56.         }
  57.         public boolean isEmpty(){
  58.             if(size == 0){
  59.                 return true;
  60.             }
  61.             return false;
  62.         }
  63.    
  64.     }
  65.  
  66.   public class Node
  67.     {
  68.         List<Node> children = null;
  69.         MCAction ancestor = null;
  70.         int value;
  71.    
  72.         public Node(int value, MCAction ancestor)
  73.         {
  74.             this.ancestor = ancestor;
  75.             this.children = new LinkedList<>();
  76.             this.value = value;
  77.         }
  78.    
  79.         public void addChild(Node child)
  80.         {
  81.             children.add(child);
  82.         }
  83.  
  84.         public int getValue(int value){
  85.             return this.value;
  86.           }
  87.  
  88.         public void setValue(int value){
  89.           this.value = value;
  90.         }
  91.  
  92.         public MCAction getAncestor(){
  93.             return this.ancestor;
  94.         }
  95.  
  96.        
  97.    
  98.     }
  99.    
  100.  
  101.   @Override
  102.   public MCAction getAction(List<Pair<Integer, MCAction>> prevActions) {
  103.  
  104.     int prevScore = 0;
  105.     for (Pair<Integer, MCAction> action : prevActions) {
  106.       if (action.second == null) {
  107.         continue;
  108.       }
  109.       prevAction = action.second;
  110.       boolean samePart = (action.second.x1 < 4 && action.second.x2 < 4) || (4 <= action.second.x1 && 4 <= action.second.x2);
  111.       if (samePart) {
  112.         // merge / move
  113.         board[action.second.x2][action.second.y2] += board[action.second.x1][action.second.y1];
  114.       } else {
  115.         // capture / move
  116.         prevScore = board[action.second.x2][action.second.y2];
  117.         board[action.second.x2][action.second.y2] = board[action.second.x1][action.second.y1];
  118.       }
  119.       board[action.second.x1][action.second.y1] = MCGame.empty;
  120.     }
  121.     enemyScore += prevScore;
  122.  
  123.  
  124.  
  125.     int maxScore = 0;
  126.     List<Pair<Integer, MCAction>> actions = new LinkedList<Pair<Integer, MCAction>>();
  127.     // generate actions
  128.     for (int i = 4 * color; i < 4 * (color + 1); i++) {
  129.       for (int j = 0; j < 4; j++) {
  130.         if (board[i][j] != MCGame.empty) {
  131.           for (int i2 = 0; i2 < 8; i2++) {
  132.             for (int j2 = 0; j2 < 4; j2++) {
  133.               MCAction action = new MCAction(i, j, i2, j2);
  134.               int score = -1;
  135.               try {
  136.                 score = score(board, prevAction, prevScore, color, action, myScore - enemyScore);
  137.               } catch (Exception e) {
  138.                 System.out.println("ACTION: " + action);
  139.                 e.printStackTrace();
  140.                 System.exit(1);
  141.               }
  142.               if (maxScore < score) {
  143.                 maxScore = score;
  144.                 actions.clear();
  145.               }
  146.               if (maxScore == score) {
  147.                 actions.add(new Pair<Integer, MCAction>(maxScore, action));
  148.                
  149.               }
  150.             }
  151.           }
  152.         }
  153.       }
  154.     }
  155.  
  156.         List<Integer> indexList = new ArrayList<Integer>();
  157.         List<Integer> scoreList = new ArrayList<Integer>();
  158.         List<MCAction> actionList = new ArrayList<MCAction>();
  159.  
  160.         int iteratorIndex = 0;
  161.         Iterator<Pair<Integer,MCAction>> it = actions.iterator();
  162.         while (it.hasNext()) {
  163.             Pair<Integer, MCAction> pair = it.next();
  164.             scoreList.add(pair.first);
  165.             actionList.add(pair.second);
  166.             indexList.add(iteratorIndex);
  167.             iteratorIndex++ ;
  168.            
  169.         }
  170.    
  171.        
  172.         MCAction localAction = null;
  173.         int localMaxScore = Integer.MIN_VALUE;
  174.         int localIndex = Integer.MIN_VALUE;
  175.         int[][] shadowBoard = board;
  176.  
  177.         MCAction action = null;
  178.  
  179.         shadowMyScore = myScore;
  180.         shadowEnemyScore = enemyScore;
  181.  
  182.         for(int i = 0; i < actionList.size(); i++){
  183.  
  184.             localAction = actionList.get(i);
  185.             localMaxScore = scoreList.get(i);
  186.             localIndex = indexList.get(i);
  187.  
  188.             action = getShadowAction(localAction, localMaxScore, shadowMyScore, shadowEnemyScore, localIndex, shadowBoard, 1);
  189.  
  190.  
  191.         }
  192.  
  193.         for(int i = 0; i < 8; i++){
  194.               System.out.println(board[i][0] + "" + board[i][1] + "" + board[i][2] + "" + board[i][3]);
  195.         }
  196.        
  197.         if (maxScore == 0 && board[action.x2][action.y2] != MCGame.empty) {
  198.             board[action.x2][action.y2] += board[action.x1][action.y1];
  199.           } else {
  200.             board[action.x2][action.y2] = board[action.x1][action.y1];
  201.           }
  202.           board[action.x1][action.y1] = MCGame.empty;
  203.           myScore += maxScore;
  204.  
  205.     return action;
  206.   }
  207.  
  208.  
  209.   public MCAction getShadowAction(MCAction localAction, int localMaxScore, int shadowMyScore, int shadowEnemyScore, int localIndex, int[][] shadowBoard, int isFirst) {
  210.  
  211. //!!!!!!!!!!!!!!!!!!!!!!!
  212. //!!!!!!!!!!!!!!!!!!!!!!!
  213. //!!!!!!!!!!!!!!!!!!!!!!!
  214. //!!!!!!!!!!!!!!!!!!!!!!!
  215. //!!!!!!!!!!!!!!!!!!!!!!!
  216. //!!!!!!!!!!!!!!!!!!!!!!!
  217. //!!!!!!!!!!!!!!!!!!!!!!!
  218. //!!!!!!!!!!!!!!!!!!!!!!!
  219.     /*itt kellene valahogy allítani a player parityt, de mivel tobb action-re is meg van hivva, igy nem tudom
  220.     hogy kellene megallapitani, hogy mikor melyik jatekos jon, illetve a deep inkrementalasa (lejjebb)
  221.     is hasonlo oknal fogva lesz rossz, es mar csak ez hianyzik, hogy faba tudjam epiteni*/
  222. //!!!!!!!!!!!!!!!!!!!!!!!
  223. //!!!!!!!!!!!!!!!!!!!!!!!
  224. //!!!!!!!!!!!!!!!!!!!!!!!
  225. //!!!!!!!!!!!!!!!!!!!!!!!
  226. //!!!!!!!!!!!!!!!!!!!!!!!
  227. //!!!!!!!!!!!!!!!!!!!!!!!
  228. //!!!!!!!!!!!!!!!!!!!!!!!
  229. //!!!!!!!!!!!!!!!!!!!!!!!
  230. //!!!!!!!!!!!!!!!!!!!!!!!
  231. //!!!!!!!!!!!!!!!!!!!!!!!
  232.  
  233.  
  234.  
  235.     if(isFirst == 1){
  236.         ancestors.add(localAction);
  237.     }
  238.  
  239.     if (localMaxScore == 0 && board[localAction.x2][localAction.y2] != MCGame.empty) {
  240.         shadowBoard[localAction.x2][localAction.y2] += shadowBoard[localAction.x1][localAction.y1];
  241.       } else {
  242.         shadowBoard[localAction.x2][localAction.y2] = shadowBoard[localAction.x1][localAction.y1];
  243.       }
  244.       shadowBoard[localAction.x1][localAction.y1] = MCGame.empty;
  245.  
  246.       if(playersParity % 2 == 1){
  247.         shadowMyScore += localMaxScore;
  248.       }else{
  249.         shadowEnemyScore += localMaxScore;
  250.       }
  251.  
  252.       int[][] reversedShadowBoard;
  253.  
  254.       for(int i = 0; i < 8; i++){
  255.           for(int j = 0; j < 4; j++){
  256.                 reversedShadowBoard[i][j] = shadowBoard[7-i][3-j];
  257.           }
  258.       }
  259.  
  260.  
  261.  
  262.  
  263.   // innentol az ellenfel szemevel nezzuk a tablat
  264.  
  265.       int shadowEnemyMaxScore = 0;
  266.       List<Pair<Integer, MCAction>> shadowEnemyActions = new LinkedList<Pair<Integer, MCAction>>();
  267.       // generate shadowEnemyActions
  268.       for (int i = 4 * color; i < 4 * (color + 1); i++) {
  269.         for (int j = 0; j < 4; j++) {
  270.           if (reversedShadowBoard[i][j] != MCGame.empty) {
  271.             for (int i2 = 0; i2 < 8; i2++) {
  272.               for (int j2 = 0; j2 < 4; j2++) {
  273.                 MCAction action = new MCAction(i, j, i2, j2);
  274.                 int score = -1;
  275.                 try {
  276.                   score = score(reversedShadowBoard, localAction, localMaxScore, color, action, shadowEnemyScore - shadowMyScore);
  277.                 //score = score(board, prevAction, prevScore, color, action, myScore - enemyScore);
  278.                 } catch (Exception e) {
  279.                   System.out.println("ACTION: " + action);
  280.                   e.printStackTrace();
  281.                   System.exit(1);
  282.                 }
  283.                 if (shadowEnemyMaxScore < score) {
  284.                     shadowEnemyMaxScore = score;
  285.                     shadowEnemyActions.clear();
  286.                 }
  287.                 if (shadowEnemyMaxScore == score) {
  288.                     shadowEnemyActions.add(new Pair<Integer, MCAction>(shadowEnemyMaxScore, action));
  289.                  
  290.                 }
  291.               }
  292.             }
  293.           }
  294.         }
  295.       }
  296.  
  297.           List<Integer> indexEnemyList = new ArrayList<Integer>();
  298.           List<Integer> scoreEnemyList = new ArrayList<Integer>();
  299.           List<MCAction> actionEnemyList = new ArrayList<MCAction>();
  300.  
  301.           int iteratorIndex = 0;
  302.           Iterator<Pair<Integer,MCAction>> it = shadowEnemyActions.iterator();
  303.           while (it.hasNext()) {
  304.               Pair<Integer, MCAction> pair = it.next();
  305.               scoreEnemyList.add(pair.first);
  306.               actionEnemyList.add(pair.second);
  307.               indexEnemyList.add(iteratorIndex);
  308.               iteratorIndex++ ;
  309.              
  310.           }
  311.      
  312.          
  313.           MCAction localEnemyAction = null;
  314.           int localEnemyMaxScore = Integer.MIN_VALUE;
  315.           int localEnemyIndex = Integer.MIN_VALUE;
  316.           int[][] shadowEnemyBoard = reversedShadowBoard;
  317.  
  318.           MCAction action = null;
  319.  
  320.           for(int i = 0; i < actionEnemyList.size(); i++){
  321.  
  322.             localEnemyAction = actionEnemyList.get(i);
  323.             localEnemyMaxScore = scoreEnemyList.get(i);
  324.             localEnemyIndex = indexEnemyList.get(i);
  325.            
  326.             if(localEnemyAction == null || localEnemyMaxScore == Integer.MIN_VALUE || localEnemyIndex == Integer.MIN_VALUE){
  327.                 if(playersParity % 2 == 1){
  328.                     break; //csak akkor torjon meg, ha az en lepesemet akarja visszaadni
  329.                 }else{
  330.                     return lastAction; //ha az ellenfelet, akkor a legutobbi lepesemet adja vissza
  331.                 }
  332.             }else if(deep<4){
  333.                 deep ++;
  334.                 action = getShadowAction(localEnemyAction, localEnemyMaxScore, shadowEnemyScore, shadowMyScore, localEnemyIndex, shadowEnemyBoard, 2)
  335.                
  336.             }else{
  337.                 break;
  338.             }
  339.  
  340.           }
  341.  
  342.           action = actionEnemyList.size() == 0 ? null : actionEnemyList.get(r.nextInt(actionEnemyList.size()));
  343.           lastAction = action;
  344.      
  345.     return action;
  346.   }
  347.  
  348.  
  349.  
  350.  
  351.  
  352.   private int score(int[][] board, MCAction prevAction, int prevScore, int color, MCAction action, int scoreDiff) {
  353.     int[][] figures = new int[2][3];
  354.     for (int i = 0; i < board.length; i++) {
  355.       for (int j = 0; j < board[i].length; j++) {
  356.         if (board[i][j] != MCGame.empty) {
  357.           if (i < board.length / 2) {
  358.             figures[0][board[i][j] - 1]++;
  359.           } else {
  360.             figures[1][board[i][j] - 1]++;
  361.           }
  362.         }
  363.       }
  364.     }
  365.     int numFigures = figures[color][0] + figures[color][1] + figures[color][2];
  366.     int score = MCGame.score(board, figures, prevAction, prevScore, color, action);
  367.     boolean samePart = (action.x1 < 4 && action.x2 < 4) || (4 <= action.x1 && 4 <= action.x2);
  368.     if (0 <= score && !samePart && numFigures == 1) {
  369.       if (scoreDiff < 0) {
  370.         score = -1;
  371.       } else {
  372.         score = 10;
  373.       }
  374.     }
  375.     return score;
  376.   }
  377.  
  378. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement