Skip to content

Commit b94e590

Browse files
committed
feat(player): add simple client and logic implementation
1 parent 39ee531 commit b94e590

File tree

6 files changed

+133
-1
lines changed

6 files changed

+133
-1
lines changed

player/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ application {
2121

2222
dependencies {
2323
implementation(project(":plugin"))
24+
implementation(kotlin("script-runtime"))
2425
}
2526

2627
tasks {
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package sc.player2021
2+
3+
import org.slf4j.LoggerFactory
4+
import sc.player2021.logic.Logic
5+
import sc.plugin2021.AbstractClient
6+
7+
class SimpleClient(host: String, port: Int, reservation: String): AbstractClient(host, port) {
8+
companion object {
9+
val logger = LoggerFactory.getLogger(SimpleClient::class.java)
10+
}
11+
12+
val logic = Logic(this)
13+
14+
init {
15+
handler = logic
16+
17+
if (reservation.isEmpty())
18+
joinAnyGame()
19+
else
20+
joinPreparedGame(reservation)
21+
}
22+
23+
}

player/src/sc/player2021/Starter.kt

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package sc.player2021
2+
3+
import jargs.gnu.CmdLineParser
4+
import java.io.File
5+
import kotlin.system.exitProcess
6+
7+
fun main(args: Array<String>) {
8+
val parser = CmdLineParser()
9+
val options = mapOf(
10+
"host" to parser.addStringOption('h', "host"),
11+
"port" to parser.addIntegerOption('p', "port"),
12+
"reservation" to parser.addStringOption('r', "reservation")
13+
)
14+
15+
// Parse command line arguments
16+
try {
17+
parser.parse(args)
18+
} catch (e: CmdLineParser.OptionException) {
19+
showHelp(e.message.orEmpty())
20+
exitProcess(2)
21+
}
22+
23+
// Load parameters
24+
val host = parser.getOptionValue(options["host"],"localhost") as String
25+
val port = parser.getOptionValue(options["port"], "") as Int
26+
val reservation = parser.getOptionValue(options["reservation"], "") as String
27+
28+
// Construct a new client
29+
try {
30+
SimpleClient(host, port, reservation)
31+
} catch (e: Exception) {
32+
SimpleClient.logger.error("Beim starten des Clients ist ein Fehler aufgetreten", e)
33+
e.printStackTrace()
34+
}
35+
}
36+
37+
private fun showHelp(errorMsg: String) {
38+
val jarName = File(SimpleClient::class.java.protectionDomain.codeSource.location.file).name
39+
println("\n$errorMsg")
40+
println("""
41+
Bitte das Programm mit folgenden Parametern (optional) aufrufen:
42+
java -jar $jarName [{-h, --host} hostname]
43+
[{-p, --port} port]
44+
[{-r, --reservation} reservation]
45+
46+
Beispiel:
47+
java -jar $jarName --host 127.0.0.1 --port 10500 --reservation 1234
48+
""".trimIndent())
49+
}
50+
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package sc.player2021.logic
2+
3+
import org.slf4j.LoggerFactory
4+
import sc.framework.plugins.Player
5+
import sc.player2021.SimpleClient
6+
import sc.plugin2021.*
7+
import sc.plugin2021.util.GameRuleLogic
8+
import sc.shared.GameResult
9+
10+
/**
11+
* Das Herz des Clients:
12+
* Eine sehr simple Logik, die ihre Züge zufällig wählt,
13+
* aber gülltige Züge macht.
14+
* Außerdem werden alle aktionen geloggt und in der Konsole ausgegeben.
15+
*/
16+
class Logic(private val client: SimpleClient): IGameHandler{
17+
companion object {
18+
val logger = LoggerFactory.getLogger(Logic::class.java)
19+
}
20+
21+
private lateinit var gameState: GameState
22+
private lateinit var currentPlayer: Player
23+
24+
override fun onUpdate(player: Player, otherPlayer: Player) {
25+
currentPlayer = player
26+
logger.info("Spielerwechsel - neuer Spieler: ${player.color}")
27+
}
28+
29+
override fun onUpdate(gamestate: GameState) {
30+
this.gameState = gamestate
31+
currentPlayer = gamestate.currentPlayer
32+
logger.info("$gamestate")
33+
}
34+
35+
override fun onRequestAction() {
36+
val startTime = System.currentTimeMillis()
37+
logger.info("Es wurde ein Zug angefordert.")
38+
val possibleMoves = GameRuleLogic.getPossibleMoves()
39+
sendAction(
40+
if (possibleMoves.isEmpty()) PassMove(gameState.currentColor)
41+
else possibleMoves.random())
42+
}
43+
44+
override fun sendAction(move: Move) {
45+
client.sendMove(move)
46+
}
47+
48+
override fun gameEnded(data: GameResult, team: Team?, errorMessage: String) {
49+
logger.info("Das Spiel ist beendet.")
50+
}
51+
52+
53+
}

plugin/src/shared/sc/plugin2021/util/GameRuleLogic.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,4 +138,10 @@ object GameRuleLogic {
138138
PieceShape.values()
139139
.filter{ it.size == 5 && it != PieceShape.PENTO_X }
140140
.random()
141+
142+
/** Returns a list of all possible SetMoves. */
143+
@JvmStatic
144+
fun getPossibleMoves(): List<SetMove> {
145+
return emptyList()
146+
}
141147
}

plugin/src/test/sc/plugin2021/ManualGameTest.kts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import sc.plugin2021.Move
55
import sc.plugin2021.SetMove
66
import sc.plugin2021.helper.MoveParser
77
import sc.plugin2021.util.printShapes
8-
import kotlin.concurrent.fixedRateTimer
98
import kotlin.system.exitProcess
109

1110
assertDoesNotThrow { MoveParser.selfCheck() }

0 commit comments

Comments
 (0)