Advertisement
fabis_sparks

4inrow

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