5 Commits

Author SHA1 Message Date
372f20ca6c feat(game)!: Add winner display and return to lobby functionality 2025-11-19 22:37:47 +01:00
a5dcf3ee90 feat(game): implement tie resolution and enhance player interaction (#52)
43 [Subtask] UI looks better and improved

Reviewed-on: #52
Co-authored-by: Janis <janis.e.20@gmx.de>
Co-committed-by: Janis <janis.e.20@gmx.de>
2025-11-12 11:47:05 +01:00
b9a7b0a2af feat(user-sessions): enhance game lobby management with user session handling and game full exception (#51)
Reviewed-on: #51
Co-authored-by: Janis <janis.e.20@gmx.de>
Co-committed-by: Janis <janis.e.20@gmx.de>
2025-11-01 20:53:41 +01:00
fbc0ea2277 fix(ui): add light mode styles, update font families and fixed ui (#50)
Reviewed-on: #50
Co-authored-by: Janis <janis.e.20@gmx.de>
Co-committed-by: Janis <janis.e.20@gmx.de>
2025-10-28 19:06:52 +01:00
f998d5f6f0 fix(imports): reorganized import statements for clarity and consistency (#49)
Reviewed-on: #49
Co-authored-by: Janis <janis.e.20@gmx.de>
Co-committed-by: Janis <janis.e.20@gmx.de>
2025-10-26 18:09:45 +01:00
38 changed files with 193 additions and 141 deletions

View File

@@ -37,14 +37,12 @@ class CardBaseManager extends CardManager {
}
override def nextCard(): Card = {
val card = cc(currentIdx)
if (currentIdx + 1 > 51) {
if (currentIdx > 51)
throw new IndexOutOfBoundsException("Trying to access card 53(out of bounds)")
} else {
val card = cc(currentIdx)
currentIdx += 1
card
}
}
override def removeCards(amount: Int): List[Card] = {
val removedCards = ListBuffer[Card]()

View File

@@ -16,6 +16,7 @@ trait GameLogic extends EventHandler with SnapshottingGameLogic {
def controlPreRound(): Unit
def controlRound(): Unit
def endRound(winner: AbstractPlayer, roundResult: RoundResult): Match
def returnFromTie(winner: AbstractPlayer): Unit
def controlTrick(): Unit
def endTrick(): Round
def controlPlayerPlay(): Unit
@@ -33,6 +34,8 @@ trait GameLogic extends EventHandler with SnapshottingGameLogic {
def getCurrentRound: Option[Round]
def getCurrentTrick: Option[Trick]
def getCurrentPlayer: Option[AbstractPlayer]
def getWinner: Option[AbstractPlayer]
def getTrumpPlayer: Option[AbstractPlayer]
def getPlayerQueue: Option[CustomPlayerQueue[AbstractPlayer]]
}

View File

@@ -80,12 +80,13 @@ final class BaseGameLogic(val config: Configuration) extends EventHandler with G
if (matchImpl.roundlist.isEmpty) {
if (cardManager.isEmpty) throw new IllegalStateException("No card manager set")
val cardManagerImpl = cardManager.get
cardManagerImpl.shuffleAndReset()
val firstCard = cardManagerImpl.nextCard()
val newRound = RoundUtil.createRound(firstCard.suit, true)
providePlayersWithCards()
val randomPlayer: Int = 1//Random.nextInt(matchImpl.playersIn.size)
val randomPlayer: Int = Random.nextInt(matchImpl.playersIn.size)
playerQueue = Some(config.createRightQueue(matchImpl.playersIn.toArray, randomPlayer))
matchImpl.playersIn.foreach(player => {invoke(ReceivedHandEvent(player))})
@@ -107,29 +108,39 @@ final class BaseGameLogic(val config: Configuration) extends EventHandler with G
}
}
override def returnFromTie(winner: AbstractPlayer): Unit = {
if (currentMatch.isEmpty) throw new IllegalStateException("No current match set")
val matchImpl = currentMatch.get
if (currentRound.isEmpty) throw new IllegalStateException("No current round set")
val roundImpl = currentRound.get
val roundResult: RoundResult = RoundUtil.finishRound(roundImpl, matchImpl)
val newMatch = endRound(winner, roundResult)
currentMatch = Some(newMatch)
controlMatch()
}
//
override def controlPreRound(): Unit = {
if (currentMatch.isEmpty) throw new IllegalStateException("No current match set")
val matchImpl = currentMatch.get
//Check if the last round had a winner
val lastRound = matchImpl.roundlist.last
if (lastRound.winner.isEmpty)
throw new IllegalStateException("Last round had no winner")
val lastWinner = lastRound.winner.get
val lastWinner = getTrumpPlayer
if (lastWinner.isEmpty) throw new IllegalStateException("No last round winner found")
//Create new player queue starting with last round winner
playerQueue = Some(config.createRightQueue(
matchImpl.playersIn.toArray,
matchImpl.playersIn.indexOf(lastWinner)
matchImpl.playersIn.indexOf(lastWinner.get)
))
invoke(GameStateChangeEvent(state, SelectTrump))
state = SelectTrump
invoke(TrumpSelectEvent(lastWinner))
invoke(TrumpSelectEvent(lastWinner.get))
playerInputLogic.requestTrumpSuit(lastWinner)
playerInputLogic.requestTrumpSuit(lastWinner.get)
}
override def controlRound(): Unit = {
@@ -187,7 +198,7 @@ final class BaseGameLogic(val config: Configuration) extends EventHandler with G
).map(rp => rp.amountOfTricks).sum))
invoke(DelayEvent(2000))
if (roundResult.notTricked.nonEmpty && !roundImpl.firstRound) {
if (roundResult.notTricked.nonEmpty && !resultingRound.firstRound) {
if (matchImpl.dogLife) {
invoke(ShowPlayersOutEvent(roundResult.notTricked))
invoke(DelayEvent(2000))
@@ -309,6 +320,21 @@ final class BaseGameLogic(val config: Configuration) extends EventHandler with G
override def getPlayerQueue: Option[CustomPlayerQueue[AbstractPlayer]] = playerQueue
override def getWinner: Option[AbstractPlayer] = {
if (currentMatch.isEmpty) throw new IllegalStateException("No current match set")
val matchImpl = currentMatch.get
if (!matchImpl.isOver) return None
Some(matchImpl.playersIn.head)
}
override def getTrumpPlayer: Option[AbstractPlayer] = {
if (currentMatch.isEmpty) throw new IllegalStateException("No current match set")
val matchImpl = currentMatch.get
if (matchImpl.roundlist.isEmpty) return None
val roundImpl = matchImpl.roundlist.last
if (roundImpl.winner.isEmpty) return None
Some(roundImpl.winner.get)
}
//Snapshotting
override def createSnapshot(): LogicSnapshot[BaseGameLogic.this.type] = {
@@ -316,8 +342,15 @@ final class BaseGameLogic(val config: Configuration) extends EventHandler with G
}
override def endSession(): Unit = {
//TODO Return to main menu
System.exit(0)
cardManager = None
currentMatch = None
currentRound = None
currentTrick = None
currentPlayer = None
playerQueue = None
invoke(SessionClosed())
invoke(GameStateChangeEvent(state, MainMenu))
state = MainMenu
}
}

View File

@@ -2,13 +2,10 @@ package de.knockoutwhist.control.controllerBaseImpl.sublogic
import de.knockoutwhist.KnockOutWhist
import de.knockoutwhist.control.controllerBaseImpl.BaseGameLogic
import de.knockoutwhist.control.controllerBaseImpl.sublogic.BasePlayerTieLogic
import de.knockoutwhist.control.sublogic.{PersistenceManager, PlayerTieLogic}
import de.knockoutwhist.control.sublogic.PersistenceManager
import de.knockoutwhist.control.{GameLogic, LogicSnapshot}
import de.knockoutwhist.events.util.ReloadAllEvent
import de.knockoutwhist.persistence.formats.JSONFormatter
import de.knockoutwhist.persistence.{MatchSnapshot, MethodEntryPoint}
import de.knockoutwhist.rounds.{Match, Round, Trick}
class BasePersistenceManager(val gameLogic: BaseGameLogic) extends PersistenceManager {

View File

@@ -10,8 +10,11 @@ import de.knockoutwhist.player.AbstractPlayer
final class BasePlayerInputLogic(gameLogic: BaseGameLogic) extends PlayerInputLogic {
val TIME_TO_RESPOND: Int = 30 // seconds
private var _waitingForInput: Boolean = false
override def requestTrumpSuit(player: AbstractPlayer): Unit = {
_waitingForInput = true
gameLogic.invoke(RequestTrumpSuitEvent(player))

View File

@@ -70,7 +70,7 @@ final class BasePlayerTieLogic(gameLogic: BaseGameLogic) extends PlayerTieLogic
val winner = winners.head
// Inform game logic about the winner
gameLogic.returnFromTie(winner)
}
}
@@ -111,7 +111,7 @@ final class BasePlayerTieLogic(gameLogic: BaseGameLogic) extends PlayerTieLogic
// The highest allowed number is total cards minus the number of tied players already selected
// This ensures that each tied player can select a unique card
remainingCards - (tiedPlayers.size - selectedCard.size - 1)
remainingCards - (tiedPlayers.size - (selectedCard.size + 1)) - 1
}
override def isWaitingForInput: Boolean = _waitingForInput

View File

@@ -17,7 +17,7 @@ object MatchUtil {
}
def dogNeedsToPlay(matchImpl: Match, roundImpl: Round): Boolean = {
remainingRounds(matchImpl, roundImpl) == 1
remainingRounds(matchImpl, roundImpl) <= 1
}
}

View File

@@ -34,4 +34,19 @@ object PlayerUtil {
Nil
}
def playableCards(round: Round, trick: Trick, player: AbstractPlayer): List[Card] = {
val handOption = player.currentHand()
if (handOption.isEmpty) {
throw new IllegalStateException("You have no cards!")
}
val hand = handOption.get
if (trick.firstCard.isEmpty) {
return hand.cards
}
val playableCards: List[Card] = for cardInHand <- hand.cards
if canPlayCard(cardInHand, round, trick, player)
yield cardInHand
playableCards
}
}

View File

@@ -0,0 +1,7 @@
package de.knockoutwhist.events.global
import de.knockoutwhist.utils.events.SimpleEvent
case class SessionClosed() extends SimpleEvent {
override def id: String = s"SessionClosed"
}

View File

@@ -2,7 +2,7 @@ package de.knockoutwhist.ui.gui
import atlantafx.base.theme.PrimerDark
import de.knockoutwhist.control.GameLogic
import de.knockoutwhist.control.GameState.{InGame, Lobby, MainMenu, SelectTrump, TieBreak}
import de.knockoutwhist.control.GameState.*
import de.knockoutwhist.events.global.*
import de.knockoutwhist.events.global.tie.{TieShowPlayerCardsEvent, TieTieEvent, TieTurnEvent, TieWinningPlayersEvent}
import de.knockoutwhist.events.player.{RequestCardEvent, RequestTieChoiceEvent, RequestTrumpSuitEvent}
@@ -64,6 +64,7 @@ class GUIMain extends JFXApp3 with EventListener with UI {
_tieMenu.changeSlider(logic.get.playerTieLogic.highestAllowedNumber())
case event: NewRoundEvent =>
_game.updateTrumpSuit(logic.get.getCurrentRound.get.trumpSuit)
case event: NewTrickEvent =>
_game.resetFirstCard()
case event: RoundEndEvent =>
_game.showWon(event.winner, event.amountOfTricks)

View File

@@ -5,7 +5,7 @@ import de.knockoutwhist.utils.events.{EventListener, SimpleEvent}
object DelayHandler extends EventListener {
private[knockoutwhist] var activateDelay: Boolean = false
private[knockoutwhist] var activateDelay: Boolean = true
override def listen(event: SimpleEvent): Unit = {
event match {

View File

@@ -1,7 +1,7 @@
package de.knockoutwhist.cards
import org.scalatest.wordspec.AnyWordSpec
import org.scalatest.matchers.should.Matchers
import org.scalatest.wordspec.AnyWordSpec
class HandSpec extends AnyWordSpec with Matchers {

View File

@@ -1,8 +1,8 @@
package de.knockoutwhist.cards.base
import org.scalatest.wordspec.AnyWordSpec
import de.knockoutwhist.cards.*
import org.scalatest.matchers.should.Matchers
import de.knockoutwhist.cards._
import org.scalatest.wordspec.AnyWordSpec
class CardBaseManagerSpec extends AnyWordSpec with Matchers {

View File

@@ -1,14 +1,14 @@
package de.knockoutwhist.control.controllerBaseImpl
import org.scalatest.wordspec.AnyWordSpec
import org.scalatest.matchers.should.Matchers
import de.knockoutwhist.components.Configuration
import de.knockoutwhist.cards.base.CardBaseManager
import de.knockoutwhist.cards.{Card, CardValue, Suit}
import de.knockoutwhist.components.Configuration
import de.knockoutwhist.persistence.formats.FileFormatter
import de.knockoutwhist.player.{AbstractPlayer, PlayerFactory, Playertype}
import de.knockoutwhist.utils.baseQueue.CustomPlayerBaseQueue
import de.knockoutwhist.cards.{Card, CardValue, Suit}
import de.knockoutwhist.rounds.{Round, Trick}
import de.knockoutwhist.utils.baseQueue.CustomPlayerBaseQueue
import org.scalatest.matchers.should.Matchers
import org.scalatest.wordspec.AnyWordSpec
class BaseGameLogicControlPlayerPlaySpec extends AnyWordSpec with Matchers {

View File

@@ -1,14 +1,14 @@
package de.knockoutwhist.control.controllerBaseImpl
import org.scalatest.wordspec.AnyWordSpec
import org.scalatest.matchers.should.Matchers
import de.knockoutwhist.components.Configuration
import de.knockoutwhist.cards.base.CardBaseManager
import de.knockoutwhist.cards.{Card, CardValue, Suit}
import de.knockoutwhist.components.Configuration
import de.knockoutwhist.persistence.formats.FileFormatter
import de.knockoutwhist.player.{AbstractPlayer, PlayerFactory, Playertype}
import de.knockoutwhist.utils.baseQueue.CustomPlayerBaseQueue
import de.knockoutwhist.cards.{Card, CardValue, Suit}
import de.knockoutwhist.rounds.{Round, Trick}
import de.knockoutwhist.utils.baseQueue.CustomPlayerBaseQueue
import org.scalatest.matchers.should.Matchers
import org.scalatest.wordspec.AnyWordSpec
class BaseGameLogicEndRoundSpec extends AnyWordSpec with Matchers {

View File

@@ -1,14 +1,14 @@
package de.knockoutwhist.control.controllerBaseImpl
import org.scalatest.wordspec.AnyWordSpec
import org.scalatest.matchers.should.Matchers
import de.knockoutwhist.components.Configuration
import de.knockoutwhist.cards.base.CardBaseManager
import de.knockoutwhist.cards.{Card, CardValue, Suit}
import de.knockoutwhist.components.Configuration
import de.knockoutwhist.persistence.formats.FileFormatter
import de.knockoutwhist.player.{AbstractPlayer, PlayerFactory, Playertype}
import de.knockoutwhist.utils.baseQueue.CustomPlayerBaseQueue
import de.knockoutwhist.cards.{Card, CardValue, Suit}
import de.knockoutwhist.rounds.{Round, Trick}
import de.knockoutwhist.utils.baseQueue.CustomPlayerBaseQueue
import org.scalatest.matchers.should.Matchers
import org.scalatest.wordspec.AnyWordSpec
class BaseGameLogicMoreSpec extends AnyWordSpec with Matchers {

View File

@@ -1,16 +1,17 @@
package de.knockoutwhist.control.controllerBaseImpl
import org.scalatest.wordspec.AnyWordSpec
import org.scalatest.matchers.should.Matchers
import de.knockoutwhist.components.Configuration
import de.knockoutwhist.persistence.formats.FileFormatter
import de.knockoutwhist.cards.base.CardBaseManager
import de.knockoutwhist.player.{StubPlayer, AbstractPlayer}
import de.knockoutwhist.utils.baseQueue.CustomPlayerBaseQueue
import de.knockoutwhist.rounds.Trick
import de.knockoutwhist.cards.{Card, CardValue, Suit}
import scala.collection.immutable.HashMap
import de.knockoutwhist.components.Configuration
import de.knockoutwhist.control.controllerBaseImpl.sublogic.util.{ResultPlayer, RoundResult}
import de.knockoutwhist.persistence.formats.FileFormatter
import de.knockoutwhist.player.{AbstractPlayer, StubPlayer}
import de.knockoutwhist.rounds.Trick
import de.knockoutwhist.utils.baseQueue.CustomPlayerBaseQueue
import org.scalatest.matchers.should.Matchers
import org.scalatest.wordspec.AnyWordSpec
import scala.collection.immutable.HashMap
class BaseGameLogicRoundTrickSpec extends AnyWordSpec with Matchers {

View File

@@ -1,14 +1,13 @@
package de.knockoutwhist.control.controllerBaseImpl
import org.scalatest.wordspec.AnyWordSpec
import org.scalatest.matchers.should.Matchers
import de.knockoutwhist.components.Configuration
import de.knockoutwhist.cards.base.CardBaseManager
import de.knockoutwhist.persistence.formats.FileFormatter
import de.knockoutwhist.player.{PlayerFactory, Playertype}
import de.knockoutwhist.player.AbstractPlayer
import de.knockoutwhist.utils.baseQueue.CustomPlayerBaseQueue
import de.knockoutwhist.components.Configuration
import de.knockoutwhist.control.GameState
import de.knockoutwhist.persistence.formats.FileFormatter
import de.knockoutwhist.player.{AbstractPlayer, PlayerFactory, Playertype}
import de.knockoutwhist.utils.baseQueue.CustomPlayerBaseQueue
import org.scalatest.matchers.should.Matchers
import org.scalatest.wordspec.AnyWordSpec
class BaseGameLogicSpec extends AnyWordSpec with Matchers {

View File

@@ -1,13 +1,13 @@
package de.knockoutwhist.control.controllerBaseImpl
import org.scalatest.wordspec.AnyWordSpec
import org.scalatest.matchers.should.Matchers
import de.knockoutwhist.components.Configuration
import de.knockoutwhist.cards.base.CardBaseManager
import de.knockoutwhist.components.Configuration
import de.knockoutwhist.control.GameState
import de.knockoutwhist.persistence.formats.FileFormatter
import de.knockoutwhist.player.AbstractPlayer
import de.knockoutwhist.utils.baseQueue.CustomPlayerBaseQueue
import de.knockoutwhist.control.GameState
import org.scalatest.matchers.should.Matchers
import org.scalatest.wordspec.AnyWordSpec
class BaseGameLogicStateSpec extends AnyWordSpec with Matchers {

View File

@@ -1,14 +1,14 @@
package de.knockoutwhist.control.controllerBaseImpl.sublogic
import org.scalatest.wordspec.AnyWordSpec
import org.scalatest.matchers.should.Matchers
import de.knockoutwhist.cards.base.CardBaseManager
import de.knockoutwhist.components.Configuration
import de.knockoutwhist.control.controllerBaseImpl.BaseGameLogic
import de.knockoutwhist.persistence.MethodEntryPoint
import de.knockoutwhist.persistence.formats.FileFormatter
import de.knockoutwhist.cards.base.CardBaseManager
import de.knockoutwhist.player.AbstractPlayer
import de.knockoutwhist.utils.baseQueue.CustomPlayerBaseQueue
import de.knockoutwhist.control.controllerBaseImpl.BaseGameLogic
import org.scalatest.matchers.should.Matchers
import org.scalatest.wordspec.AnyWordSpec
class BasePersistenceManagerSpec extends AnyWordSpec with Matchers {

View File

@@ -1,17 +1,16 @@
package de.knockoutwhist.control.controllerBaseImpl.sublogic
import de.knockoutwhist.cards.Suit.Spades
import org.scalatest.wordspec.AnyWordSpec
import org.scalatest.matchers.should.Matchers
import de.knockoutwhist.components.Configuration
import de.knockoutwhist.persistence.formats.FileFormatter
import de.knockoutwhist.cards.base.CardBaseManager
import de.knockoutwhist.control.controllerBaseImpl.BaseGameLogic
import de.knockoutwhist.player.StubPlayer
import de.knockoutwhist.player.AbstractPlayer
import de.knockoutwhist.utils.baseQueue.CustomPlayerBaseQueue
import de.knockoutwhist.rounds.{Round, Trick}
import de.knockoutwhist.cards.{Card, CardValue, Suit}
import de.knockoutwhist.components.Configuration
import de.knockoutwhist.control.controllerBaseImpl.BaseGameLogic
import de.knockoutwhist.persistence.formats.FileFormatter
import de.knockoutwhist.player.{AbstractPlayer, StubPlayer}
import de.knockoutwhist.rounds.{Round, Trick}
import de.knockoutwhist.utils.baseQueue.CustomPlayerBaseQueue
import org.scalatest.matchers.should.Matchers
import org.scalatest.wordspec.AnyWordSpec
import scala.collection.immutable.HashMap

View File

@@ -1,14 +1,13 @@
package de.knockoutwhist.control.controllerBaseImpl.sublogic
import org.scalatest.wordspec.AnyWordSpec
import org.scalatest.matchers.should.Matchers
import de.knockoutwhist.components.Configuration
import de.knockoutwhist.persistence.formats.FileFormatter
import de.knockoutwhist.cards.base.CardBaseManager
import de.knockoutwhist.components.Configuration
import de.knockoutwhist.control.controllerBaseImpl.BaseGameLogic
import de.knockoutwhist.player.StubPlayer
import de.knockoutwhist.player.AbstractPlayer
import de.knockoutwhist.persistence.formats.FileFormatter
import de.knockoutwhist.player.{AbstractPlayer, StubPlayer}
import de.knockoutwhist.utils.baseQueue.CustomPlayerBaseQueue
import org.scalatest.matchers.should.Matchers
import org.scalatest.wordspec.AnyWordSpec
class BasePlayerInputLogicSpec extends AnyWordSpec with Matchers {

View File

@@ -1,16 +1,15 @@
package de.knockoutwhist.control.controllerBaseImpl.sublogic
import org.scalatest.wordspec.AnyWordSpec
import org.scalatest.matchers.should.Matchers
import de.knockoutwhist.control.controllerBaseImpl.BaseGameLogic
import de.knockoutwhist.components.Configuration
import de.knockoutwhist.cards.base.CardBaseManager
import de.knockoutwhist.persistence.formats.FileFormatter
import de.knockoutwhist.player.StubPlayer
import de.knockoutwhist.control.controllerBaseImpl.sublogic.util.RoundResult
import de.knockoutwhist.player.AbstractPlayer
import de.knockoutwhist.utils.baseQueue.CustomPlayerBaseQueue
import de.knockoutwhist.cards.{Card, CardValue, Suit}
import de.knockoutwhist.components.Configuration
import de.knockoutwhist.control.controllerBaseImpl.BaseGameLogic
import de.knockoutwhist.control.controllerBaseImpl.sublogic.util.RoundResult
import de.knockoutwhist.persistence.formats.FileFormatter
import de.knockoutwhist.player.{AbstractPlayer, StubPlayer}
import de.knockoutwhist.utils.baseQueue.CustomPlayerBaseQueue
import org.scalatest.matchers.should.Matchers
import org.scalatest.wordspec.AnyWordSpec
class BasePlayerTieLogicSpec extends AnyWordSpec with Matchers {

View File

@@ -1,15 +1,16 @@
package de.knockoutwhist.control.controllerBaseImpl.sublogic
import org.scalatest.wordspec.AnyWordSpec
import org.scalatest.matchers.should.Matchers
import de.knockoutwhist.control.controllerBaseImpl.BaseGameLogic
import de.knockoutwhist.components.Configuration
import de.knockoutwhist.persistence.formats.FileFormatter
import de.knockoutwhist.cards.base.CardBaseManager
import de.knockoutwhist.components.Configuration
import de.knockoutwhist.control.controllerBaseImpl.BaseGameLogic
import de.knockoutwhist.persistence.formats.FileFormatter
import de.knockoutwhist.player.AbstractPlayer
import de.knockoutwhist.utils.baseQueue.CustomPlayerBaseQueue
import java.util.concurrent.atomic.AtomicInteger
import de.knockoutwhist.undo.Command
import de.knockoutwhist.utils.baseQueue.CustomPlayerBaseQueue
import org.scalatest.matchers.should.Matchers
import org.scalatest.wordspec.AnyWordSpec
import java.util.concurrent.atomic.AtomicInteger
class BaseUndoManagerSpec extends AnyWordSpec with Matchers {

View File

@@ -1,10 +1,10 @@
package de.knockoutwhist.control.controllerBaseImpl.sublogic.util
import org.scalatest.matchers.should.Matchers
import org.scalatest.wordspec.AnyWordSpec
import de.knockoutwhist.cards.Suit
import de.knockoutwhist.player.{PlayerFactory, Playertype}
import de.knockoutwhist.rounds.{Match, Round, Trick}
import org.scalatest.matchers.should.Matchers
import org.scalatest.wordspec.AnyWordSpec
class MatchUtilSpec extends AnyWordSpec with Matchers {

View File

@@ -1,10 +1,10 @@
package de.knockoutwhist.control.controllerBaseImpl.sublogic.util
import org.scalatest.wordspec.AnyWordSpec
import org.scalatest.matchers.should.Matchers
import de.knockoutwhist.cards.{Card, CardValue, Hand, Suit}
import de.knockoutwhist.rounds.{Round, Trick}
import de.knockoutwhist.player.StubPlayer
import de.knockoutwhist.rounds.{Round, Trick}
import org.scalatest.matchers.should.Matchers
import org.scalatest.wordspec.AnyWordSpec
class PlayerUtilSpec extends AnyWordSpec with Matchers {

View File

@@ -1,10 +1,10 @@
package de.knockoutwhist.control.controllerBaseImpl.sublogic.util
import org.scalatest.matchers.should.Matchers
import org.scalatest.wordspec.AnyWordSpec
import de.knockoutwhist.cards.{Card, CardValue, Suit}
import de.knockoutwhist.player.{PlayerFactory, Playertype}
import de.knockoutwhist.rounds.{Match, Round, Trick}
import org.scalatest.matchers.should.Matchers
import org.scalatest.wordspec.AnyWordSpec
class RoundUtilSpec extends AnyWordSpec with Matchers {

View File

@@ -1,14 +1,14 @@
package de.knockoutwhist.control.controllerBaseImpl.sublogic.util
import org.scalatest.wordspec.AnyWordSpec
import org.scalatest.matchers.should.Matchers
import de.knockoutwhist.components.Configuration
import de.knockoutwhist.cards.base.CardBaseManager
import de.knockoutwhist.persistence.formats.FileFormatter
import de.knockoutwhist.components.Configuration
import de.knockoutwhist.control.controllerBaseImpl.{BaseGameLogic, BaseGameLogicSnapshot}
import de.knockoutwhist.player.{AbstractPlayer, PlayerFactory, Playertype}
import de.knockoutwhist.control.{GameLogic, GameState, SnapshottingGameLogic}
import de.knockoutwhist.persistence.formats.FileFormatter
import de.knockoutwhist.player.{AbstractPlayer, PlayerFactory, Playertype}
import de.knockoutwhist.utils.baseQueue.CustomPlayerBaseQueue
import org.scalatest.matchers.should.Matchers
import org.scalatest.wordspec.AnyWordSpec
class SnapshotUtilSpec extends AnyWordSpec with Matchers {

View File

@@ -1,11 +1,11 @@
package de.knockoutwhist.control.controllerBaseImpl.sublogic.util
import org.scalatest.matchers.should.Matchers
import org.scalatest.wordspec.AnyWordSpec
import de.knockoutwhist.cards.{Card, CardValue, Suit}
import de.knockoutwhist.player.{PlayerFactory, Playertype}
import de.knockoutwhist.rounds.{Match, Round, Trick}
import de.knockoutwhist.utils.baseQueue.CustomPlayerBaseQueue
import org.scalatest.matchers.should.Matchers
import org.scalatest.wordspec.AnyWordSpec
class TrickUtilSpec extends AnyWordSpec with Matchers {

View File

@@ -1,9 +1,9 @@
package de.knockoutwhist.persistence.formats
import org.scalatest.wordspec.AnyWordSpec
import org.scalatest.matchers.should.Matchers
import de.knockoutwhist.cards.{Card, CardValue, Hand, Suit}
import de.knockoutwhist.player.Playertype
import de.knockoutwhist.cards.{Card, CardValue, Suit, Hand}
import org.scalatest.matchers.should.Matchers
import org.scalatest.wordspec.AnyWordSpec
import java.util.UUID

View File

@@ -1,11 +1,11 @@
package de.knockoutwhist.persistence.formats
import org.scalatest.wordspec.AnyWordSpec
import org.scalatest.matchers.should.Matchers
import play.api.libs.json._
import de.knockoutwhist.persistence._
import de.knockoutwhist.control.GameState
import de.knockoutwhist.cards.{CardValue, Suit}
import de.knockoutwhist.control.GameState
import de.knockoutwhist.persistence.*
import org.scalatest.matchers.should.Matchers
import org.scalatest.wordspec.AnyWordSpec
import play.api.libs.json.*
import java.util.UUID

View File

@@ -1,15 +1,12 @@
package de.knockoutwhist.persistence.formats
import org.scalatest.wordspec.AnyWordSpec
import org.scalatest.matchers.should.Matchers
import de.knockoutwhist.components.Configuration
import de.knockoutwhist.persistence.MatchSnapshot
import de.knockoutwhist.persistence.MethodEntryPoint
import de.knockoutwhist.cards.base.CardBaseManager
import de.knockoutwhist.player.PlayerFactory
import de.knockoutwhist.player.Playertype
import de.knockoutwhist.components.Configuration
import de.knockoutwhist.control.controllerBaseImpl.BaseGameLogic
import de.knockoutwhist.player.AbstractPlayer
import de.knockoutwhist.persistence.{MatchSnapshot, MethodEntryPoint}
import de.knockoutwhist.player.{AbstractPlayer, PlayerFactory, Playertype}
import org.scalatest.matchers.should.Matchers
import org.scalatest.wordspec.AnyWordSpec
class JSONFormatterRoundtripSpec extends AnyWordSpec with Matchers {

View File

@@ -1,8 +1,8 @@
package de.knockoutwhist.persistence.formats
import org.scalatest.wordspec.AnyWordSpec
import org.scalatest.matchers.should.Matchers
import de.knockoutwhist.persistence.*
import org.scalatest.matchers.should.Matchers
import org.scalatest.wordspec.AnyWordSpec
class JSONFormatterSpec extends AnyWordSpec with Matchers {

View File

@@ -1,8 +1,8 @@
package de.knockoutwhist.player
import org.scalatest.wordspec.AnyWordSpec
import de.knockoutwhist.cards.{Card, CardValue, Hand, Suit}
import org.scalatest.matchers.should.Matchers
import de.knockoutwhist.cards.{Card, CardValue, Suit, Hand}
import org.scalatest.wordspec.AnyWordSpec
import java.util.UUID

View File

@@ -1,9 +1,9 @@
package de.knockoutwhist.player
import org.scalatest.wordspec.AnyWordSpec
import org.scalatest.matchers.should.Matchers
import de.knockoutwhist.cards.{Card, CardValue, Hand, Suit}
import de.knockoutwhist.player.baseImpl.HumanPlayer
import de.knockoutwhist.cards.{Card, CardValue, Suit, Hand}
import org.scalatest.matchers.should.Matchers
import org.scalatest.wordspec.AnyWordSpec
class HumanPlayerSpec extends AnyWordSpec with Matchers {

View File

@@ -1,7 +1,7 @@
package de.knockoutwhist.player
import org.scalatest.wordspec.AnyWordSpec
import org.scalatest.matchers.should.Matchers
import org.scalatest.wordspec.AnyWordSpec
import java.util.UUID

View File

@@ -1,9 +1,9 @@
package de.knockoutwhist.rounds
import org.scalatest.matchers.should.Matchers
import org.scalatest.wordspec.AnyWordSpec
import de.knockoutwhist.cards.{Card, CardValue, Suit}
import de.knockoutwhist.player.{PlayerFactory, Playertype}
import org.scalatest.matchers.should.Matchers
import org.scalatest.wordspec.AnyWordSpec
class RoundsDataSpec extends AnyWordSpec with Matchers {

View File

@@ -1,8 +1,8 @@
package de.knockoutwhist.utils.baseQueue
import org.scalatest.wordspec.AnyWordSpec
import org.scalatest.matchers.should.Matchers
import de.knockoutwhist.player.StubPlayer
import org.scalatest.matchers.should.Matchers
import org.scalatest.wordspec.AnyWordSpec
class CustomPlayerBaseQueueSpec extends AnyWordSpec with Matchers {