added arguments support + improved isOver + fixed State.play + refactored a bit Main and MainStats

This commit is contained in:
Quentin Legot 2021-02-26 11:54:26 +01:00
parent 3a92e315d0
commit 710298150e
6 changed files with 150 additions and 180 deletions

View File

@ -1,19 +1,20 @@
package othello; package othello;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import othello.players.AlphaBetaPlayer; import othello.players.AlphaBetaPlayer;
import othello.players.NegamaxPlayer;
import othello.players.Player; import othello.players.Player;
public class Main { public class Main {
public static void main(String[] args) throws FileNotFoundException, UnsupportedEncodingException { public static void main(String[] args) {
Player p1 = new AlphaBetaPlayer(4); Player[] players = extractArgs(args);
Player p2 = new AlphaBetaPlayer(4); Player p1 = players[0];
Player[][] board = initialize(p1, p2); Player p2 = players[1];
Player[][] board = initializeBoard(p1, p2);
State game = new State(board, p1, p2); State game = new State(board, p1, p2);
System.out.println("joueur 1: " + p1); System.out.println("joueur 1: " + p1);
System.out.println("joueur 2: " + p2); System.out.println("joueur 2: " + p2);
@ -22,15 +23,38 @@ public class Main {
System.out.println(game.toString()); System.out.println(game.toString());
game = game.play(player.play(game)); game = game.play(player.play(game));
} }
System.out.println(game.toString()); endGame(game);
System.out.println(game.getN1()+" "+ game.getN2());
System.out.println(game.getWinner() + " a gagné la partie");
System.out.println("Score joueur 1 -> " + game.getN1());
System.out.println("Score joueur 2 -> "+ game.getN2());
} }
public static Player[] extractArgs(String[] args) {
Player p1;
Player p2;
int depthP1 = 4;
int depthP2 = 4;
boolean useAlphaBeta = false;
try {
if(args.length >= 3) { // les paramètres > 3 sont ignorés
depthP1 = Integer.parseInt(args[0]);
depthP2 = Integer.parseInt(args[1]);
useAlphaBeta = Boolean.parseBoolean(args[2]);
}
} catch (NumberFormatException e) {
System.out.println("Les arguments de lancement ne pas corrects (pas des nombres entiers)");
System.out.println("Utilisation des paramètres par défaut ( 4 4 true )");
} finally {
if(useAlphaBeta) {
p1 = new AlphaBetaPlayer(depthP1);
p2 = new AlphaBetaPlayer(depthP2);
} else {
p1 = new NegamaxPlayer(depthP1);
p2 = new NegamaxPlayer(depthP2);
}
}
return new Player[]{p1, p2};
}
public static Player[][] initialize(Player p1, Player p2){ public static Player[][] initializeBoard(Player p1, Player p2){
Player[][] board = new Player[7][7]; Player[][] board = new Player[7][7];
board[0][0] = p2; board[0][0] = p2;
board[0][6] = p1; board[0][6] = p1;
@ -38,5 +62,13 @@ public class Main {
board[6][6] = p2; board[6][6] = p2;
return board; return board;
} }
public static void endGame(State game) {
System.out.println(game.toString());
System.out.println(game.getN1()+" "+ game.getN2());
System.out.println(game.getWinner() + " a gagné la partie");
System.out.println("Score joueur 1 -> " + game.getN1());
System.out.println("Score joueur 2 -> "+ game.getN2());
}
} }

View File

