Skip to content

Commit fc7cb26

Browse files
committed
feat(player): decouple Logic, Starter and PlayerClient
1 parent af28b5d commit fc7cb26

File tree

4 files changed

+22
-56
lines changed

4 files changed

+22
-56
lines changed

player/src/main/sc/player2021/Starter.java

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import org.slf4j.Logger;
55
import org.slf4j.LoggerFactory;
66
import sc.player2021.logic.Logic;
7-
import sc.plugin2021.AbstractClient;
7+
import sc.plugin2021.PlayerClient;
88
import sc.plugin2021.IGameHandler;
99
import sc.shared.SharedConfiguration;
1010

@@ -14,22 +14,19 @@
1414
* Hauptklasse des Clients, die über Konsolenargumente gesteuert werden kann.
1515
* Sie veranlasst eine Verbindung zum Spielserver.
1616
*/
17-
public class Starter extends AbstractClient {
17+
public class Starter {
1818
private static final Logger logger = LoggerFactory.getLogger(Starter.class);
1919

2020
public Starter(String host, int port, String reservation) {
21-
// client starten
22-
super(host, port);
23-
2421
// Strategie zuweisen
25-
IGameHandler logic = new Logic(this);
26-
setHandler(logic);
22+
IGameHandler logic = new Logic();
2723

2824
// einem Spiel beitreten
25+
PlayerClient client = new PlayerClient(host, port, logic);
2926
if (reservation == null || reservation.isEmpty()) {
30-
joinAnyGame();
27+
client.joinAnyGame();
3128
} else {
32-
joinPreparedGame(reservation);
29+
client.joinPreparedGame(reservation);
3330
}
3431
}
3532

player/src/main/sc/player2021/logic/Logic.java

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -20,49 +20,32 @@
2020
public class Logic implements IGameHandler {
2121
private static final Logger log = LoggerFactory.getLogger(Logic.class);
2222

23-
/** Internet Client, der mit dem Spielserver kommuniziert. */
24-
private final AbstractClient client;
2523
/** Aktueller Spielstatus. */
2624
private GameState gameState;
2725
/** Aktueller eigener Spieler. */
2826
private Player currentPlayer;
2927

30-
/** Erzeugt eine neue Instanz dieser Strategie, die über den mitgegebenen Client Züge absendet. */
31-
public Logic(AbstractClient client) {
32-
this.client = client;
33-
}
34-
35-
/** {@inheritDoc} */
3628
public void gameEnded(GameResult data, Team color, String errorMessage) {
3729
log.info("Das Spiel ist beendet.");
3830
}
3931

40-
/** {@inheritDoc} */
4132
@Override
42-
public void onRequestAction() {
33+
public Move calculateMove() {
4334
long startTime = System.currentTimeMillis();
4435
log.info("Es wurde ein Zug angefordert.");
4536
List<Move> possibleMoves = new ArrayList<>(GameRuleLogic.getPossibleMoves(gameState));
46-
sendAction(possibleMoves.get((int) (Math.random() * possibleMoves.size())));
37+
return possibleMoves.get((int) (Math.random() * possibleMoves.size()));
4738
}
4839

49-
/** {@inheritDoc} */
5040
@Override
5141
public void onUpdate(Player player, Player otherPlayer) {
5242
currentPlayer = player;
5343
}
5444

55-
/** {@inheritDoc} */
5645
@Override
5746
public void onUpdate(GameState gameState) {
5847
this.gameState = gameState;
5948
log.info("Zug: {} Dran: {}", gameState.getTurn(), gameState.getCurrentPlayer().getColor());
6049
}
6150

62-
/** {@inheritDoc} */
63-
@Override
64-
public void sendAction(Move move) {
65-
client.sendMove(move);
66-
}
67-
6851
}

plugin/src/client/sc/plugin2021/IGameHandler.kt

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,8 @@ import sc.api.plugins.ITeam
66

77
/**
88
* Das Interface der Logik.
9-
* Der GameHandler kommuniziert mit dem Server, d.h.
10-
* Er bekommt Events (Updates, Anfragen, Spielende) und
11-
* beantwortet Zuganfragen mit einem entsprechenden Zug.
9+
* Der GameHandler definiert Reaktionen auf Ereignisse vom Server,
10+
* insbesondere die Reaktion mit einem Zug auf eine Zuganfrage.
1211
*/
1312
interface IGameHandler {
1413

@@ -24,19 +23,9 @@ interface IGameHandler {
2423
fun onUpdate(gamestate: GameState)
2524

2625
/**
27-
* Wird aufgerufen, wenn der Spieler zum Zug aufgefordert wurde.
28-
*
29-
* @see sendAction
30-
*/
31-
fun onRequestAction()
32-
33-
/**
34-
* Sendet dem Spielserver den gegebenen Zug.
35-
* Diese Funktion sollte auf eine Zuganfrage vom Server folgen.
36-
*
37-
* @param move zu tätigender Zug
26+
* Wird aufgerufen, um die Zuganfrage des Servers zu beantworten
3827
*/
39-
fun sendAction(move: Move)
28+
fun calculateMove(): Move
4029

4130
/**
4231
* Wird aufgerufen, wenn das Spiel beendet ist.

plugin/src/client/sc/plugin2021/AbstractClient.kt renamed to plugin/src/client/sc/plugin2021/PlayerClient.kt

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package sc.plugin2021
22

33
import org.slf4j.LoggerFactory
4-
import sc.api.plugins.IGamePlugin
54
import sc.api.plugins.IGameState
65
import sc.framework.plugins.protocol.MoveRequest
76
import sc.networking.clients.AbstractLobbyClientListener
@@ -20,19 +19,17 @@ import kotlin.system.exitProcess
2019
* Eine abstrakte Implementation des [ILobbyClientListener].
2120
* Hier sind alle Methoden implementiert, die unabhängig von der Logik der Clients der Spieler sind.
2221
*/
23-
abstract class AbstractClient(
22+
class PlayerClient(
2423
host: String,
25-
port: Int
24+
port: Int,
25+
private val handler: IGameHandler
2626
): AbstractLobbyClientListener() {
2727
companion object {
28-
private val logger = LoggerFactory.getLogger(AbstractClient::class.java)
28+
private val logger = LoggerFactory.getLogger(PlayerClient::class.java)
2929
}
3030

3131
var isGameOver = false
3232

33-
/** The handler reacts to messages from the server received by the lobby client. */
34-
protected var handler: IGameHandler? = null
35-
3633
/** The lobby client that connects to the room. Stops on connection failure. */
3734
private val client: LobbyClient = try {
3835
LobbyClient(host, port)
@@ -58,11 +55,11 @@ abstract class AbstractClient(
5855

5956
/** Called for any new message sent to the game room, e.g., move requests. */
6057
override fun onRoomMessage(roomId: String, data: ProtocolMessage) {
58+
this.roomId = roomId
6159
when(data) {
62-
is MoveRequest -> handler?.onRequestAction()
60+
is MoveRequest -> sendMove(handler.calculateMove())
6361
is WelcomeMessage -> team = Team.valueOf(data.color.toUpperCase())
6462
}
65-
this.roomId = roomId
6663
}
6764

6865
/** Sends the selected move to the server. */
@@ -87,11 +84,11 @@ abstract class AbstractClient(
8784
return
8885

8986
if (gameState.currentTeam == team) {
90-
handler?.onUpdate(gameState.currentPlayer, gameState.otherPlayer)
87+
handler.onUpdate(gameState.currentPlayer, gameState.otherPlayer)
9188
} else {
92-
handler?.onUpdate(gameState.otherPlayer, gameState.currentPlayer)
89+
handler.onUpdate(gameState.otherPlayer, gameState.currentPlayer)
9390
}
94-
handler?.onUpdate(gameState)
91+
handler.onUpdate(gameState)
9592
}
9693

9794
/** Start the LobbyClient [client] and listen to it. */
@@ -114,7 +111,7 @@ abstract class AbstractClient(
114111
override fun onGameOver(roomId: String, data: GameResult) {
115112
logger.info("$this: Game over with result $data")
116113
isGameOver = true
117-
handler?.gameEnded(data, team, error)
114+
handler.gameEnded(data, team, error)
118115
}
119116

120117
fun joinPreparedGame(reservation: String) {

0 commit comments

Comments
 (0)