diff --git a/.gitignore b/.gitignore index 54929cc..aae6ecb 100644 --- a/.gitignore +++ b/.gitignore @@ -55,6 +55,9 @@ google-services.json *.tar.gz *.rar +# Gradle wrapper jar (required for build) +!gradle/wrapper/gradle-wrapper.jar + # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid* replay_pid* diff --git a/app/src/main/java/com/unogame/MainActivity.kt b/app/src/main/java/com/unogame/MainActivity.kt index e618e9d..e490842 100644 --- a/app/src/main/java/com/unogame/MainActivity.kt +++ b/app/src/main/java/com/unogame/MainActivity.kt @@ -409,9 +409,7 @@ fun UnoApp() { botNames = botNames, handOffset = handOffset, onBackToMenu = { - navController.navigate(Screen.MainMenu.route) { - popUpTo(0) { inclusive = true } - } + navController.popBackStack() } ) } diff --git a/app/src/main/java/com/unogame/ui/screens/GameOverScreen.kt b/app/src/main/java/com/unogame/ui/screens/GameOverScreen.kt index f39bc81..cc1a2b9 100644 --- a/app/src/main/java/com/unogame/ui/screens/GameOverScreen.kt +++ b/app/src/main/java/com/unogame/ui/screens/GameOverScreen.kt @@ -113,9 +113,9 @@ fun GameOverScreen( contentColor = Color.Black ) ) { - Icon(Icons.Default.Home, null) + Icon(Icons.Default.Refresh, null) Spacer(modifier = Modifier.width(8.dp)) - Text("返回主菜单", fontSize = 18.sp, fontWeight = FontWeight.Bold) + Text("再来一局", fontSize = 18.sp, fontWeight = FontWeight.Bold) } } } diff --git a/app/src/main/java/com/unogame/ui/screens/GameScreen.kt b/app/src/main/java/com/unogame/ui/screens/GameScreen.kt index 3cb5b25..9a22cbf 100644 --- a/app/src/main/java/com/unogame/ui/screens/GameScreen.kt +++ b/app/src/main/java/com/unogame/ui/screens/GameScreen.kt @@ -36,6 +36,7 @@ fun GameScreen( onChallengeUno: (String) -> Unit = {}, onShowLog: () -> Unit = {}, onPlaySeven: (Int) -> Unit = {}, + onBack: () -> Unit = {}, isSevenZeroMode: Boolean = false, handOffset: Float = 0f, errorMessage: String @@ -128,6 +129,9 @@ fun GameScreen( color = LocalTextOnTable.current.copy(alpha = 0.6f), fontSize = 14.sp ) + IconButton(onClick = { onBack() }, modifier = Modifier.size(28.dp)) { + Icon(Icons.Default.Close, "退出", tint = LocalTextOnTable.current.copy(alpha = 0.5f), modifier = Modifier.size(18.dp)) + } } Spacer(modifier = Modifier.height(8.dp)) 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 8a77a5d..8a6f59a 100644 --- a/app/src/main/java/com/unogame/ui/screens/LocalGameScreen.kt +++ b/app/src/main/java/com/unogame/ui/screens/LocalGameScreen.kt @@ -1,6 +1,7 @@ package com.unogame.ui.screens import android.content.Context +import androidx.activity.compose.BackHandler import androidx.compose.animation.core.animateFloatAsState import androidx.compose.animation.core.spring import androidx.compose.foundation.background @@ -170,6 +171,7 @@ fun LocalGameScreen( var showLogDialog by remember { mutableStateOf(false) } var showSwapTargetPicker by remember { mutableStateOf(false) } var pendingSwapState by remember { mutableStateOf(null) } + var showExitConfirm by remember { mutableStateOf(false) } val myPlayerId = "human" val currentPlayer = gameState.currentPlayer @@ -611,6 +613,27 @@ fun LocalGameScreen( playerCount = totalPlayers ) } else { + // 退出确认弹窗 + if (showExitConfirm) { + AlertDialog( + onDismissRequest = { showExitConfirm = false }, + title = { Text("退出游戏", color = GoldAccent) }, + text = { Text("确定要退出当前对局吗?", color = Color.White.copy(alpha = 0.8f)) }, + confirmButton = { + TextButton(onClick = { showExitConfirm = false; onBackToMenu() }) { + Text("退出", color = UnoRed) + } + }, + dismissButton = { + TextButton(onClick = { showExitConfirm = false }) { + Text("继续", color = GoldAccent) + } + }, + containerColor = DarkSurface + ) + } + // 拦截系统返回键 + BackHandler { showExitConfirm = true } GameScreen( gameState = gameState, myCards = displayCards, @@ -624,6 +647,7 @@ fun LocalGameScreen( onDrawCard = { executeDraw() }, onChooseColor = { selectedWildColor = it }, onShowLog = { showLogDialog = true }, + onBack = { showExitConfirm = true }, onCallUno = { // Mark player as having called UNO val updated = gameState.players.map { diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..d64cd49 Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