Implementing alternate ai

This commit is contained in:
Malte Tammena 2017-10-21 22:24:15 +02:00
parent dfc1aad31b
commit cbd763ac47
2 changed files with 123 additions and 1 deletions

View file

@ -4,6 +4,7 @@ import java.util.Random;
import java.util.Set; import java.util.Set;
import java.util.HashSet; import java.util.HashSet;
import java.util.Arrays; import java.util.Arrays;
import java.lang.Math;
import player.Player; import player.Player;
import game.Game; import game.Game;
@ -58,14 +59,117 @@ public class MalteAI implements Player{
double[] weights = new double[Game.GAME_COLUMNS]; double[] weights = new double[Game.GAME_COLUMNS];
for (int i = 0; i < weights.length; i++) { for (int i = 0; i < weights.length; i++) {
weights[i] = calculateWeight(board, i); weights[i] = calculateWeight(board, i);
}
double max = -1;
for (double d: weights) {
max = max > d ? max: d;
}
System.out.println(Arrays.toString(weights));
for (int i = 0; i < weights.length; i++) {
if (Math.abs(max - weights[i]) < 0.01) {
return i;
}
} }
return 0; return 0;
} }
public double calculateWeight(int[][] board, int row) { public double calculateWeight(int[][] board, int row) {
/* The amount of equal ideas, stretching out in star-like form.
* ^ ^ ^
* \ | /
* 701
* <-6X2->
* 543
* / | \
* V V V
* ids contains the id of the direction.
*/
int[] nrs = new int[8];
int[] ids = new int[8];
Position[] relAround = Position.getRelCirclePositions();
Position thisPos = getLastEmpty(board, row);
if (thisPos == null) {
return -1.0;
}
for (int i = 0; i < nrs.length; i++) {
Position curPos = thisPos.add(relAround[i]);
if (isPosOnBoard(curPos)) {
ids[i] = getIDFromBoard(board, curPos);
nrs[i] = countIDsInDir(board, ids[i], curPos, relAround[i]);
} else {
ids[i] = -1;
nrs[i] = -1;
}
}
for (int i = 0; i < 8; i++) {
if (ids[i] == this.id &&
nrs[i] == 3) {
return 1.0;
} else if (ids[i] == this.enemyID &&
nrs[i] == 3) {
return 0.9;
}
}
for (int i = 0; i < 4; i++) {
if (ids[i] == ids[i + 4]) {
if (nrs[i] + nrs[i + 4] > 3) {
if (ids[i] == this.id) {
return 1.0;
} else if (ids[i] == this.enemyID) {
return 0.9;
}
}
}
}
return 0.0; return 0.0;
} }
/**
*
*/
private Position getLastEmpty(int[][] board, int column) {
if (board[column][0] != 0) {
return null;
}
int row = 0;
while (row < Game.GAME_ROWS - 1 &&
board[column][row + 1] == 0) {
row++;
}
return new Position(column, row);
}
/**
*
*/
private int countIDsInDir(int[][] board, int id, Position pos, Position dir) {
if (isPosOnBoard(pos) &&
board[pos.getPosX()][pos.getPosY()] == id) {
return countIDsInDir(board, id, pos.add(dir), dir) + 1;
}
return 0;
}
/**
*
*/
private boolean isPosOnBoard(Position pos) {
if (pos.getPosX() <= Game.GAME_COLUMNS - 1 &&
pos.getPosX() >= 0 &&
pos.getPosY() <= Game.GAME_ROWS - 1 &&
pos.getPosY() >= 0) {
return true;
}
return false;
}
/**
*
*/
private int getIDFromBoard(int[][] board, Position pos) {
return board[pos.getPosX()][pos.getPosY()];
}
/** /**
* Copies the given board. * Copies the given board.
* *

View file

@ -20,8 +20,26 @@ public class Position {
return this.posY; return this.posY;
} }
public Position add(Position pos) {
return new Position(this.getPosX() + pos.getPosX(),
this.getPosY() + pos.getPosY());
}
@Override @Override
public String toString() { public String toString() {
return String.format("(%d, %d)", posX, posY); return String.format("(%d, %d)", posX, posY);
} }
public static Position[] getRelCirclePositions() {
return new Position[]{
new Position(0, -1),
new Position(1, -1),
new Position(1, 0),
new Position(1, 1),
new Position(0, 1),
new Position(-1, 1),
new Position(-1, 0),
new Position(-1, -1)
};
}
} }