Worked on Patterns for the ai
This commit is contained in:
parent
6232484d63
commit
33c16320a9
1
Makefile
1
Makefile
|
@ -20,6 +20,7 @@ src/player/Player.java \
|
||||||
src/player/malte/MalteAI.java \
|
src/player/malte/MalteAI.java \
|
||||||
src/player/malte/Pattern.java \
|
src/player/malte/Pattern.java \
|
||||||
src/player/malte/Item.java \
|
src/player/malte/Item.java \
|
||||||
|
src/player/malte/PatternGenerator.java \
|
||||||
src/player/maurizio/MaurizioAI.java
|
src/player/maurizio/MaurizioAI.java
|
||||||
|
|
||||||
OBJECTS=$($(subst $(CLASSPATH),$(BUILDS),$(CLASSES)):.java=.class)
|
OBJECTS=$($(subst $(CLASSPATH),$(BUILDS),$(CLASSES)):.java=.class)
|
||||||
|
|
|
@ -12,6 +12,7 @@ public class MalteAI implements Player{
|
||||||
private String name;
|
private String name;
|
||||||
private Random ran;
|
private Random ran;
|
||||||
private int id;
|
private int id;
|
||||||
|
private int enemyID;
|
||||||
|
|
||||||
public MalteAI(String name){
|
public MalteAI(String name){
|
||||||
this.name = name;
|
this.name = name;
|
||||||
|
@ -20,6 +21,7 @@ public class MalteAI implements Player{
|
||||||
|
|
||||||
public void setPlayerID(int id) {
|
public void setPlayerID(int id) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
|
this.enemyID = id == 1 ? 2: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int move(int[][] board){
|
public int move(int[][] board){
|
||||||
|
@ -29,35 +31,50 @@ public class MalteAI implements Player{
|
||||||
options.remove(i);
|
options.remove(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Set<Integer> winningOptions = getWinningOptions(options, board);
|
Set<Integer> winningOptions = getRowCompletionOptions(options, board, id);
|
||||||
for (Integer i: winningOptions) {
|
for (Integer i: winningOptions) {
|
||||||
|
System.out.println("WINNING");
|
||||||
return i.intValue();
|
return i.intValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Set<Integer> preventionsOptions = getRowCompletionOptions(options, board, enemyID);
|
||||||
|
for (Integer i: preventionsOptions) {
|
||||||
|
int[][] fakeBoard = makeMove(copyBoard(board), i, id);
|
||||||
|
if (getRowCompletionOptions(options, fakeBoard, enemyID).size() == 0) {
|
||||||
|
System.out.println("PREVENTING");
|
||||||
|
return i.intValue();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
System.out.println("RANDOM");
|
||||||
return takeRandom(options).intValue();
|
return takeRandom(options).intValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
private Set<Integer> getWinningOptions(Set<Integer> options, int[][] board) {
|
private int[][] copyBoard(int[][] board) {
|
||||||
// Four in a row with one hole
|
int[][] copy = new int[board.length][board[0].length];
|
||||||
Set<Pattern> patterns = Pattern.emptySpaceGenerator(new Item(0, 0, id),
|
for (int i = 0; i < board.length; i++) {
|
||||||
new Item(1, 0, id),
|
for (int j = 0; j < board[i].length; j++) {
|
||||||
new Item(2, 0, id),
|
copy[i][j] = board[i][j];
|
||||||
new Item(3, 0, id));
|
}
|
||||||
// Four in a diagonal line from lower left to upper right with one hole
|
}
|
||||||
patterns.addAll(Pattern.emptySpaceGenerator(new Item(0, 0, id),
|
return copy;
|
||||||
new Item(-1, 1, id),
|
}
|
||||||
new Item(-2, 2, id),
|
|
||||||
new Item(-3, 3, id)));
|
private int[][] makeMove(int[][] board, int choice, int id) {
|
||||||
// Four in a diagonal line from upper left to lower right with one hole
|
int column = 0;
|
||||||
patterns.addAll(Pattern.emptySpaceGenerator(new Item(0, 0, id),
|
if (board[choice][column] != 0) {
|
||||||
new Item(1, 1, id),
|
return board;
|
||||||
new Item(2, 2, id),
|
}
|
||||||
new Item(3, 3, id)));
|
while (board[choice][column + 1] == 0) {
|
||||||
patterns.add(new Pattern(new Item(0, 0, 0),
|
column++;
|
||||||
new Item(0, 1, id),
|
}
|
||||||
new Item(0, 2, id),
|
board[choice][column] = id;
|
||||||
new Item(0, 3, id)));
|
return board;
|
||||||
Set<Pattern> matches = Pattern.matchingPatterns(patterns, board);
|
}
|
||||||
|
|
||||||
|
private Set<Integer> getRowCompletionOptions(Set<Integer> options, int[][] board, int id) {
|
||||||
|
Set<Pattern> pats = PatternGenerator.winningPatterns(id);
|
||||||
|
Set<Pattern> matches = Pattern.matchingPatterns(pats, board);
|
||||||
Set<Integer> ret = new HashSet<>();
|
Set<Integer> ret = new HashSet<>();
|
||||||
for (Pattern p: matches) {
|
for (Pattern p: matches) {
|
||||||
Set<Position> positions = p.matches(board);
|
Set<Position> positions = p.matches(board);
|
||||||
|
@ -67,7 +84,6 @@ public class MalteAI implements Player{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -102,19 +102,6 @@ public class Pattern {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Set<Pattern> emptySpaceGenerator(Item... model) {
|
|
||||||
Set<Pattern> ret = new HashSet<>();
|
|
||||||
for (int i = 0; i < model.length; i++) {
|
|
||||||
Pattern newP = new Pattern(model);
|
|
||||||
Item x = model[i];
|
|
||||||
Item newI = new Item(x.getPosX(), x.getPosY(), 0);
|
|
||||||
newP.replaceItem(x, newI);
|
|
||||||
newP.addItem(new Item(x.getPosX(), x.getPosY() + 1, new int[]{1, 2}));
|
|
||||||
ret.add(newP);
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Set<Pattern> changeID(Set<Pattern> pats, int oldID, int newID) {
|
public static Set<Pattern> changeID(Set<Pattern> pats, int oldID, int newID) {
|
||||||
Set<Pattern> ret = new HashSet<>();
|
Set<Pattern> ret = new HashSet<>();
|
||||||
for (Pattern p: pats) {
|
for (Pattern p: pats) {
|
||||||
|
|
63
src/player/malte/PatternGenerator.java
Normal file
63
src/player/malte/PatternGenerator.java
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
package player.malte;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.HashSet;
|
||||||
|
|
||||||
|
public class PatternGenerator {
|
||||||
|
|
||||||
|
private PatternGenerator() {}
|
||||||
|
|
||||||
|
public static Set<Pattern> winningPatterns(int id) {
|
||||||
|
// Four in a row with one hole
|
||||||
|
Set<Pattern> pats = PatternGenerator.emptySpaceGenerator(new Item(0, 0, id),
|
||||||
|
new Item(1, 0, id),
|
||||||
|
new Item(2, 0, id),
|
||||||
|
new Item(3, 0, id));
|
||||||
|
// Four in a diagonal line from lower left to upper right with one hole
|
||||||
|
pats.addAll(PatternGenerator.emptySpaceGenerator(new Item(0, 0, id),
|
||||||
|
new Item(-1, 1, id),
|
||||||
|
new Item(-2, 2, id),
|
||||||
|
new Item(-3, 3, id)));
|
||||||
|
// Four in a diagonal line from upper left to lower right with one hole
|
||||||
|
pats.addAll(PatternGenerator.emptySpaceGenerator(new Item(0, 0, id),
|
||||||
|
new Item(1, 1, id),
|
||||||
|
new Item(2, 2, id),
|
||||||
|
new Item(3, 3, id)));
|
||||||
|
pats.add(new Pattern(new Item(0, 0, 0),
|
||||||
|
new Item(0, 1, id),
|
||||||
|
new Item(0, 2, id),
|
||||||
|
new Item(0, 3, id)));
|
||||||
|
return pats;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Set<Pattern> emptySpaceGenerator(Item... model) {
|
||||||
|
Set<Pattern> ret = new HashSet<>();
|
||||||
|
for (int i = 0; i < model.length; i++) {
|
||||||
|
Pattern newP = new Pattern(model);
|
||||||
|
Item x = model[i];
|
||||||
|
Item newI = new Item(x.getPosX(), x.getPosY(), 0);
|
||||||
|
newP.replaceItem(x, newI);
|
||||||
|
newP.addItem(new Item(x.getPosX(), x.getPosY() + 1, new int[]{1, 2}));
|
||||||
|
ret.add(newP);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Set<Pattern> empty2SpaceGenerator(Item... model) {
|
||||||
|
Set<Pattern> ret = new HashSet<>();
|
||||||
|
for (int i = 0; i < model.length; i++) {
|
||||||
|
Pattern newP = new Pattern(model);
|
||||||
|
Item x = model[i];
|
||||||
|
Item newI = new Item(x.getPosX(), x.getPosY(), 0);
|
||||||
|
newP.replaceItem(x, newI);
|
||||||
|
newP.addItem(new Item(x.getPosX(), x.getPosY() + 1, new int[]{1, 2}));
|
||||||
|
ret.add(newP);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Set<Pattern> twoOfFourRowPatterns(int id) {
|
||||||
|
// TODO: THIS
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue