Ai advances

This commit is contained in:
Malte Tammena 2017-10-23 12:38:52 +02:00
parent cbd763ac47
commit 19bcbec099

View file

@ -66,14 +66,18 @@ public class MalteAI implements Player{
} }
System.out.println(Arrays.toString(weights)); System.out.println(Arrays.toString(weights));
for (int i = 0; i < weights.length; i++) { for (int i = 0; i < weights.length; i++) {
if (Math.abs(max - weights[i]) < 0.01) { if (Math.abs(max - weights[i]) < 0.000001) {
return i; return i;
} }
} }
return 0; return 0;
} }
public double calculateWeight(int[][] board, int row) { public double calculateWeight(int[][] board, int column) {
double W_START = 1.0;
double W_ILLEGAL = -1.0;
double W_INSTANT_WIN = 2;
double W_PREVENT_INSTANT_WIN = 1.9;
/* The amount of equal ideas, stretching out in star-like form. /* The amount of equal ideas, stretching out in star-like form.
* ^ ^ ^ * ^ ^ ^
* \ | / * \ | /
@ -86,42 +90,74 @@ public class MalteAI implements Player{
*/ */
int[] nrs = new int[8]; int[] nrs = new int[8];
int[] ids = new int[8]; int[] ids = new int[8];
double weight = W_START;
// Prever a place in the center;
weight *= 1.0 - Math.abs(3.0 - column) / (3.0 * 100.0);
// Relative positions like (-1, -1), (0, -1), etc.
Position[] relAround = Position.getRelCirclePositions(); Position[] relAround = Position.getRelCirclePositions();
Position thisPos = getLastEmpty(board, row); // The position we're looking at
Position thisPos = getLastEmpty(board, column);
// There is no space left in this row.
if (thisPos == null) { if (thisPos == null) {
return -1.0; weight *= W_ILLEGAL;
return weight;
} }
// Collect information about our surroundings.
for (int i = 0; i < nrs.length; i++) { for (int i = 0; i < nrs.length; i++) {
// The postion around us we're collecting information from.
Position curPos = thisPos.add(relAround[i]); Position curPos = thisPos.add(relAround[i]);
// Check whether this position is on the board at all.
if (isPosOnBoard(curPos)) { if (isPosOnBoard(curPos)) {
// Get the ID in this position.
ids[i] = getIDFromBoard(board, curPos); ids[i] = getIDFromBoard(board, curPos);
// Get the number of IDs in this direction.
nrs[i] = countIDsInDir(board, ids[i], curPos, relAround[i]); nrs[i] = countIDsInDir(board, ids[i], curPos, relAround[i]);
} else { } else {
// If not on board, -1 is the way to go.
ids[i] = -1; ids[i] = -1;
nrs[i] = -1; nrs[i] = -1;
} }
} }
for (int i = 0; i < 8; i++) { // Look for problems/options in one direction at a time.
if (ids[i] == this.id && for (int i = 0; i < nrs.length; i++) {
nrs[i] == 3) { if (nrs[i] == 3) {
return 1.0; if (ids[i] == this.id) {
} else if (ids[i] == this.enemyID && // We can win like this!
nrs[i] == 3) { weight *= W_INSTANT_WIN;
return 0.9; } else if (ids[i] == this.enemyID) {
// We can at least prevent him from winning.
weight *= W_PREVENT_INSTANT_WIN;
}
} }
} }
for (int i = 0; i < 4; i++) { // Look for problems/options in two directions at a time.
for (int i = 0; i < nrs.length / 2; i++) {
// Same ID on opposite sides.
if (ids[i] == ids[i + 4]) { if (ids[i] == ids[i + 4]) {
// Almost a finished row.
if (nrs[i] + nrs[i + 4] > 3) { if (nrs[i] + nrs[i + 4] > 3) {
if (ids[i] == this.id) { if (ids[i] == this.id) {
return 1.0; // Its our ID.
weight *= W_INSTANT_WIN;
} else if (ids[i] == this.enemyID) { } else if (ids[i] == this.enemyID) {
return 0.9; // Its the enemy's ID.
weight *= W_PREVENT_INSTANT_WIN;
} }
} }
} }
} }
return 0.0; // Maybe we get lucky TODO: Expand this.
int nrOfMyIDAround = 0;
int nrOfEnemyIDAround = 0;
for (int i = 0; i < ids.length; i++) {
if (ids[i] == this.id) {
nrOfMyIDAround++;
} else if (ids[i] == this.enemyID) {
nrOfEnemyIDAround++;
}
}
weight *= 1.0 + (nrOfEnemyIDAround + nrOfMyIDAround) / (8.0 * 10.0);
return weight;
} }
/** /**