From 800238df407e7f9fe5a81c7ea8d739c5a6a5665f Mon Sep 17 00:00:00 2001 From: flykhan Date: Sun, 26 Apr 2026 22:30:49 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=AF=8F=E4=B8=AA=E6=A8=A1=E5=BC=8F?= =?UTF-8?q?=E5=88=86=E5=88=AB=E8=AE=B0=E5=BF=86AI=E9=9A=BE=E5=BA=A6?= =?UTF-8?q?=E3=80=81=E6=89=8B=E7=89=8C=E4=B8=8A=E9=99=90=E3=80=81=E6=80=BB?= =?UTF-8?q?=E7=8E=A9=E5=AE=B6=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/unogame/game/GameRules.kt | 12 ++++++++++++ app/src/main/java/com/unogame/game/SimpleAI.kt | 12 +++++++----- .../java/com/unogame/ui/screens/LocalGameScreen.kt | 2 +- .../java/com/unogame/ui/screens/LocalSetupScreen.kt | 9 +++++---- 4 files changed, 25 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/unogame/game/GameRules.kt b/app/src/main/java/com/unogame/game/GameRules.kt index 9a03ff2..31b5231 100644 --- a/app/src/main/java/com/unogame/game/GameRules.kt +++ b/app/src/main/java/com/unogame/game/GameRules.kt @@ -75,5 +75,17 @@ data class GameRules( GameMode.NO_MERCY -> 10 else -> 0 // no limit for other modes } + + private const val PLAYERS_KEY_PREFIX = "players_" + + fun loadPlayerCount(context: Context, mode: GameMode): Int { + return context.getSharedPreferences("unogame_prefs", Context.MODE_PRIVATE) + .getInt(PLAYERS_KEY_PREFIX + mode.name, 2) + } + + fun savePlayerCount(context: Context, mode: GameMode, count: Int) { + context.getSharedPreferences("unogame_prefs", Context.MODE_PRIVATE) + .edit().putInt(PLAYERS_KEY_PREFIX + mode.name, count).apply() + } } } diff --git a/app/src/main/java/com/unogame/game/SimpleAI.kt b/app/src/main/java/com/unogame/game/SimpleAI.kt index 9c71740..659b90c 100644 --- a/app/src/main/java/com/unogame/game/SimpleAI.kt +++ b/app/src/main/java/com/unogame/game/SimpleAI.kt @@ -10,17 +10,19 @@ enum class AIDifficulty(val displayName: String) { HARD("困难"); companion object { - private const val KEY = "ai_difficulty" + private const val KEY_PREFIX = "ai_diff_" - fun load(context: Context): AIDifficulty { + fun load(context: Context, mode: GameMode): AIDifficulty { + val key = KEY_PREFIX + mode.name val name = context.getSharedPreferences("unogame_prefs", Context.MODE_PRIVATE) - .getString(KEY, NORMAL.name) ?: NORMAL.name + .getString(key, NORMAL.name) ?: NORMAL.name return try { valueOf(name) } catch (_: Exception) { NORMAL } } - fun save(context: Context, diff: AIDifficulty) { + fun save(context: Context, mode: GameMode, diff: AIDifficulty) { + val key = KEY_PREFIX + mode.name context.getSharedPreferences("unogame_prefs", Context.MODE_PRIVATE) - .edit().putString(KEY, diff.name).apply() + .edit().putString(key, diff.name).apply() } } } diff --git a/app/src/main/java/com/unogame/ui/screens/LocalGameScreen.kt b/app/src/main/java/com/unogame/ui/screens/LocalGameScreen.kt index 1a9c270..5199eed 100644 --- a/app/src/main/java/com/unogame/ui/screens/LocalGameScreen.kt +++ b/app/src/main/java/com/unogame/ui/screens/LocalGameScreen.kt @@ -128,7 +128,7 @@ fun LocalGameScreen( val context = LocalContext.current val rules = remember { GameRules.forMode(mode, GameRules.loadMaxHandSize(context, mode)) } val engine = remember { GameEngine(rules) } - val aiDiff = remember { AIDifficulty.load(context) } + val aiDiff = remember { AIDifficulty.load(context, mode) } val gameStartTime = remember { System.currentTimeMillis() } val players = remember { diff --git a/app/src/main/java/com/unogame/ui/screens/LocalSetupScreen.kt b/app/src/main/java/com/unogame/ui/screens/LocalSetupScreen.kt index 03c41a1..a6365d8 100644 --- a/app/src/main/java/com/unogame/ui/screens/LocalSetupScreen.kt +++ b/app/src/main/java/com/unogame/ui/screens/LocalSetupScreen.kt @@ -34,10 +34,10 @@ fun LocalSetupScreen( onStartGame: (Int, String, List) -> Unit, onBack: () -> Unit ) { - var totalPlayers by remember { mutableIntStateOf(2) } - var name by remember { mutableStateOf(playerName) } - var difficulty by remember { mutableStateOf(com.unogame.game.AIDifficulty.NORMAL) } val context = androidx.compose.ui.platform.LocalContext.current + var totalPlayers by remember { mutableIntStateOf(com.unogame.game.GameRules.loadPlayerCount(context, mode)) } + var name by remember { mutableStateOf(playerName) } + var difficulty by remember { mutableStateOf(com.unogame.game.AIDifficulty.load(context, mode)) } val initMaxHandSize = remember { com.unogame.game.GameRules.loadMaxHandSize(context, mode) } var maxHandSize by remember { mutableIntStateOf(initMaxHandSize) } @@ -310,8 +310,9 @@ fun LocalSetupScreen( Button( onClick = { - com.unogame.game.AIDifficulty.save(context, difficulty) + com.unogame.game.AIDifficulty.save(context, mode, difficulty) com.unogame.game.GameRules.saveMaxHandSize(context, mode, maxHandSize) + com.unogame.game.GameRules.savePlayerCount(context, mode, totalPlayers) onStartGame(totalPlayers, name.ifBlank { "玩家" }, botNames.take(totalPlayers - 1)) }, modifier = Modifier.fillMaxWidth().height(56.dp),