@ -1,8 +1,8 @@
package othello; package othello;
import java.io.FileNotFoundException; import java.io.IOException;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.io.UnsupportedEncodingException; import java.nio.charset.StandardCharsets;
import othello.players.AlphaBetaPlayer; import othello.players.AlphaBetaPlayer;
import othello.players.Player; import othello.players.Player;
@ -10,46 +10,32 @@ import othello.players.Player;
public class MainStats { public class MainStats {
public static void main(String[] args) throws FileNotFoundException, UnsupportedEncodingException { public static void main(String[] args) throws IOException {
Player p1 = new AlphaBetaPlayer(1); Player[] players = Main.extractArgs(args);
Player p2 = new AlphaBetaPlayer(5); Player p1 = players[0];
Player[][] board = initialize(p1, p2); Player p2 = players[1];
Player[][] board = Main.initializeBoard(p1, p2);
State game = new State(board, p1, p2); State game = new State(board, p1, p2);
System.out.println("joueur 1: " + p1); System.out.println("joueur 1: " + p1);
System.out.println("joueur 2: " + p2); System.out.println("joueur 2: " + p2);
int tour = 1; // Pour le rapport int tour = 1; // Pour le rapport
PrintWriter writer = new PrintWriter("statsj1.txt", "UTF-8"); PrintWriter writer = new PrintWriter("statsj1.txt", StandardCharsets.UTF_8);
PrintWriter writer2 = new PrintWriter("statsj2.txt", "UTF-8"); PrintWriter writer2 = new PrintWriter("statsj2.txt", StandardCharsets.UTF_8);
while(!game.isOver()) { while(!game.isOver()) {
Player player = game.getCurrentPlayer(); Player player = game.getCurrentPlayer();
System.out.println(game.toString()); System.out.println(game.toString());
game = game.play(player.play(game)); game = game.play(player.play(game));
if(tour%2 == 0) {
if(tour % 2 == 0)
writer2.println(player.getComplexity()); writer2.println(player.getComplexity());
} else
else {
writer.println(player.getComplexity()); writer.println(player.getComplexity());
}
tour++; tour++;
} }
writer.close(); writer.close();
writer2.close(); writer2.close();
System.out.println(game.toString()); Main.endGame(game);
System.out.println(game.getN1()+" "+ game.getN2());
System.out.println(game.getWinner() + " a gagné la partie");
System.out.println("Score joueur 1 -> " + game.getN1());
System.out.println("Score joueur 2 -> "+ game.getN2());
}
public static Player[][] initialize(Player p1, Player p2){
Player[][] board = new Player[7][7];
board[0][0] = p2;
board[0][6] = p1;
board[6][0] = p1;
board[6][6] = p2;
return board;
} }
} }

View File

