Advertisement
fabis_sparks

FourInRow

Jan 10th, 2017
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.35 KB | None | 0 0
  1. // Класс компьютер
  2.  
  3.  
  4. import ch.aplu.jgamegrid.*;
  5. import java.util.*;
  6.  
  7. public class Bot extends Player
  8. {
  9.   protected Bot(int thisPlayer, GameGrid gg)
  10.   {
  11.     super(gg);
  12.     this.thisPlayer = thisPlayer;
  13.     this.enemyPlayer = (thisPlayer + 1) % 2;
  14.   }
  15.  
  16.   private ArrayList<Integer> getPossibleSolutions(int checkPlayer, int[][] iboard) // возможные ходы
  17.   {
  18.     ArrayList<Integer> list = new ArrayList<Integer>();   // возможные ходы
  19.     for (int column = 0; column < 7; column++)
  20.     {
  21.       int row = insertToken(column,iboard); // получаем № позиции, куда опустится фишка при ее помещении в данный столбец
  22.       if (row != -1) list.add(column);
  23.     }
  24.     return list;  
  25.   }
  26.  
  27.   //рекурсивная функция оценки хода
  28.   private double calcAction(int col, int checkPlayer, int[][] iboard, int depth)
  29.   {
  30.     if (depth==0) return 0; //достигнута заданная глубина - оценка 0
  31.      
  32.     int row = insertToken(col,iboard); // получаем № позиции, куда опустится фишка при ее помещении в данный столбец
  33.  
  34.     //сделать ход
  35.     int[][] iboard2 = new int[7][6];
  36.     for (int i=0; i<7; i++)
  37.     {
  38.         for (int j=0; j<6; j++)
  39.         {
  40.             iboard2[i][j] = iboard[i][j];
  41.         }
  42.     }
  43.     iboard2[col][row] = checkPlayer;
  44.     int checkPlayer2 = (checkPlayer + 1) % 2;
  45.  
  46.     if (checkXInARow(col, row, 4, checkPlayer, iboard2))  //получена линия из четырех фишек
  47.     {
  48.       return 100; //выигрыш
  49.     }
  50.    
  51.      
  52.     ArrayList<Integer> possibleSolutions = getPossibleSolutions(checkPlayer2,iboard2); // возможные ходы
  53.     if (possibleSolutions.isEmpty())
  54.     {
  55.       return 0; //ничья
  56.     }
  57.    
  58.     //рекурсивная оценка возможных ходов противника
  59.     Iterator<Integer> posSolu = possibleSolutions.iterator(); // итератор по возможным ходам игрока
  60.     int possibleColumn;
  61.     double maxValue = 0;
  62.     int column = -1;
  63.     while (posSolu.hasNext())
  64.     {
  65.       possibleColumn = posSolu.next();
  66.       double value = calcAction(possibleColumn,checkPlayer2,iboard2, depth-1); //оценка хода
  67.       if (column == -1 || value > maxValue)
  68.       {
  69.         // лучший ход
  70.         maxValue = value;
  71.         column = possibleColumn;
  72.       }
  73.       if (maxValue==100) break;
  74.     }
  75.     return -maxValue * 0.99; //оценка лучшего хода противника с противоположным знаком,
  76.       //уменьшенная на 1 процент (чем дальше ход - тем меньше его значение)
  77.   }
  78.  
  79.   public int getColumn() // получение колонки для следующего хода
  80.   {
  81.     if (isBoardEmpty())
  82.     {
  83.       return 4;
  84.     }
  85.    
  86.     int[][] iboard = new int[7][6];
  87.     for (int i=0; i<7; i++)
  88.     {
  89.         for (int j=0; j<6; j++)
  90.         {
  91.             iboard[i][j] = board[i][j].getPlayer();
  92.         }
  93.     }
  94.    
  95.     ArrayList<Integer> possibleSolutions = getPossibleSolutions(thisPlayer,iboard); // возможные ходы
  96.      
  97.     Iterator<Integer> posSolu = possibleSolutions.iterator(); // итератор по возможным ходам игрока
  98.     int possibleColumn;
  99.     double maxValue = 0;
  100.     boolean first = true;
  101.     ArrayList<Integer> bestSolutions = new ArrayList<Integer>();
  102.     while (posSolu.hasNext())
  103.     {
  104.       possibleColumn = posSolu.next();
  105.       double value = calcAction(possibleColumn,thisPlayer,iboard, //оценка хода
  106.               Level==1 ? 2 : 5);  //уровень
  107.       if (first || value >= maxValue)
  108.       {
  109.           if (first || value > maxValue)
  110.           {
  111.               bestSolutions.clear();
  112.               maxValue = value;
  113.               first = false;
  114.           }
  115.           bestSolutions.add(possibleColumn);
  116.       }
  117.     }    
  118.    
  119.     // более предпочтительны ходы ближе к центру поля
  120.     int nrOfSolutions = bestSolutions.size();
  121.     for (int i = 0; i < nrOfSolutions; i++)
  122.     {
  123.       if (bestSolutions.get(i) > 1 && bestSolutions.get(i) < 5)
  124.           bestSolutions.add(bestSolutions.get(i));
  125.     }
  126.  
  127.     // выбираем случайный из лучших ходов
  128.     Collections.shuffle(bestSolutions);
  129.     return (int)bestSolutions.get(0);
  130.   }
  131. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement