feat: 每个模式分别记忆AI难度、手牌上限、总玩家数

This commit is contained in:
flykhan 2026-04-26 22:30:49 +08:00
parent bfd22f56a8
commit 800238df40
4 changed files with 25 additions and 10 deletions

View File

@ -75,5 +75,17 @@ data class GameRules(
GameMode.NO_MERCY -> 10 GameMode.NO_MERCY -> 10
else -> 0 // no limit for other modes 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()
}
} }
} }

View File

@ -10,17 +10,19 @@ enum class AIDifficulty(val displayName: String) {
HARD("困难"); HARD("困难");
companion object { 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) 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 } 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) context.getSharedPreferences("unogame_prefs", Context.MODE_PRIVATE)
.edit().putString(KEY, diff.name).apply() .edit().putString(key, diff.name).apply()
} }
} }
} }

View File

@ -128,7 +128,7 @@ fun LocalGameScreen(
val context = LocalContext.current val context = LocalContext.current
val rules = remember { GameRules.forMode(mode, GameRules.loadMaxHandSize(context, mode)) } val rules = remember { GameRules.forMode(mode, GameRules.loadMaxHandSize(context, mode)) }
val engine = remember { GameEngine(rules) } val engine = remember { GameEngine(rules) }
val aiDiff = remember { AIDifficulty.load(context) } val aiDiff = remember { AIDifficulty.load(context, mode) }
val gameStartTime = remember { System.currentTimeMillis() } val gameStartTime = remember { System.currentTimeMillis() }
val players = remember { val players = remember {

View File

@ -34,10 +34,10 @@ fun LocalSetupScreen(
onStartGame: (Int, String, List<String>) -> Unit, onStartGame: (Int, String, List<String>) -> Unit,
onBack: () -> 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 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) } val initMaxHandSize = remember { com.unogame.game.GameRules.loadMaxHandSize(context, mode) }
var maxHandSize by remember { mutableIntStateOf(initMaxHandSize) } var maxHandSize by remember { mutableIntStateOf(initMaxHandSize) }
@ -310,8 +310,9 @@ fun LocalSetupScreen(
Button( Button(
onClick = { 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.saveMaxHandSize(context, mode, maxHandSize)
com.unogame.game.GameRules.savePlayerCount(context, mode, totalPlayers)
onStartGame(totalPlayers, name.ifBlank { "玩家" }, botNames.take(totalPlayers - 1)) onStartGame(totalPlayers, name.ifBlank { "玩家" }, botNames.take(totalPlayers - 1))
}, },
modifier = Modifier.fillMaxWidth().height(56.dp), modifier = Modifier.fillMaxWidth().height(56.dp),