- Reorganized the constructors in Move.java.
- Made the getBoardState method in Referee.java static. - Created NeuralNetworkPlayer.java, though I don't know how to make the computer use it. - Updated the Player interface to include passing the PlayerModel. Most of the current com agents ignore the data, but it is now available. - Updated the train function in PlayerModel.java.
This commit is contained in:
@@ -4,25 +4,26 @@ import model.Board;
|
||||
import model.Move;
|
||||
import model.comPlayer.generator.AlphaBetaMoveGenerator;
|
||||
import model.comPlayer.generator.MoveGenerator;
|
||||
import model.playerModel.PlayerModel;
|
||||
|
||||
public class AlphaBetaComPlayer implements Player {
|
||||
private MoveGenerator moveGenerator = new AlphaBetaMoveGenerator();
|
||||
|
||||
@Override
|
||||
public Move getMove(Board board) {
|
||||
return moveGenerator.genMove(board, false);
|
||||
}
|
||||
private final MoveGenerator moveGenerator = new AlphaBetaMoveGenerator();
|
||||
|
||||
@Override
|
||||
public void denyMove() {
|
||||
throw new UnsupportedOperationException("Not implemented");
|
||||
}
|
||||
|
||||
@Override
|
||||
public Move getMove(Board board, PlayerModel player) {
|
||||
return moveGenerator.genMove(board, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isReady() {
|
||||
return true; // always ready to play a random valid move
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Alpha-Beta ComPlayer";
|
||||
|
||||
@@ -1,32 +1,16 @@
|
||||
package model.comPlayer;
|
||||
|
||||
import model.Board;
|
||||
import model.Board.TileColor;
|
||||
import model.CellPointer;
|
||||
import model.Move;
|
||||
import model.Board.TileColor;
|
||||
|
||||
import model.playerModel.PlayerModel;
|
||||
|
||||
public class HumanPlayer implements Player {
|
||||
private CellPointer cell = CellPointer.NONE;
|
||||
|
||||
private boolean ready = false;
|
||||
private TileColor color = TileColor.BLUE;
|
||||
|
||||
@Override
|
||||
public void denyMove() {
|
||||
ready = false;
|
||||
}
|
||||
|
||||
public TileColor getColor() {
|
||||
return color;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Move getMove(Board board) {
|
||||
ready = false;
|
||||
return new Move(cell, color);
|
||||
|
||||
}
|
||||
private boolean ready = false;
|
||||
|
||||
public void decrementColor() {
|
||||
TileColor[] colors = Board.TileColor.values();
|
||||
@@ -47,6 +31,22 @@ public class HumanPlayer implements Player {
|
||||
color = colors[currentColor];
|
||||
}
|
||||
|
||||
@Override
|
||||
public void denyMove() {
|
||||
ready = false;
|
||||
}
|
||||
|
||||
public TileColor getColor() {
|
||||
return color;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Move getMove(Board board, PlayerModel player) {
|
||||
ready = false;
|
||||
return new Move(color, cell);
|
||||
|
||||
}
|
||||
|
||||
public void incrementColor() {
|
||||
TileColor[] colors = Board.TileColor.values();
|
||||
int currentColor = -1;
|
||||
|
||||
@@ -4,29 +4,30 @@ import model.Board;
|
||||
import model.Move;
|
||||
import model.comPlayer.generator.MinimaxMoveGenerator;
|
||||
import model.comPlayer.generator.MoveGenerator;
|
||||
import model.playerModel.PlayerModel;
|
||||
|
||||
public class MinimaxComPlayer implements Player{
|
||||
private MoveGenerator moveGenerator = new MinimaxMoveGenerator();
|
||||
public class MinimaxComPlayer implements Player {
|
||||
private final MoveGenerator moveGenerator = new MinimaxMoveGenerator();
|
||||
|
||||
public MinimaxComPlayer() {
|
||||
super();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Move getMove(Board board) {
|
||||
return moveGenerator.genMove(board, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void denyMove() {
|
||||
throw new UnsupportedOperationException("Not implemented");
|
||||
}
|
||||
|
||||
@Override
|
||||
public Move getMove(Board board, PlayerModel player) {
|
||||
return moveGenerator.genMove(board, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isReady() {
|
||||
return true; // always ready to play a random valid move
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Minimax ComPlayer";
|
||||
|
||||
@@ -3,19 +3,24 @@ package model.comPlayer;
|
||||
import java.util.Random;
|
||||
|
||||
import model.Board;
|
||||
import model.Board.TileColor;
|
||||
import model.CellPointer;
|
||||
import model.Move;
|
||||
import model.Board.TileColor;
|
||||
|
||||
import model.playerModel.PlayerModel;
|
||||
|
||||
public class MonteCarloComPlayer implements Player {
|
||||
private final Random rand = new Random();
|
||||
|
||||
@Override
|
||||
public Move getMove(Board board) {
|
||||
return getRandomMove(board,true);
|
||||
public void denyMove() {
|
||||
throw new UnsupportedOperationException("Not implemented");
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public Move getMove(Board board, PlayerModel player) {
|
||||
return getRandomMove(board, true);
|
||||
}
|
||||
|
||||
public Move getRandomMove(Board board, boolean isCompTurn) {
|
||||
TileColor tile = TileColor.BLUE;
|
||||
int r = -1;
|
||||
@@ -42,19 +47,14 @@ public class MonteCarloComPlayer implements Player {
|
||||
tile = TileColor.YELLOW;
|
||||
}
|
||||
|
||||
return new Move(new CellPointer(r, c), tile);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void denyMove() {
|
||||
throw new UnsupportedOperationException("Not implemented");
|
||||
return new Move(tile, new CellPointer(r, c));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isReady() {
|
||||
return true; // always ready to play a random valid move
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Monte Carlo ComPlayer";
|
||||
|
||||
91
src/model/comPlayer/NeuralNetworkPlayer.java
Normal file
91
src/model/comPlayer/NeuralNetworkPlayer.java
Normal file
@@ -0,0 +1,91 @@
|
||||
package model.comPlayer;
|
||||
|
||||
import model.Board;
|
||||
import model.Board.TileColor;
|
||||
import model.Move;
|
||||
import model.Referee;
|
||||
import model.playerModel.Node;
|
||||
import model.playerModel.PlayerModel;
|
||||
|
||||
public class NeuralNetworkPlayer implements Player {
|
||||
|
||||
public static int getSmallest(double[] list) {
|
||||
int index = 0;
|
||||
|
||||
for (int i = 0; i < list.length; i++) {
|
||||
if (list[index] < list[i]) {
|
||||
index = i;
|
||||
}
|
||||
}
|
||||
|
||||
return index;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void denyMove() {
|
||||
throw new UnsupportedOperationException("Not implemented");
|
||||
}
|
||||
|
||||
@Override
|
||||
public Move getMove(Board board, PlayerModel player) {
|
||||
Move mv = null;
|
||||
|
||||
Node[] nodes = player.getOutputNodes(Referee.getBoardState(board));
|
||||
|
||||
TileColor color = TileColor.BLUE;
|
||||
|
||||
double[] colorStrengths = new double[4];
|
||||
colorStrengths[0] = nodes[0].strength();
|
||||
colorStrengths[1] = nodes[1].strength();
|
||||
colorStrengths[2] = nodes[2].strength();
|
||||
colorStrengths[3] = nodes[3].strength();
|
||||
|
||||
switch (getSmallest(colorStrengths)) {
|
||||
case 1:
|
||||
color = TileColor.GREEN;
|
||||
break;
|
||||
case 2:
|
||||
color = TileColor.RED;
|
||||
break;
|
||||
case 3:
|
||||
color = TileColor.YELLOW;
|
||||
break;
|
||||
case 0:
|
||||
default:
|
||||
color = TileColor.BLUE;
|
||||
}
|
||||
|
||||
int index = 4;
|
||||
for (int i = 4; i < nodes.length; i++) {
|
||||
if (nodes[i].strength() > nodes[index].strength()) {
|
||||
index = i;
|
||||
}
|
||||
}
|
||||
|
||||
int i = 4;
|
||||
loop: for (int r = 0; r < Board.NUM_ROWS; r++) {
|
||||
for (int c = 0; c < Board.NUM_COLS; c++) {
|
||||
if (i == index) {
|
||||
mv = new Move(color, r, c);
|
||||
break loop;
|
||||
}
|
||||
|
||||
else {
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return mv;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isReady() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Neural Network Player";
|
||||
}
|
||||
}
|
||||
@@ -2,21 +2,27 @@ package model.comPlayer;
|
||||
|
||||
import model.Board;
|
||||
import model.Move;
|
||||
|
||||
import model.playerModel.PlayerModel;
|
||||
|
||||
public interface Player {
|
||||
/**
|
||||
* Instructs the Player to retract the last move.
|
||||
*/
|
||||
public void denyMove();
|
||||
|
||||
/**
|
||||
* Gets the player's move given the board state. Blocks if player is not ready.
|
||||
* Gets the player's move given the board state. Blocks if player is not
|
||||
* ready.
|
||||
*
|
||||
* @param board
|
||||
* @return
|
||||
*/
|
||||
public Move getMove(Board board);
|
||||
public Move getMove(Board board, PlayerModel player);
|
||||
|
||||
/**
|
||||
* Returns true if the player is ready to make a move (getMove() does not block).
|
||||
* Returns true if the player is ready to make a move (getMove() does not
|
||||
* block).
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public boolean isReady();
|
||||
|
||||
@@ -3,16 +3,21 @@ package model.comPlayer;
|
||||
import java.util.Random;
|
||||
|
||||
import model.Board;
|
||||
import model.Board.TileColor;
|
||||
import model.CellPointer;
|
||||
import model.Move;
|
||||
import model.Board.TileColor;
|
||||
|
||||
import model.playerModel.PlayerModel;
|
||||
|
||||
public class RandomComPlayer implements Player {
|
||||
private final Random rand = new Random();
|
||||
|
||||
@Override
|
||||
public Move getMove(Board board) {
|
||||
public void denyMove() {
|
||||
throw new UnsupportedOperationException("Not implemented");
|
||||
}
|
||||
|
||||
@Override
|
||||
public Move getMove(Board board, PlayerModel player) {
|
||||
TileColor tile = TileColor.BLUE;
|
||||
int r = -1;
|
||||
int c = -1;
|
||||
@@ -38,19 +43,14 @@ public class RandomComPlayer implements Player {
|
||||
tile = TileColor.YELLOW;
|
||||
}
|
||||
|
||||
return new Move(new CellPointer(r, c), tile);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void denyMove() {
|
||||
throw new UnsupportedOperationException("Not implemented");
|
||||
return new Move(tile, new CellPointer(r, c));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isReady() {
|
||||
return true; // always ready to play a random valid move
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Random ComPlayer";
|
||||
|
||||
Reference in New Issue
Block a user