Skip to content

Commit

Permalink
Change TUI printing logic
Browse files Browse the repository at this point in the history
  • Loading branch information
patzly committed Oct 28, 2024
1 parent cd1c9a7 commit 7c4f086
Show file tree
Hide file tree
Showing 8 changed files with 44 additions and 37 deletions.
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,6 @@ metals.sbt
# IDEA
.idea
.idea_modules
/.worksheet/
/.worksheet/

out/artifacts/
3 changes: 3 additions & 0 deletions src/main/resources/META-INF/MANIFEST.MF
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Manifest-Version: 1.0
Main-Class: de.htwg.se.set.Set

13 changes: 7 additions & 6 deletions src/main/scala/de/htwg/se/set/Set.scala
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,10 @@ import de.htwg.se.set.view.{Gui, Tui}

import java.awt.GraphicsEnvironment

@main
def main(): Unit =
val injector = Guice.createInjector(new SetModule)
val controller = injector.getInstance(classOf[IController])
if !GraphicsEnvironment.isHeadless then Gui(controller)
Tui(controller)
object Set:

def main(args: Array[String]): Unit =
val injector = Guice.createInjector(new SetModule)
val controller = injector.getInstance(classOf[IController])
if !GraphicsEnvironment.isHeadless then Gui(controller)
Tui(controller)
5 changes: 2 additions & 3 deletions src/main/scala/de/htwg/se/set/controller/IController.scala
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ trait IController extends Observable:
def game: IGame

def changeState(s: IState): Unit
def printState(): Unit
def currentState: String
def actionFromInput(input: String): IAction
def handleAction(action: IAction): Unit
def snapshot: Snapshot
Expand Down Expand Up @@ -52,8 +52,7 @@ trait ISnapshot:
def toJson: JsValue

trait IState:

def print(): Unit

def message: String
def actionFromInput(input: String): IAction
def handleInput(input: IUserInput): IAction
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import play.api.libs.json.Json

import java.nio.charset.StandardCharsets
import java.nio.file.{Files, Paths}
import java.security.MessageDigest
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter
import scala.xml.{Elem, PrettyPrinter, Utility, XML}
Expand All @@ -17,12 +16,12 @@ case class Controller @Inject() (var settings: ISettings, var game: IGame) exten
private val undoManager = new UndoManager
private var state: IState = SettingsState(this)

override def currentState: String = state.toString

override def changeState(s: IState): Unit =
state = s
notifyObservers(Event.STATE_CHANGED)

override def printState(): Unit = state.print()

override def actionFromInput(input: String): IAction = state.actionFromInput(input)

override def handleAction(action: IAction): Unit =
Expand Down
43 changes: 23 additions & 20 deletions src/main/scala/de/htwg/se/set/controller/controller/State.scala
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,6 @@ import scala.xml.Elem

private class State extends IState:

def print(): Unit = ()

def message: String = ""

def actionFromInput(input: String): IAction = NoAction()
Expand All @@ -28,10 +26,10 @@ private class State extends IState:

case class SettingsState(controller: IController) extends State:

override def print(): Unit =
println(PrintUtil.bold("1") + " Start game")
println(PrintUtil.bold("2") + " Change number of players")
println(PrintUtil.bold("3") + " Switch to " + (if controller.settings.easy then "normal" else "easy") + " mode")
override def toString: String =
PrintUtil.bold("1") + " Start game" + "\n" +
PrintUtil.bold("2") + " Change number of players" + "\n" +
PrintUtil.bold("3") + " Switch to " + (if controller.settings.easy then "normal" else "easy") + " mode"

override def actionFromInput(input: String): IAction =
InputUtil.intInput(input, 1, 3, controller.canUndo, controller.canRedo, false) match
Expand All @@ -42,7 +40,7 @@ case class SettingsState(controller: IController) extends State:

case class ChangePlayerCountState(controller: IController) extends State:

override def print(): Unit = println("Enter number of players:")
override def toString: String = "Enter number of players:"