@ -4,8 +4,8 @@ import othello.players.Player;
public class Point { public class Point {
private int x; private final int x;
private int y; private final int y;
public Point(int y, int x) { public Point(int y, int x) {
this.x = x; this.x = x;
@ -13,7 +13,8 @@ public class Point {
} }
public boolean isJump(Point other, Player[][] board) { public boolean isJump(Point other, Player[][] board) {
return (board[(x+other.getX())/2][(y+other.getY())/2] != null); double value = Math.pow(other.x - this.x, 2) + Math.pow(other.y - this.y, 2);
return (value == 4 || value == 8) && board[(x+other.getX())/2][(y+other.getY())/2] != null;
} }
public int getX(){ public int getX(){

View File

@ -7,7 +7,7 @@ import java.util.List;
public class State { public class State {
public static List<State> previousSituations = new LinkedList<>(); public static List<Player[][]> previousSituations = new LinkedList<>();
private final Player[][] board; private final Player[][] board;
private final Player player1; private final Player player1;
@ -26,7 +26,7 @@ public class State {
} }
public boolean isOver() { public boolean isOver() {
return n1 == 0 || n2 == 0 || (getMove(player1).isEmpty() && getMove(player2).isEmpty()); return n1 == 0 || n2 == 0 || (getMove(player1).isEmpty() && getMove(player2).isEmpty()) || previousSituations.contains(this.board);
} }
public LinkedList<Pair<Point, Point>> getMove(Player player) { public LinkedList<Pair<Point, Point>> getMove(Player player) {
@ -61,10 +61,12 @@ public class State {
public int getScore(Player player) { public int getScore(Player player) {
return player == player1 ? (n1/(n1+n2)) : (n2/(n1+n2)); return player == player1 ? (n1/(n1+n2)) : (n2/(n1+n2));
} }
public int getN1(){
public int getN1() {
return this.n1; return this.n1;
} }
public int getN2(){
public int getN2() {
return this.n2; return this.n2;
} }
@ -77,23 +79,25 @@ public class State {
} }
public State play(Pair<Point,Point> move) { public State play(Pair<Point,Point> move) {
if(previousSituations.size() == 10) // on ne garde que les 10 dernieres situations par soucis de perfs
previousSituations.remove(0);
previousSituations.add(board);
State copy = this.copy(); State copy = this.copy();
boolean isJump = move.getLeft().isJump(move.getRight(), copy.board); boolean isJump = move.getLeft().isJump(move.getRight(), copy.board);
copy.board[move.getRight().getY()][move.getRight().getX()] = copy.currentPlayer; copy.board[move.getRight().getY()][move.getRight().getX()] = copy.currentPlayer;
if (isJump) { if (isJump) {
copy.board[move.getLeft().getY()][move.getLeft().getX()] = null; copy.board[move.getLeft().getY()][move.getLeft().getX()] = null;
copy.board[(move.getLeft().getY() + move.getRight().getY()) / 2][(move.getLeft().getX() + move.getRight().getX()) / 2] = copy.currentPlayer; }
} else { for (int i = -1; i < 2; i++) {
for (int i = -1; i < 2; i++) { for (int z = -1; z < 2; z++) {
for (int z = -1; z < 2; z++) { try {
try { if(copy.board[move.getRight().getY() + i][move.getRight().getX() + z] != null)
if(copy.board[move.getRight().getY() + i][move.getRight().getX() + z] != null) copy.board[move.getRight().getY() + i][move.getRight().getX() + z] = copy.currentPlayer;
copy.board[move.getRight().getY() + i][move.getRight().getX() + z] = copy.currentPlayer; } catch (IndexOutOfBoundsException ignored) {}
} catch (IndexOutOfBoundsException ignored) {}
}
} }
} }
int ni = 0, nj = 0; int ni = 0, nj = 0;
for (Player[] players : copy.board) { for (Player[] players : copy.board) {
for (Player player : players) { for (Player player : players) {
@ -133,10 +137,7 @@ public class State {
public void switchPlayer() { public void switchPlayer() {
setCurrentPlayer(getCurrentPlayer() == this.player1 ? player2 : player1); setCurrentPlayer(getCurrentPlayer() == this.player1 ? player2 : player1);
} }
/**
* TODO: display the current state of the board
*/
@Override @Override
public String toString() { public String toString() {
StringBuilder str = new StringBuilder(); StringBuilder str = new StringBuilder();
@ -154,6 +155,7 @@ public class State {
} }
return str.toString(); return str.toString();
} }
@Override @Override
public boolean equals(Object state) { public boolean equals(Object state) {
boolean bool; boolean bool;

View File

@ -1,67 +1,42 @@
6 6
16 16
29 29
44 41
66 55
90 74
92
111 111
142 134
168 157
195 194
221 215
249 234
287 263
327 298
362 352
393 382
424 401
461 415
494 430
527 452
563 480
607 517
638 561
671 605
706 647
688
717
737 737
766 756
797 769
827 790
820
838
854 854
886 864
915 878
940 891
969 904
992 914
1023 927
1053 934
1091
1125
1165
1196
1234
1274
1313
1348
1386
1424
1462
1501
1538
1579
1615
1654
1684
1710
1742
1767
1791
1810
1836
1856
1875
1895
1905
1914
1922
1928

View File

@ -1,67 +1,41 @@
6 6
16 16
28 28
37
46 46
56 60
65 74
75 91
86 103
107 129
121 150
133 166
149 201
172 226
194 245
206 257
234 269
254 307
272 355
295 402
319 438
338 466
357 497
378 511
409
435
465
495
523 523
551 531
577 537
605 553
630 576
595
624
640
654 654
681 664
673
679
690
701
709 709
735 717
757 721
785 727
800
825
836
849
867
875
891
905
921
936
951
961
983
1003
1020
1036
1047
1061
1075
1084
1098
1112
1120
1123
1128
1136
1139
1146