Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Класс компьютер
- import ch.aplu.jgamegrid.*;
- import java.util.*;
- public class Bot extends Player
- {
- protected Bot(int thisPlayer, GameGrid gg)
- {
- super(gg);
- this.thisPlayer = thisPlayer;
- this.enemyPlayer = (thisPlayer + 1) % 2;
- }
- private ArrayList<Integer> getPossibleSolutions(int checkPlayer, int[][] iboard) // возможные ходы
- {
- ArrayList<Integer> list = new ArrayList<Integer>(); // возможные ходы
- for (int column = 0; column < 7; column++)
- {
- int row = insertToken(column,iboard); // получаем № позиции, куда опустится фишка при ее помещении в данный столбец
- if (row != -1) list.add(column);
- }
- return list;
- }
- //рекурсивная функция оценки хода
- private double calcAction(int col, int checkPlayer, int[][] iboard, int depth)
- {
- if (depth==0) return 0; //достигнута заданная глубина - оценка 0
- int row = insertToken(col,iboard); // получаем № позиции, куда опустится фишка при ее помещении в данный столбец
- //сделать ход
- int[][] iboard2 = new int[7][6];
- for (int i=0; i<7; i++)
- {
- for (int j=0; j<6; j++)
- {
- iboard2[i][j] = iboard[i][j];
- }
- }
- iboard2[col][row] = checkPlayer;
- int checkPlayer2 = (checkPlayer + 1) % 2;
- if (checkXInARow(col, row, 4, checkPlayer, iboard2)) //получена линия из четырех фишек
- {
- return 100; //выигрыш
- }
- ArrayList<Integer> possibleSolutions = getPossibleSolutions(checkPlayer2,iboard2); // возможные ходы
- if (possibleSolutions.isEmpty())
- {
- return 0; //ничья
- }
- //рекурсивная оценка возможных ходов противника
- Iterator<Integer> posSolu = possibleSolutions.iterator(); // итератор по возможным ходам игрока
- int possibleColumn;
- double maxValue = 0;
- int column = -1;
- while (posSolu.hasNext())
- {
- possibleColumn = posSolu.next();
- double value = calcAction(possibleColumn,checkPlayer2,iboard2, depth-1); //оценка хода
- if (column == -1 || value > maxValue)
- {
- // лучший ход
- maxValue = value;
- column = possibleColumn;
- }
- if (maxValue==100) break;
- }
- return -maxValue * 0.99; //оценка лучшего хода противника с противоположным знаком,
- //уменьшенная на 1 процент (чем дальше ход - тем меньше его значение)
- }
- public int getColumn() // получение колонки для следующего хода
- {
- if (isBoardEmpty())
- {
- return 4;
- }
- int[][] iboard = new int[7][6];
- for (int i=0; i<7; i++)
- {
- for (int j=0; j<6; j++)
- {
- iboard[i][j] = board[i][j].getPlayer();
- }
- }
- ArrayList<Integer> possibleSolutions = getPossibleSolutions(thisPlayer,iboard); // возможные ходы
- Iterator<Integer> posSolu = possibleSolutions.iterator(); // итератор по возможным ходам игрока
- int possibleColumn;
- double maxValue = 0;
- boolean first = true;
- ArrayList<Integer> bestSolutions = new ArrayList<Integer>();
- while (posSolu.hasNext())
- {
- possibleColumn = posSolu.next();
- double value = calcAction(possibleColumn,thisPlayer,iboard, //оценка хода
- Level==1 ? 2 : 5); //уровень
- if (first || value >= maxValue)
- {
- if (first || value > maxValue)
- {
- bestSolutions.clear();
- maxValue = value;
- first = false;
- }
- bestSolutions.add(possibleColumn);
- }
- }
- // более предпочтительны ходы ближе к центру поля
- int nrOfSolutions = bestSolutions.size();
- for (int i = 0; i < nrOfSolutions; i++)
- {
- if (bestSolutions.get(i) > 1 && bestSolutions.get(i) < 5)
- bestSolutions.add(bestSolutions.get(i));
- }
- // выбираем случайный из лучших ходов
- Collections.shuffle(bestSolutions);
- return (int)bestSolutions.get(0);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement