implement solved

This commit is contained in:
ramollia
2026-01-20 13:15:48 +01:00
parent e5ea838430
commit f7b24edf1e
10 changed files with 27 additions and 16 deletions

View File

@@ -14,9 +14,11 @@ import org.toop.app.widget.complex.ViewWidget;
import org.toop.app.widget.popup.ErrorPopup; import org.toop.app.widget.popup.ErrorPopup;
import org.toop.app.widget.tutorial.*; import org.toop.app.widget.tutorial.*;
import org.toop.game.players.ai.MiniMaxAI; import org.toop.game.players.ai.MiniMaxAI;
import org.toop.game.players.ai.RandomAI;
import org.toop.game.players.ai.mcts.MCTSAI1; import org.toop.game.players.ai.mcts.MCTSAI1;
import org.toop.game.players.ai.mcts.MCTSAI3; import org.toop.game.players.ai.mcts.MCTSAI3;
import org.toop.game.players.ai.mcts.MCTSAI4; import org.toop.game.players.ai.mcts.MCTSAI4;
import org.toop.game.players.ai.mcts.OPMCTSAI;
import org.toop.local.AppContext; import org.toop.local.AppContext;
import javafx.geometry.Pos; import javafx.geometry.Pos;
@@ -82,13 +84,13 @@ public class LocalMultiplayerView extends ViewWidget {
if (information.players[0].isHuman) { if (information.players[0].isHuman) {
players[0] = new LocalPlayer(information.players[0].name); players[0] = new LocalPlayer(information.players[0].name);
} else { } else {
// players[0] = new ArtificialPlayer(new RandomAI<BitboardReversi>(), "Random AI"); players[0] = new ArtificialPlayer(new RandomAI(), "Random AI");
players[0] = new ArtificialPlayer(new MCTSAI4(500, 4), "MCTS V4 AI"); // players[0] = new ArtificialPlayer(new MCTSAI4(500, 4), "MCTS V4 AI");
} }
if (information.players[1].isHuman) { if (information.players[1].isHuman) {
players[1] = new LocalPlayer(information.players[1].name); players[1] = new LocalPlayer(information.players[1].name);
} else { } else {
players[1] = new ArtificialPlayer(new MCTSAI1(500), "MCTS V1 AI"); players[1] = new ArtificialPlayer(new OPMCTSAI(500), "OP MCTS AI");
} }
if (AppSettings.getSettings().getTutorialFlag() && AppSettings.getSettings().getFirstReversi()) { if (AppSettings.getSettings().getTutorialFlag() && AppSettings.getSettings().getFirstReversi()) {
new ShowEnableTutorialWidget( new ShowEnableTutorialWidget(

View File

@@ -6,7 +6,6 @@ import org.toop.framework.gameFramework.model.game.TurnBasedGame;
import org.toop.framework.gameFramework.model.player.Player; import org.toop.framework.gameFramework.model.player.Player;
import java.util.Arrays; import java.util.Arrays;
import java.util.concurrent.atomic.AtomicInteger;
// There is AI performance to be gained by getting rid of non-primitives and thus speeding up deepCopy // There is AI performance to be gained by getting rid of non-primitives and thus speeding up deepCopy
public abstract class BitboardGame implements TurnBasedGame { public abstract class BitboardGame implements TurnBasedGame {
@@ -18,8 +17,8 @@ public abstract class BitboardGame implements TurnBasedGame {
private Player[] players; private Player[] players;
// long is 64 bits. Every game has a limit of 64 cells maximum. // long is 64 bits. Every game has a limit of 64 cells maximum.
private final long[] playerBitboard; protected final long[] playerBitboard;
private int currentTurn = 0; protected int currentTurn = 0;
private final int playerCount; private final int playerCount;
public BitboardGame(int columnSize, int rowSize, int playerCount) { public BitboardGame(int columnSize, int rowSize, int playerCount) {

View File

@@ -3,6 +3,7 @@ package org.toop.framework.game.games.reversi;
import org.toop.framework.game.BitboardGame; import org.toop.framework.game.BitboardGame;
import org.toop.framework.gameFramework.GameState; import org.toop.framework.gameFramework.GameState;
import org.toop.framework.gameFramework.model.game.PlayResult; import org.toop.framework.gameFramework.model.game.PlayResult;
import org.toop.framework.gameFramework.model.game.TurnBasedGame;
import org.toop.framework.gameFramework.model.player.Player; import org.toop.framework.gameFramework.model.player.Player;
import org.toop.framework.game.BitboardGame; import org.toop.framework.game.BitboardGame;
@@ -368,4 +369,11 @@ public class BitboardReversi extends BitboardGame {
return bestMove; return bestMove;
} }
@Override
public void setFrom(long player1, long player2, int turn) {
this.playerBitboard[0] = player1;
this.playerBitboard[1] = player2;
this.currentTurn = turn;
}
} }

View File

@@ -2,6 +2,7 @@ package org.toop.framework.game.games.tictactoe;
import org.toop.framework.gameFramework.GameState; import org.toop.framework.gameFramework.GameState;
import org.toop.framework.gameFramework.model.game.PlayResult; import org.toop.framework.gameFramework.model.game.PlayResult;
import org.toop.framework.gameFramework.model.game.TurnBasedGame;
import org.toop.framework.gameFramework.model.player.Player; import org.toop.framework.gameFramework.model.player.Player;
import org.toop.framework.game.BitboardGame; import org.toop.framework.game.BitboardGame;
@@ -120,4 +121,8 @@ public class BitboardTicTacToe extends BitboardGame {
public long heuristicMove(long legalMoves) { public long heuristicMove(long legalMoves) {
return legalMoves; return legalMoves;
} }
@Override
public void setFrom(long player1, long player2, int turn) {
}
} }

View File

@@ -16,4 +16,6 @@ public interface TurnBasedGame extends DeepCopyable<TurnBasedGame> {
float rateMove(long move); float rateMove(long move);
long heuristicMove(long legalMoves); long heuristicMove(long legalMoves);
void setFrom(long player1, long player2, int turn);
} }

View File

@@ -107,8 +107,7 @@ public abstract class MCTSAI extends AbstractAI {
} }
protected Node selection(Node root) { protected Node selection(Node root) {
// while (Float.isNaN(root.solved) && root.isFullyExpanded() && !root.state.isTerminal()) { while (Float.isNaN(root.solved) && root.isFullyExpanded() && !root.state.isTerminal()) {
while (root.isFullyExpanded() && !root.state.isTerminal()) {
root = root.bestUCTChild(); root = root.bestUCTChild();
} }

View File

@@ -23,8 +23,7 @@ public class MCTSAI1 extends MCTSAI {
final long endTime = System.nanoTime() + milliseconds * 1_000_000L; final long endTime = System.nanoTime() + milliseconds * 1_000_000L;
// while (Float.isNaN(root.solved) && System.nanoTime() < endTime) { while (Float.isNaN(root.solved) && System.nanoTime() < endTime) {
while (System.nanoTime() < endTime) {
Node leaf = selection(root); Node leaf = selection(root);
leaf = expansion(leaf); leaf = expansion(leaf);
final float value = simulation(leaf); final float value = simulation(leaf);

View File

@@ -29,8 +29,7 @@ public class MCTSAI2 extends MCTSAI {
final long endTime = System.nanoTime() + milliseconds * 1_000_000L; final long endTime = System.nanoTime() + milliseconds * 1_000_000L;
// while (Float.isNaN(root.solved) && System.nanoTime() < endTime) { while (Float.isNaN(root.solved) && System.nanoTime() < endTime) {
while (System.nanoTime() < endTime) {
Node leaf = selection(root); Node leaf = selection(root);
leaf = expansion(leaf); leaf = expansion(leaf);
final float value = simulation(leaf); final float value = simulation(leaf);

View File

@@ -41,8 +41,7 @@ public class MCTSAI3 extends MCTSAI {
tasks.add(() -> { tasks.add(() -> {
final Node localRoot = new Node(game.deepCopy()); final Node localRoot = new Node(game.deepCopy());
// while (Float.isNaN(localRoot.solved) && System.nanoTime() < endTime) { while (Float.isNaN(localRoot.solved) && System.nanoTime() < endTime) {
while (System.nanoTime() < endTime) {
Node leaf = selection(localRoot); Node leaf = selection(localRoot);
leaf = expansion(leaf); leaf = expansion(leaf);
final float value = simulation(leaf); final float value = simulation(leaf);

View File

@@ -50,8 +50,7 @@ public class MCTSAI4 extends MCTSAI {
tasks.add(() -> { tasks.add(() -> {
final Node localRoot = threadRoots[threadIndex]; final Node localRoot = threadRoots[threadIndex];
// while (Float.isNaN(localRoot.solved) && System.nanoTime() < endTime) { while (Float.isNaN(localRoot.solved) && System.nanoTime() < endTime) {
while (System.nanoTime() < endTime) {
Node leaf = selection(localRoot); Node leaf = selection(localRoot);
leaf = expansion(leaf); leaf = expansion(leaf);
final float value = simulation(leaf); final float value = simulation(leaf);