Skip to content

Commit 3a56dfc

Browse files
authored
refactor(player): convert starter and logic from kotlin to java (#302)
1 parent 97d1856 commit 3a56dfc

File tree

6 files changed

+168
-155
lines changed

6 files changed

+168
-155
lines changed

player/src/sc/player2021/SimpleClient.kt

Lines changed: 0 additions & 28 deletions
This file was deleted.
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package sc.player2021;
2+
3+
import jargs.gnu.CmdLineParser;
4+
import org.slf4j.Logger;
5+
import org.slf4j.LoggerFactory;
6+
import sc.player2021.logic.Logic;
7+
import sc.plugin2021.AbstractClient;
8+
import sc.plugin2021.IGameHandler;
9+
import sc.shared.SharedConfiguration;
10+
11+
import java.io.File;
12+
13+
/**
14+
* Hauptklasse des Clients, die über Konsolenargumente gesteuert werden kann.
15+
* Sie veranlasst eine Verbindung zum Spielserver.
16+
*/
17+
public class Starter extends AbstractClient {
18+
private static final Logger logger = LoggerFactory.getLogger(Starter.class);
19+
20+
public Starter(String host, int port, String reservation) throws Exception {
21+
// client starten
22+
super(host, port);
23+
24+
// Strategie zuweisen
25+
IGameHandler logic = new Logic(this);
26+
setHandler(logic);
27+
28+
// einem Spiel beitreten
29+
if (reservation == null || reservation.isEmpty()) {
30+
joinAnyGame();
31+
} else {
32+
joinPreparedGame(reservation);
33+
}
34+
}
35+
36+
public static void main(String[] args) {
37+
System.setProperty("file.encoding", "UTF-8");
38+
39+
// parameter definieren
40+
CmdLineParser parser = new CmdLineParser();
41+
CmdLineParser.Option hostOption = parser.addStringOption('h', "host");
42+
CmdLineParser.Option portOption = parser.addIntegerOption('p', "port");
43+
CmdLineParser.Option reservationOption = parser.addStringOption('r', "reservation");
44+
45+
try {
46+
// parameter auslesen
47+
parser.parse(args);
48+
} catch (CmdLineParser.OptionException e) {
49+
// bei Fehler die Hilfe anzeigen
50+
showHelp(e.getMessage());
51+
System.exit(2);
52+
}
53+
54+
// parameter laden
55+
String host = (String) parser.getOptionValue(hostOption, "localhost");
56+
int port = (Integer) parser.getOptionValue(portOption, SharedConfiguration.DEFAULT_PORT);
57+
String reservation = (String) parser.getOptionValue(reservationOption, "");
58+
59+
// einen neuen client erzeugen
60+
try {
61+
new Starter(host, port, reservation);
62+
} catch (Exception e) {
63+
logger.error("Beim Starten den Clients ist ein Fehler aufgetreten:", e);
64+
e.printStackTrace();
65+
}
66+
67+
}
68+
69+
private static void showHelp(String errorMsg) {
70+
String jarName = new File(Starter.class.getProtectionDomain().getCodeSource().getLocation().getFile()).getName();
71+
System.out.println("\n" + errorMsg);
72+
System.out.println("\nBitte das Programm mit folgenden Parametern (optional) aufrufen: \n"
73+
+ "java -jar " + jarName + " [{-h,--host} hostname]\n"
74+
+ " [{-p,--port} port]\n"
75+
+ " [{-r,--reservation} reservierung]");
76+
System.out.println("\nBeispiel: \n"
77+
+ "java -jar " + jarName + " --host 127.0.0.1 --port 10500 --reservation 1234\n");
78+
}
79+
80+
}

player/src/sc/player2021/Starter.kt

Lines changed: 0 additions & 66 deletions
This file was deleted.
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package sc.player2021.logic;
2+
3+
import org.slf4j.Logger;
4+
import org.slf4j.LoggerFactory;
5+
import sc.framework.plugins.Player;
6+
import sc.player2021.Starter;
7+
import sc.plugin2021.GameState;
8+
import sc.plugin2021.IGameHandler;
9+
import sc.plugin2021.Move;
10+
import sc.plugin2021.Team;
11+
import sc.plugin2021.util.GameRuleLogic;
12+
import sc.shared.GameResult;
13+
import sc.api.plugins.ITeam;
14+
15+
import java.util.List;
16+
import java.util.ArrayList;
17+
18+
/**
19+
* Das Herz des Clients:
20+
* Eine sehr simple Logik, die ihre Zuege zufaellig waehlt,
21+
* aber gueltige Zuege macht.
22+
* Ausserdem werden zum Spielverlauf Konsolenausgaben gemacht.
23+
*/
24+
public class Logic implements IGameHandler {
25+
private static final Logger log = LoggerFactory.getLogger(Logic.class);
26+
27+
private Starter client;
28+
private GameState gameState;
29+
private Player currentPlayer;
30+
31+
/**
32+
* Erzeugt ein neues Strategieobjekt, das zufaellige Zuege taetigt.
33+
*
34+
* @param client Der zugrundeliegende Client, der mit dem Spielserver kommuniziert.
35+
*/
36+
public Logic(Starter client) {
37+
this.client = client;
38+
}
39+
40+
/**
41+
* {@inheritDoc}
42+
*/
43+
public void gameEnded(GameResult data, Team color, String errorMessage) {
44+
log.info("Das Spiel ist beendet.");
45+
}
46+
47+
/**
48+
* {@inheritDoc}
49+
*/
50+
@Override
51+
public void onRequestAction() {
52+
long startTime = System.currentTimeMillis();
53+
log.info("Es wurde ein Zug angefordert.");
54+
List possibleMoves = new ArrayList<>(GameRuleLogic.getPossibleMoves(gameState));
55+
sendAction((Move) possibleMoves.get((int) (Math.random() * possibleMoves.size())));
56+
}
57+
58+
/**
59+
* {@inheritDoc}
60+
*/
61+
@Override
62+
public void onUpdate(Player player, Player otherPlayer) {
63+
currentPlayer = player;
64+
log.info("Spielerwechsel: " + player.getColor());
65+
}
66+
67+
/**
68+
* {@inheritDoc}
69+
*/
70+
@Override
71+
public void onUpdate(GameState gameState) {
72+
this.gameState = gameState;
73+
currentPlayer = gameState.getCurrentPlayer();
74+
log.info("Zug: {} Spieler: {}", gameState.getTurn(), currentPlayer.getColor());
75+
}
76+
77+
/**
78+
* {@inheritDoc}
79+
*/
80+
@Override
81+
public void sendAction(Move move) {
82+
client.sendMove(move);
83+
}
84+
85+
}

player/src/sc/player2021/logic/Logic.kt

Lines changed: 0 additions & 60 deletions
This file was deleted.

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,11 @@ import kotlin.system.exitProcess
2323
abstract class AbstractClient @Throws(IOException::class) constructor(
2424
host: String,
2525
port: Int,
26-
private val type: PlayerType = PlayerType.PLAYER_ONE
26+
private val type: PlayerType
2727
): ILobbyClientListener {
2828

29+
constructor(host: String, port: Int): this(host, port, PlayerType.PLAYER_ONE) {}
30+
2931
companion object {
3032
private val logger = LoggerFactory.getLogger(AbstractClient::class.java);
3133
private val gameType = GamePlugin.PLUGIN_UUID

0 commit comments

Comments
 (0)