override def actionFromInput(input: String): IAction =
InputUtil.intInput(input, 1, 10, controller.canUndo, controller.canRedo, false) match
Expand All @@ -51,9 +49,11 @@ case class ChangePlayerCountState(controller: IController) extends State:

case class SelectPlayerState(controller: IController) extends State:

override def print(): Unit =
override def toString: String =
if !controller.settings.singlePlayer then
println("Input player who found a SET (e.g. 1) or 0 if no SET can be found:")
"Input player who found a SET (e.g. 1) or 0 if no SET can be found:"
else
""

override def message: String = "Select player who found a SET or press ADD CARDS if no SET can be found."

Expand All @@ -69,18 +69,18 @@ case class SelectPlayerState(controller: IController) extends State:
case other => super.handleInput(other)

case class GameState(controller: IController) extends State:

override def toString: String =
if controller.settings.singlePlayer then
"Select 3 cards for a SET (e.g. A1 B2 C3):"
else
"Player " + player.number + ", select 3 cards for a SET (e.g. A1 B2 C3):"

private def player =
controller.game.selectedPlayer match
case Some(p) => p
case None => throw IllegalStateException("No player selected")

override def print(): Unit =
if controller.settings.singlePlayer then
println("Select 3 cards for a SET (e.g. A1 B2 C3):")
else
println("Player " + player.number + ", select 3 cards for a SET (e.g. A1 B2 C3):")

override def message: String =
if controller.settings.singlePlayer then
"Select 3 cards for a SET."
Expand All @@ -95,11 +95,14 @@ case class GameState(controller: IController) extends State:

case class GameEndState(controller: IController) extends State:

override def print(): Unit =
println("\n" + PrintUtil.yellow(PrintUtil.bold("All SETs found!")))
if !controller.settings.singlePlayer then
controller.game.players.sortBy(player => (-player.sets.length, player.number)).foreach(player => println(player))
println("\nType f to finish:")
override def toString: String =
val players = controller.game.players
.sortBy(player => (-player.sets.length, player.number))
.map(player => player.toString)
.mkString("\n")
"\n" + PrintUtil.yellow(PrintUtil.bold("All SETs found!"))
+ (if !controller.settings.singlePlayer then "\n" + players else "")
+ "\nType f to finish:"

override def actionFromInput(input: String): IAction =
InputUtil.finishInput(input, controller.canUndo, controller.canRedo) match
Expand Down
2 changes: 1 addition & 1 deletion src/main/scala/de/htwg/se/set/model/game/Grid.scala
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ case class Grid(columns: Int, cards: List[ICard], easy: Boolean) extends IGrid:
private def columnWidth: Int = if easy then 3 else 4

private def legend(columns: Int): String =
" " + (65 until 65 + columns).map(_.toChar).map("" + _ + (" " * (columnWidth - 1))).mkString
">>" + (65 until 65 + columns).map(_.toChar).map("" + _ + (">" * (columnWidth - 1))).mkString

private def line(columns: Int): String = "──" + ("" + "" * columnWidth) * columns

Expand Down
6 changes: 3 additions & 3 deletions src/main/scala/de/htwg/se/set/view/Tui.scala
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package de.htwg.se.set.view

import de.htwg.se.set.controller.controller.InvalidAction
import de.htwg.se.set.controller.controller.{InvalidAction, NoAction}
import de.htwg.se.set.controller.{Event, IAction, IController}
import de.htwg.se.set.util.{Observer, PrintUtil}

Expand All @@ -13,7 +13,7 @@ case class Tui(controller: IController) extends Observer:

println(PrintUtil.bold("Welcome to the SET Game!"))
println(controller.settingsToString)
controller.printState()
println(controller.currentState)
loop()

@tailrec
Expand All @@ -34,5 +34,5 @@ case class Tui(controller: IController) extends Observer:
case Event.SETTINGS_CHANGED => println(controller.settingsToString)
case Event.CARDS_CHANGED => println(controller.gameToString)
case Event.SETTINGS_OR_GAME_CHANGED => println(controller)
case Event.STATE_CHANGED => controller.printState()
case Event.STATE_CHANGED => println(controller.currentState)
case _ =>

0 comments on commit 7c4f086

Please sign in to comment.