diff --git a/modules/bot/src/main/scala/de/nowchess/bot/Bot.scala b/modules/api/src/main/scala/de/nowchess/api/bot/Bot.scala similarity index 85% rename from modules/bot/src/main/scala/de/nowchess/bot/Bot.scala rename to modules/api/src/main/scala/de/nowchess/api/bot/Bot.scala index 4865ea1..f9cb965 100644 --- a/modules/bot/src/main/scala/de/nowchess/bot/Bot.scala +++ b/modules/api/src/main/scala/de/nowchess/api/bot/Bot.scala @@ -1,4 +1,4 @@ -package de.nowchess.bot +package de.nowchess.api.bot import de.nowchess.api.game.GameContext import de.nowchess.api.move.Move diff --git a/modules/api/src/main/scala/de/nowchess/api/game/Participant.scala b/modules/api/src/main/scala/de/nowchess/api/game/Participant.scala new file mode 100644 index 0000000..d131884 --- /dev/null +++ b/modules/api/src/main/scala/de/nowchess/api/game/Participant.scala @@ -0,0 +1,9 @@ +package de.nowchess.api.game + +import de.nowchess.api.bot.Bot +import de.nowchess.api.player.PlayerInfo + +sealed trait Participant +final case class Human(playerInfo: PlayerInfo) extends Participant +final case class BotParticipant(bot: Bot) extends Participant + diff --git a/modules/bot/src/main/scala/de/nowchess/bot/BotController.scala b/modules/bot/src/main/scala/de/nowchess/bot/BotController.scala index 98a4de8..8b520d1 100644 --- a/modules/bot/src/main/scala/de/nowchess/bot/BotController.scala +++ b/modules/bot/src/main/scala/de/nowchess/bot/BotController.scala @@ -1,5 +1,6 @@ package de.nowchess.bot +import de.nowchess.api.bot.Bot import de.nowchess.bot.bots.ClassicalBot object BotController { diff --git a/modules/bot/src/main/scala/de/nowchess/bot/bots/ClassicalBot.scala b/modules/bot/src/main/scala/de/nowchess/bot/bots/ClassicalBot.scala index a91a497..0573110 100644 --- a/modules/bot/src/main/scala/de/nowchess/bot/bots/ClassicalBot.scala +++ b/modules/bot/src/main/scala/de/nowchess/bot/bots/ClassicalBot.scala @@ -1,11 +1,12 @@ package de.nowchess.bot.bots +import de.nowchess.api.bot.Bot import de.nowchess.api.game.GameContext import de.nowchess.api.move.Move import de.nowchess.bot.bots.classic.EvaluationClassic import de.nowchess.bot.logic.AlphaBetaSearch import de.nowchess.bot.util.PolyglotBook -import de.nowchess.bot.{Bot, BotDifficulty, BotMoveRepetition} +import de.nowchess.bot.{BotDifficulty, BotMoveRepetition} import de.nowchess.rules.RuleSet import de.nowchess.rules.sets.DefaultRules diff --git a/modules/bot/src/main/scala/de/nowchess/bot/bots/HybridBot.scala b/modules/bot/src/main/scala/de/nowchess/bot/bots/HybridBot.scala index 0161470..a4cc841 100644 --- a/modules/bot/src/main/scala/de/nowchess/bot/bots/HybridBot.scala +++ b/modules/bot/src/main/scala/de/nowchess/bot/bots/HybridBot.scala @@ -1,12 +1,13 @@ package de.nowchess.bot.bots +import de.nowchess.api.bot.Bot import de.nowchess.api.game.GameContext import de.nowchess.api.move.Move import de.nowchess.bot.bots.classic.EvaluationClassic import de.nowchess.bot.bots.nnue.EvaluationNNUE import de.nowchess.bot.logic.{AlphaBetaSearch, TranspositionTable} import de.nowchess.bot.util.PolyglotBook -import de.nowchess.bot.{Bot, BotDifficulty, BotMoveRepetition, Config} +import de.nowchess.bot.{BotDifficulty, BotMoveRepetition, Config} import de.nowchess.rules.RuleSet import de.nowchess.rules.sets.DefaultRules diff --git a/modules/bot/src/main/scala/de/nowchess/bot/bots/NNUEBot.scala b/modules/bot/src/main/scala/de/nowchess/bot/bots/NNUEBot.scala index 04cc85c..094989d 100644 --- a/modules/bot/src/main/scala/de/nowchess/bot/bots/NNUEBot.scala +++ b/modules/bot/src/main/scala/de/nowchess/bot/bots/NNUEBot.scala @@ -1,11 +1,12 @@ package de.nowchess.bot.bots +import de.nowchess.api.bot.Bot import de.nowchess.api.game.GameContext import de.nowchess.api.move.Move import de.nowchess.bot.bots.nnue.EvaluationNNUE import de.nowchess.bot.logic.AlphaBetaSearch import de.nowchess.bot.util.{PolyglotBook, ZobristHash} -import de.nowchess.bot.{Bot, BotDifficulty, BotMoveRepetition} +import de.nowchess.bot.{BotDifficulty, BotMoveRepetition} import de.nowchess.rules.RuleSet import de.nowchess.rules.sets.DefaultRules diff --git a/modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala b/modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala index c283b8c..f16bc90 100644 --- a/modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala +++ b/modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala @@ -2,13 +2,15 @@ package de.nowchess.chess.engine import de.nowchess.api.board.{Board, Color, Piece, PieceType, Square} import de.nowchess.api.move.{Move, MoveType, PromotionPiece} -import de.nowchess.api.game.{DrawReason, GameContext, GameResult} +import de.nowchess.api.game.{BotParticipant, DrawReason, GameContext, GameResult, Human, Participant} +import de.nowchess.api.player.{PlayerId, PlayerInfo} import de.nowchess.chess.controller.Parser import de.nowchess.chess.observer.* import de.nowchess.chess.command.{CommandInvoker, MoveCommand, MoveResult} import de.nowchess.io.{GameContextExport, GameContextImport} import de.nowchess.rules.RuleSet import de.nowchess.rules.sets.DefaultRules + import scala.concurrent.{ExecutionContext, Future} /** Pure game engine that manages game state and notifies observers of state changes. All rule queries delegate to the @@ -17,7 +19,7 @@ import scala.concurrent.{ExecutionContext, Future} class GameEngine( val initialContext: GameContext = GameContext.initial, val ruleSet: RuleSet = DefaultRules, - val participants: Map[Color, Participant] = Map(Color.White -> Human, Color.Black -> Human), + val participants: Map[Color, Participant] = Map(Color.White -> Human(PlayerInfo(PlayerId("p1"), "Player 1")), Color.Black -> Human(PlayerInfo(PlayerId("p2"), "Player 2"))), ) extends Observable: // Ensure that initialBoard is set correctly for threefold repetition detection private val contextWithInitialBoard = if initialContext.moves.isEmpty && initialContext.board != initialContext.initialBoard then diff --git a/modules/core/src/main/scala/de/nowchess/chess/engine/Participant.scala b/modules/core/src/main/scala/de/nowchess/chess/engine/Participant.scala deleted file mode 100644 index 9b0b1ee..0000000 --- a/modules/core/src/main/scala/de/nowchess/chess/engine/Participant.scala +++ /dev/null @@ -1,8 +0,0 @@ -package de.nowchess.chess.engine - -import de.nowchess.bot.Bot - -sealed trait Participant -case object Human extends Participant -final case class BotParticipant(bot: Bot) extends Participant - diff --git a/modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineWithBotTest.scala b/modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineWithBotTest.scala index 8699235..20d9376 100644 --- a/modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineWithBotTest.scala +++ b/modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineWithBotTest.scala @@ -1,13 +1,15 @@ package de.nowchess.chess.engine import de.nowchess.api.board.Color -import de.nowchess.api.game.GameContext +import de.nowchess.api.game.{BotParticipant, GameContext, Human} +import de.nowchess.api.player.{PlayerId, PlayerInfo} import de.nowchess.bot.bots.ClassicalBot import de.nowchess.bot.{BotController, BotDifficulty} import de.nowchess.chess.observer.* import de.nowchess.rules.sets.DefaultRules import org.scalatest.funsuite.AnyFunSuite import org.scalatest.matchers.should.Matchers + import java.util.concurrent.atomic.{AtomicBoolean, AtomicInteger} class GameEngineWithBotTest extends AnyFunSuite with Matchers: @@ -17,7 +19,7 @@ class GameEngineWithBotTest extends AnyFunSuite with Matchers: val engine = GameEngine( GameContext.initial, DefaultRules, - Map(Color.White -> Human, Color.Black -> BotParticipant(bot)), + Map(Color.White -> Human(PlayerInfo(PlayerId("p1"), "Player 1")), Color.Black -> BotParticipant(bot)), ) // Collect events @@ -66,7 +68,7 @@ class GameEngineWithBotTest extends AnyFunSuite with Matchers: val engine = GameEngine( GameContext.initial, DefaultRules, - Map(Color.White -> Human, Color.Black -> BotParticipant(hardBot)), + Map(Color.White -> Human(PlayerInfo(PlayerId("p1"), "Player 1")), Color.Black -> BotParticipant(hardBot)), ) engine.turn should equal(Color.White) @@ -91,7 +93,7 @@ class GameEngineWithBotTest extends AnyFunSuite with Matchers: val engine = GameEngine( GameContext.initial, DefaultRules, - Map(Color.White -> Human, Color.Black -> BotParticipant(bot)), + Map(Color.White -> Human(PlayerInfo(PlayerId("p1"), "Player 1")), Color.Black -> BotParticipant(bot)), ) val moveCount = new AtomicInteger(0) diff --git a/modules/ui/src/main/scala/de/nowchess/ui/Main.scala b/modules/ui/src/main/scala/de/nowchess/ui/Main.scala index 810543e..f5a8efd 100644 --- a/modules/ui/src/main/scala/de/nowchess/ui/Main.scala +++ b/modules/ui/src/main/scala/de/nowchess/ui/Main.scala @@ -1,5 +1,7 @@ package de.nowchess.ui +import de.nowchess.api.game.{BotParticipant, Human} +import de.nowchess.api.player.{PlayerId, PlayerInfo} import de.nowchess.bot.util.PolyglotBook import de.nowchess.bot.BotDifficulty import de.nowchess.ui.terminal.TerminalUI @@ -15,10 +17,10 @@ object Main: // Create the core game engine (single source of truth) val engine = new de.nowchess.chess.engine.GameEngine( participants = Map( - de.nowchess.api.board.Color.White -> de.nowchess.chess.engine.BotParticipant( + de.nowchess.api.board.Color.White -> BotParticipant( de.nowchess.bot.bots.HybridBot(BotDifficulty.Easy, book = Some(book)), ), - de.nowchess.api.board.Color.Black -> de.nowchess.chess.engine.Human, + de.nowchess.api.board.Color.Black -> Human(PlayerInfo(PlayerId("p1"), "Player 1")), ), )