Skip to content

Commit

Permalink
refactoring: get rid of GameDifficulty, use DifficultySetting instead
Browse files Browse the repository at this point in the history
  • Loading branch information
meikpiep committed Feb 27, 2025
1 parent cac6b94 commit b52f9a9
Show file tree
Hide file tree
Showing 15 changed files with 199 additions and 210 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,11 @@ import com.skydoves.balloon.ArrowPositionRules
import com.skydoves.balloon.BalloonAnimation
import com.skydoves.balloon.BalloonSizeSpec
import com.skydoves.balloon.createBalloon
import org.piepmeyer.gauguin.difficulty.GameDifficulty
import org.piepmeyer.gauguin.options.DifficultySetting
import org.piepmeyer.gauguin.options.GameVariant

class MainGameDifficultyLevelBalloon(
private val difficulty: GameDifficulty?,
private val difficulty: DifficultySetting?,
private val variant: GameVariant,
) {
fun showBalloon(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,15 @@ import com.google.android.material.textview.MaterialTextView
import org.piepmeyer.gauguin.R
import org.piepmeyer.gauguin.databinding.FragmentGameDifficultyLevelBinding
import org.piepmeyer.gauguin.difficulty.DisplayableGameDifficultyThreshold
import org.piepmeyer.gauguin.difficulty.GameDifficulty
import org.piepmeyer.gauguin.difficulty.GameDifficultyRater
import org.piepmeyer.gauguin.difficulty.GameDifficultyRating
import org.piepmeyer.gauguin.options.DifficultySetting
import org.piepmeyer.gauguin.options.GameVariant
import java.math.BigDecimal
import java.text.DecimalFormat

class MainGameDifficultyLevelFragment(
private val difficulty: GameDifficulty?,
private val difficulty: DifficultySetting?,
private val variant: GameVariant,
) : Fragment(R.layout.fragment_game_difficulty_level) {
private lateinit var binding: FragmentGameDifficultyLevelBinding
Expand All @@ -41,7 +41,7 @@ class MainGameDifficultyLevelFragment(
if (rating != null) {
layoutWithRating(rating)

if (difficulty != null) {
if (difficulty != null && difficulty != DifficultySetting.ANY) {
layoutWithDifficulty(difficulty, parent)
} else {
layoutWithoutDifficulty()
Expand Down Expand Up @@ -71,34 +71,39 @@ class MainGameDifficultyLevelFragment(
private fun layoutWithRating(rating: GameDifficultyRating) {
val uiRating = DisplayableGameDifficultyThreshold(rating)

binding.veryEasyMaximumValue.text = formatDifficulty(uiRating.thresholdText(GameDifficulty.EASY))
binding.easyMinimumValue.text = formatDifficulty(uiRating.thresholdText(GameDifficulty.EASY))
binding.easyMaximumValue.text = formatDifficulty(uiRating.thresholdText(GameDifficulty.MEDIUM))
binding.mediumMinimumValue.text = formatDifficulty(uiRating.thresholdText(GameDifficulty.MEDIUM))
binding.mediumMaximumValue.text = formatDifficulty(uiRating.thresholdText(GameDifficulty.HARD))
binding.hardMinimumValue.text = formatDifficulty(uiRating.thresholdText(GameDifficulty.HARD))
binding.hardMaximumValue.text = formatDifficulty(uiRating.thresholdText(GameDifficulty.EXTREME))
binding.extremeMinimumValue.text = formatDifficulty(uiRating.thresholdText(GameDifficulty.EXTREME))
binding.veryEasyMaximumValue.text =
formatDifficulty(
uiRating.thresholdText(
DifficultySetting.EASY,
),
)
binding.easyMinimumValue.text = formatDifficulty(uiRating.thresholdText(DifficultySetting.EASY))
binding.easyMaximumValue.text = formatDifficulty(uiRating.thresholdText(DifficultySetting.MEDIUM))
binding.mediumMinimumValue.text = formatDifficulty(uiRating.thresholdText(DifficultySetting.MEDIUM))
binding.mediumMaximumValue.text = formatDifficulty(uiRating.thresholdText(DifficultySetting.HARD))
binding.hardMinimumValue.text = formatDifficulty(uiRating.thresholdText(DifficultySetting.HARD))
binding.hardMaximumValue.text = formatDifficulty(uiRating.thresholdText(DifficultySetting.EXTREME))
binding.extremeMinimumValue.text = formatDifficulty(uiRating.thresholdText(DifficultySetting.EXTREME))
}

private fun layoutWithDifficulty(
difficulty: GameDifficulty,
difficulty: DifficultySetting,
parent: ViewGroup?,
) {
val referenceId =
when (difficulty) {
GameDifficulty.VERY_EASY -> R.id.veryEasy
GameDifficulty.EASY -> R.id.easy
GameDifficulty.MEDIUM -> R.id.medium
GameDifficulty.HARD -> R.id.hard
GameDifficulty.EXTREME -> R.id.extreme
DifficultySetting.VERY_EASY -> R.id.veryEasy
DifficultySetting.EASY -> R.id.easy
DifficultySetting.MEDIUM -> R.id.medium
DifficultySetting.HARD -> R.id.hard
DifficultySetting.EXTREME, DifficultySetting.ANY -> R.id.extreme
}

setHighlighterConstraintsToMatch(difficulty, referenceId, parent)
}

private fun setHighlighterConstraintsToMatch(
difficulty: GameDifficulty?,
difficulty: DifficultySetting?,
referenceId: Int,
parent: ViewGroup?,
) {
Expand Down Expand Up @@ -141,52 +146,54 @@ class MainGameDifficultyLevelFragment(
constraintSet.applyTo(binding.mainGameDifficultyLevelConstaintLayout)
}

private fun hightlightedTextViews(difficulty: GameDifficulty): List<MaterialTextView> =
private fun hightlightedTextViews(difficulty: DifficultySetting): List<MaterialTextView> =
when (difficulty) {
GameDifficulty.VERY_EASY -> listOf(binding.veryEasy, binding.veryEasyMinimumValue, binding.veryEasyMaximumValue)
GameDifficulty.EASY -> listOf(binding.easy, binding.easyMinimumValue, binding.easyMaximumValue)
GameDifficulty.MEDIUM -> listOf(binding.medium, binding.mediumMinimumValue, binding.mediumMaximumValue)
GameDifficulty.HARD -> listOf(binding.hard, binding.hardMinimumValue, binding.hardMaximumValue)
GameDifficulty.EXTREME -> listOf(binding.extreme, binding.extremeMinimumValue, binding.extremeMaximumValue)
DifficultySetting.VERY_EASY -> listOf(binding.veryEasy, binding.veryEasyMinimumValue, binding.veryEasyMaximumValue)
DifficultySetting.EASY -> listOf(binding.easy, binding.easyMinimumValue, binding.easyMaximumValue)
DifficultySetting.MEDIUM -> listOf(binding.medium, binding.mediumMinimumValue, binding.mediumMaximumValue)
DifficultySetting.HARD -> listOf(binding.hard, binding.hardMinimumValue, binding.hardMaximumValue)
DifficultySetting.EXTREME -> listOf(binding.extreme, binding.extremeMinimumValue, binding.extremeMaximumValue)
DifficultySetting.ANY -> emptyList()
}

private fun hightlightedImageViews(difficulty: GameDifficulty): List<ImageView> =
private fun hightlightedImageViews(difficulty: DifficultySetting): List<ImageView> =
when (difficulty) {
GameDifficulty.VERY_EASY ->
DifficultySetting.VERY_EASY ->
listOf(
binding.ratingStarVeryEasyOne,
binding.ratingStarVeryEasyTwo,
binding.ratingStarVeryEasyThree,
binding.ratingStarVeryEasyFour,
)
GameDifficulty.EASY ->
DifficultySetting.EASY ->
listOf(
binding.ratingStarEasyOne,
binding.ratingStarEasyTwo,
binding.ratingStarEasyThree,
binding.ratingStarEasyFour,
)
GameDifficulty.MEDIUM ->
DifficultySetting.MEDIUM ->
listOf(
binding.ratingStarMediumOne,
binding.ratingStarMediumTwo,
binding.ratingStarMediumThree,
binding.ratingStarMediumFour,
)
GameDifficulty.HARD ->
DifficultySetting.HARD ->
listOf(
binding.ratingStarHardOne,
binding.ratingStarHardTwo,
binding.ratingStarHardThree,
binding.ratingStarHardFour,
)
GameDifficulty.EXTREME ->
DifficultySetting.EXTREME ->
listOf(
binding.ratingStarExtremeOne,
binding.ratingStarExtremeTwo,
binding.ratingStarExtremeThree,
binding.ratingStarExtremeFour,
)
DifficultySetting.ANY -> emptyList()
}

private fun layoutWithoutDifficulty() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,12 @@ import org.piepmeyer.gauguin.R
import org.piepmeyer.gauguin.Utils
import org.piepmeyer.gauguin.databinding.FragmentMainGameTopBinding
import org.piepmeyer.gauguin.difficulty.DisplayableGameDifficulty
import org.piepmeyer.gauguin.difficulty.GameDifficulty
import org.piepmeyer.gauguin.difficulty.GameDifficultyRater
import org.piepmeyer.gauguin.difficulty.human.HumanDifficultyCalculator
import org.piepmeyer.gauguin.game.Game
import org.piepmeyer.gauguin.game.GameLifecycle
import org.piepmeyer.gauguin.game.PlayTimeListener
import org.piepmeyer.gauguin.options.DifficultySetting
import org.piepmeyer.gauguin.preferences.ApplicationPreferences
import org.piepmeyer.gauguin.ui.difficulty.MainGameDifficultyLevelBalloon
import org.piepmeyer.gauguin.ui.difficulty.MainGameDifficultyLevelFragment
Expand Down Expand Up @@ -172,35 +172,35 @@ class GameTopFragment :
}
}

private fun setStarsByDifficulty(difficulty: GameDifficulty?) {
private fun setStarsByDifficulty(difficulty: DifficultySetting?) {
if (difficulty == null) return

setStarByDifficulty(
binding.ratingStarOne,
difficulty,
GameDifficulty.EASY,
DifficultySetting.EASY,
)
setStarByDifficulty(
binding.ratingStarTwo,
difficulty,
GameDifficulty.MEDIUM,
DifficultySetting.MEDIUM,
)
setStarByDifficulty(
binding.ratingStarThree,
difficulty,
GameDifficulty.HARD,
DifficultySetting.HARD,
)
setStarByDifficulty(
binding.ratingStarFour,
difficulty,
GameDifficulty.EXTREME,
DifficultySetting.EXTREME,
)
}

private fun setStarByDifficulty(
view: ImageView,
difficulty: GameDifficulty,
minimumDifficulty: GameDifficulty,
difficulty: DifficultySetting,
minimumDifficulty: DifficultySetting,
) {
if (difficulty >= minimumDifficulty) {
view.setImageResource(R.drawable.filled_star_20)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ class GridCellOptionsFragment :

val difficultyOrNull =
if (variant.variant.options.difficultySetting != DifficultySetting.ANY) {
variant.variant.options.difficultySetting.gameDifficulty
variant.variant.options.difficultySetting
} else {
null
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,51 +12,52 @@ import org.piepmeyer.gauguin.options.GridCageOperation
import org.piepmeyer.gauguin.options.NumeralSystem
import org.piepmeyer.gauguin.options.SingleCageUsage

class TestGridCreator : FunSpec({
test("3x3GridCreationWithoutRandomValues") {
val creator =
GridCreator(
GameVariant(
GridSize(3, 3),
GameOptionsVariant(
true,
GridCageOperation.OPERATIONS_ALL,
DigitSetting.FIRST_DIGIT_ONE,
DifficultySetting.ANY,
SingleCageUsage.FIXED_NUMBER,
NumeralSystem.Decimal,
class TestGridCreator :
FunSpec({
test("3x3GridCreationWithoutRandomValues") {
val creator =
GridCreator(
GameVariant(
GridSize(3, 3),
GameOptionsVariant(
true,
GridCageOperation.OPERATIONS_ALL,
DigitSetting.FIRST_DIGIT_ONE,
DifficultySetting.ANY,
SingleCageUsage.FIXED_NUMBER,
NumeralSystem.Decimal,
),
),
),
OnlyZeroRandomizerMock(),
ShufflerStub(),
)
OnlyZeroRandomizerMock(),
ShufflerStub(),
)

val grid = creator.createRandomizedGridWithCages()
val grid = creator.createRandomizedGridWithCages()

grid.getValidCellAt(0, 0).value shouldBe 1
grid.getValidCellAt(0, 1).value shouldBe 2
grid.getValidCellAt(0, 2).value shouldBe 3
grid.getValidCellAt(1, 0).value shouldBe 2
grid.getValidCellAt(1, 1).value shouldBe 3
grid.getValidCellAt(1, 2).value shouldBe 1
grid.getValidCellAt(2, 0).value shouldBe 3
grid.getValidCellAt(2, 1).value shouldBe 1
grid.getValidCellAt(2, 2).value shouldBe 2
}
grid.getValidCellAt(0, 0).value shouldBe 1
grid.getValidCellAt(0, 1).value shouldBe 2
grid.getValidCellAt(0, 2).value shouldBe 3
grid.getValidCellAt(1, 0).value shouldBe 2
grid.getValidCellAt(1, 1).value shouldBe 3
grid.getValidCellAt(1, 2).value shouldBe 1
grid.getValidCellAt(2, 0).value shouldBe 3
grid.getValidCellAt(2, 1).value shouldBe 1
grid.getValidCellAt(2, 2).value shouldBe 2
}

test("deterministic random number generator leads to deterministic grids") {
val variant =
GameVariant(
GridSize(10, 10),
GameOptionsVariant.createClassic(),
)
test("deterministic random number generator leads to deterministic grids") {
val variant =
GameVariant(
GridSize(10, 10),
GameOptionsVariant.createClassic(),
)

val gridOne = calculateGrid(variant)
val gridTwo = calculateGrid(variant)
val gridOne = calculateGrid(variant)
val gridTwo = calculateGrid(variant)

gridOne.toString() shouldBe gridTwo.toString()
}
})
gridOne.toString() shouldBe gridTwo.toString()
}
})

private suspend fun calculateGrid(variant: GameVariant): Grid {
val randomizer = SeedRandomizerMock(1)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,16 @@ import org.piepmeyer.gauguin.options.SingleCageUsage

private val logger = KotlinLogging.logger {}

class TestMergingCageGridCalculatorDistribution : FunSpec({
xtest("calculateValues 6x6") {
testHundredGrids(6)
}
class TestMergingCageGridCalculatorDistribution :
FunSpec({
xtest("calculateValues 6x6") {
testHundredGrids(6)
}

xtest("calculateValues 9x9") {
testHundredGrids(9)
}
}) {
xtest("calculateValues 9x9") {
testHundredGrids(9)
}
}) {
companion object {
private fun testHundredGrids(size: Int) {
val difficultiesAndSingles =
Expand Down Expand Up @@ -59,7 +60,9 @@ class TestMergingCageGridCalculatorDistribution : FunSpec({
"maximum ${sortedSingles.max()}"
}

sortedSingles.groupingBy { it }.eachCount()
sortedSingles
.groupingBy { it }
.eachCount()
.forEach { (singles, count) ->
logger.info { "singles $singles: $count" }
}
Expand Down
Loading

0 comments on commit b52f9a9

Please sign in to comment.