mirror of
https://github.com/2OOP/pism.git
synced 2026-02-04 19:04:49 +00:00
made more classes deepClonable.
This commit is contained in:
@@ -23,7 +23,7 @@ public class ReversiController extends AbstractGameController<ReversiR> {
|
|||||||
new ReversiCanvas(Color.GRAY, (App.getHeight() / 4) * 3, (App.getHeight() / 4) * 3,(c) -> {new EventFlow().addPostEvent(GUIEvents.PlayerAttemptedMove.class, c).postEvent();}, (c) -> {new EventFlow().addPostEvent(GUIEvents.PlayerMoveHovered.class, c).postEvent();}),
|
new ReversiCanvas(Color.GRAY, (App.getHeight() / 4) * 3, (App.getHeight() / 4) * 3,(c) -> {new EventFlow().addPostEvent(GUIEvents.PlayerAttemptedMove.class, c).postEvent();}, (c) -> {new EventFlow().addPostEvent(GUIEvents.PlayerMoveHovered.class, c).postEvent();}),
|
||||||
players,
|
players,
|
||||||
ReversiR,
|
ReversiR,
|
||||||
local ? new LocalFixedRateThreadBehaviour<>(ReversiR, players) : new OnlineThreadBehaviour<>(ReversiR), // TODO: Player order matters here, this won't work atm
|
local ? new LocalFixedRateThreadBehaviour<>(ReversiR) : new OnlineThreadBehaviour<>(ReversiR), // TODO: Player order matters here, this won't work atm
|
||||||
"Reversi");
|
"Reversi");
|
||||||
eventFlow.listen(GUIEvents.PlayerAttemptedMove.class, event -> {if (getCurrentPlayer() instanceof LocalPlayer lp){lp.setMove(event.move());}}, false);
|
eventFlow.listen(GUIEvents.PlayerAttemptedMove.class, event -> {if (getCurrentPlayer() instanceof LocalPlayer lp){lp.setMove(event.move());}}, false);
|
||||||
eventFlow.listen(GUIEvents.PlayerMoveHovered.class, this::onHoverMove, false);
|
eventFlow.listen(GUIEvents.PlayerMoveHovered.class, this::onHoverMove, false);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
package org.toop.framework.gameFramework.model.game;
|
package org.toop.framework.gameFramework.model.game;
|
||||||
|
|
||||||
public interface DeepCopyable<T extends TurnBasedGame<T>> {
|
public interface DeepCopyable<T> {
|
||||||
T deepCopy();
|
T deepCopy();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
package org.toop.framework.gameFramework.model.player;
|
||||||
|
|
||||||
|
import org.toop.framework.gameFramework.model.game.DeepCopyable;
|
||||||
|
import org.toop.framework.gameFramework.model.game.TurnBasedGame;
|
||||||
|
|
||||||
|
public interface AI<T extends TurnBasedGame<T>> extends MoveProvider<T>, DeepCopyable<AI<T>> {
|
||||||
|
}
|
||||||
@@ -12,6 +12,6 @@ import org.toop.framework.gameFramework.model.game.TurnBasedGame;
|
|||||||
*
|
*
|
||||||
* @param <T> the specific type of game this AI can play, extending {@link GameR}
|
* @param <T> the specific type of game this AI can play, extending {@link GameR}
|
||||||
*/
|
*/
|
||||||
public abstract class AbstractAI<T extends TurnBasedGame<T>> implements MoveProvider<T> {
|
public abstract class AbstractAI<T extends TurnBasedGame<T>> implements AI<T> {
|
||||||
// Concrete AI implementations should override findBestMove(T game, int depth)
|
// Concrete AI implementations should override findBestMove(T game, int depth)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,15 +16,17 @@ import org.toop.framework.gameFramework.model.game.TurnBasedGame;
|
|||||||
* </p>
|
* </p>
|
||||||
*/
|
*/
|
||||||
public abstract class AbstractPlayer<T extends TurnBasedGame<T>> implements Player<T> {
|
public abstract class AbstractPlayer<T extends TurnBasedGame<T>> implements Player<T> {
|
||||||
private int playerIndex = -1;
|
private final Logger logger = LogManager.getLogger(this.getClass());
|
||||||
|
|
||||||
private Logger logger = LogManager.getLogger(this.getClass());
|
|
||||||
|
|
||||||
private final String name;
|
private final String name;
|
||||||
|
|
||||||
protected AbstractPlayer(String name) {
|
protected AbstractPlayer(String name) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected AbstractPlayer(AbstractPlayer<T> other) {
|
||||||
|
this.name = other.name;
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* Determines the next move based on the provided game state.
|
* Determines the next move based on the provided game state.
|
||||||
* <p>
|
* <p>
|
||||||
|
|||||||
@@ -2,6 +2,6 @@ package org.toop.framework.gameFramework.model.player;
|
|||||||
|
|
||||||
import org.toop.framework.gameFramework.model.game.TurnBasedGame;
|
import org.toop.framework.gameFramework.model.game.TurnBasedGame;
|
||||||
|
|
||||||
public interface MoveProvider<T extends TurnBasedGame> {
|
public interface MoveProvider<T extends TurnBasedGame<T>> {
|
||||||
int getMove(T game);
|
int getMove(T game);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package org.toop.framework.gameFramework.model.player;
|
package org.toop.framework.gameFramework.model.player;
|
||||||
|
|
||||||
|
import org.toop.framework.gameFramework.model.game.DeepCopyable;
|
||||||
import org.toop.framework.gameFramework.model.game.TurnBasedGame;
|
import org.toop.framework.gameFramework.model.game.TurnBasedGame;
|
||||||
|
|
||||||
public interface Player<T extends TurnBasedGame<T>> extends NameProvider, MoveProvider<T> {
|
public interface Player<T extends TurnBasedGame<T>> extends NameProvider, MoveProvider<T>, DeepCopyable<Player<T>> {
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -60,7 +60,9 @@ public abstract class BitboardGame<T extends BitboardGame<T>> implements TurnBas
|
|||||||
|
|
||||||
this.playerBitboard = Arrays.copyOf(other.playerBitboard, other.playerBitboard.length);
|
this.playerBitboard = Arrays.copyOf(other.playerBitboard, other.playerBitboard.length);
|
||||||
this.currentTurn = other.currentTurn;
|
this.currentTurn = other.currentTurn;
|
||||||
this.players = Arrays.copyOf(other.players, other.players.length); // TODO: Make this a deep copy
|
this.players = Arrays.stream(other.players)
|
||||||
|
.map(Player<T>::deepCopy)
|
||||||
|
.toArray(Player[]::new);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getColumnSize() {
|
public int getColumnSize() {
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package org.toop.game.games.reversi;
|
package org.toop.game.games.reversi;
|
||||||
|
|
||||||
|
import org.toop.framework.gameFramework.model.player.AI;
|
||||||
import org.toop.framework.gameFramework.model.player.AbstractAI;
|
import org.toop.framework.gameFramework.model.player.AbstractAI;
|
||||||
|
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
@@ -12,4 +13,8 @@ public final class ReversiAIR extends AbstractAI<BitboardReversi> {
|
|||||||
int inty = new Random().nextInt(0, moves.length);
|
int inty = new Random().nextInt(0, moves.length);
|
||||||
return moves[inty];
|
return moves[inty];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ReversiAIR deepCopy() {
|
||||||
|
return new ReversiAIR();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package org.toop.game.games.tictactoe;
|
package org.toop.game.games.tictactoe;
|
||||||
|
|
||||||
|
import org.toop.framework.gameFramework.model.player.AI;
|
||||||
import org.toop.framework.gameFramework.model.player.AbstractAI;
|
import org.toop.framework.gameFramework.model.player.AbstractAI;
|
||||||
import org.toop.framework.gameFramework.model.game.PlayResult;
|
import org.toop.framework.gameFramework.model.game.PlayResult;
|
||||||
import org.toop.framework.gameFramework.GameState;
|
import org.toop.framework.gameFramework.GameState;
|
||||||
@@ -99,4 +100,9 @@ public final class TicTacToeAIR extends AbstractAI<BitboardTicTacToe> {
|
|||||||
|
|
||||||
return score;
|
return score;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AI<BitboardTicTacToe> deepCopy() {
|
||||||
|
return new TicTacToeAIR();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
package org.toop.game.players;
|
package org.toop.game.players;
|
||||||
|
|
||||||
import org.toop.framework.gameFramework.model.player.AbstractAI;
|
import org.toop.framework.gameFramework.model.player.*;
|
||||||
import org.toop.framework.gameFramework.model.player.AbstractPlayer;
|
|
||||||
import org.toop.framework.gameFramework.model.player.MoveProvider;
|
|
||||||
import org.toop.framework.gameFramework.model.game.TurnBasedGame;
|
import org.toop.framework.gameFramework.model.game.TurnBasedGame;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -17,18 +15,23 @@ import org.toop.framework.gameFramework.model.game.TurnBasedGame;
|
|||||||
public class ArtificialPlayer<T extends TurnBasedGame<T>> extends AbstractPlayer<T> {
|
public class ArtificialPlayer<T extends TurnBasedGame<T>> extends AbstractPlayer<T> {
|
||||||
|
|
||||||
/** The AI instance used to calculate moves. */
|
/** The AI instance used to calculate moves. */
|
||||||
private final MoveProvider<T> ai;
|
private final AI<T> ai;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructs a new ArtificialPlayer using the specified AI.
|
* Constructs a new ArtificialPlayer using the specified AI.
|
||||||
*
|
*
|
||||||
* @param ai the AI instance that determines moves for this player
|
* @param ai the AI instance that determines moves for this player
|
||||||
*/
|
*/
|
||||||
public ArtificialPlayer(MoveProvider<T> ai, String name) {
|
public ArtificialPlayer(AI<T> ai, String name) {
|
||||||
super(name);
|
super(name);
|
||||||
this.ai = ai;
|
this.ai = ai;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ArtificialPlayer(ArtificialPlayer<T> other) {
|
||||||
|
super(other);
|
||||||
|
this.ai = other.ai.deepCopy();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determines the next move for this player using its AI.
|
* Determines the next move for this player using its AI.
|
||||||
* <p>
|
* <p>
|
||||||
@@ -44,4 +47,9 @@ public class ArtificialPlayer<T extends TurnBasedGame<T>> extends AbstractPlayer
|
|||||||
public int getMove(T gameCopy) {
|
public int getMove(T gameCopy) {
|
||||||
return ai.getMove(gameCopy);
|
return ai.getMove(gameCopy);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ArtificialPlayer<T> deepCopy() {
|
||||||
|
return new ArtificialPlayer<T>(this);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package org.toop.game.players;
|
|||||||
|
|
||||||
import org.toop.framework.gameFramework.model.game.TurnBasedGame;
|
import org.toop.framework.gameFramework.model.game.TurnBasedGame;
|
||||||
import org.toop.framework.gameFramework.model.player.AbstractPlayer;
|
import org.toop.framework.gameFramework.model.player.AbstractPlayer;
|
||||||
|
import org.toop.framework.gameFramework.model.player.Player;
|
||||||
|
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
import java.util.concurrent.ExecutionException;
|
import java.util.concurrent.ExecutionException;
|
||||||
@@ -16,6 +17,10 @@ public class LocalPlayer<T extends TurnBasedGame<T>> extends AbstractPlayer<T> {
|
|||||||
super(name);
|
super(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public LocalPlayer(LocalPlayer<T> other) {
|
||||||
|
super(other);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getMove(T gameCopy) {
|
public int getMove(T gameCopy) {
|
||||||
return getValidMove(gameCopy);
|
return getValidMove(gameCopy);
|
||||||
@@ -57,6 +62,11 @@ public class LocalPlayer<T extends TurnBasedGame<T>> extends AbstractPlayer<T> {
|
|||||||
return move;
|
return move;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public LocalPlayer<T> deepCopy() {
|
||||||
|
return new LocalPlayer<T>(this.getName());
|
||||||
|
}
|
||||||
|
|
||||||
/*public void register() {
|
/*public void register() {
|
||||||
// Listening to PlayerAttemptedMove
|
// Listening to PlayerAttemptedMove
|
||||||
new EventFlow().listen(GUIEvents.PlayerAttemptedMove.class, event -> {
|
new EventFlow().listen(GUIEvents.PlayerAttemptedMove.class, event -> {
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package org.toop.game.players;
|
|||||||
|
|
||||||
import org.toop.framework.gameFramework.model.game.TurnBasedGame;
|
import org.toop.framework.gameFramework.model.game.TurnBasedGame;
|
||||||
import org.toop.framework.gameFramework.model.player.AbstractPlayer;
|
import org.toop.framework.gameFramework.model.player.AbstractPlayer;
|
||||||
|
import org.toop.framework.gameFramework.model.player.Player;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents a player controlled remotely or over a network.
|
* Represents a player controlled remotely or over a network.
|
||||||
@@ -23,4 +24,13 @@ public class OnlinePlayer<T extends TurnBasedGame<T>> extends AbstractPlayer<T>
|
|||||||
public OnlinePlayer(String name) {
|
public OnlinePlayer(String name) {
|
||||||
super(name);
|
super(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public OnlinePlayer(OnlinePlayer<T> other) {
|
||||||
|
super(other);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Player<T> deepCopy() {
|
||||||
|
return new OnlinePlayer<>(this);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user