From 05ee94443265cd08a903082a495fd8b1f76154b9 Mon Sep 17 00:00:00 2001 From: SalatielGenol Date: Sat, 20 May 2023 01:59:25 +0200 Subject: [PATCH] Project finished --- .../genol/tictactoe/ui/elements/AppContent.kt | 33 +++++++++--- .../genol/tictactoe/ui/elements/CircleIcon.kt | 9 ---- .../genol/tictactoe/ui/elements/CrossIcon.kt | 9 ---- .../genol/tictactoe/ui/elements/GameBoard.kt | 2 + .../tictactoe/ui/elements/GameDialogs.kt | 50 +++++++++++++++++++ .../es/genol/tictactoe/ui/state/GameState.kt | 28 +++++++---- .../java/es/genol/tictactoe/ui/theme/Color.kt | 3 +- .../java/es/genol/tictactoe/ui/theme/Icons.kt | 40 +++++++++++++++ .../res/drawable/baseline_handshake_24.xml | 5 ++ 9 files changed, 143 insertions(+), 36 deletions(-) create mode 100644 app/src/main/java/es/genol/tictactoe/ui/elements/GameDialogs.kt create mode 100644 app/src/main/java/es/genol/tictactoe/ui/theme/Icons.kt create mode 100644 app/src/main/res/drawable/baseline_handshake_24.xml diff --git a/app/src/main/java/es/genol/tictactoe/ui/elements/AppContent.kt b/app/src/main/java/es/genol/tictactoe/ui/elements/AppContent.kt index 5b26d64..8f590a2 100644 --- a/app/src/main/java/es/genol/tictactoe/ui/elements/AppContent.kt +++ b/app/src/main/java/es/genol/tictactoe/ui/elements/AppContent.kt @@ -1,11 +1,19 @@ package es.genol.tictactoe.ui.elements +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Close +import androidx.compose.material3.BottomAppBar import androidx.compose.material3.Button import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold import androidx.compose.material3.Surface @@ -14,17 +22,25 @@ import androidx.compose.material3.TopAppBar import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel import es.genol.tictactoe.ui.state.GameState +import es.genol.tictactoe.ui.theme.CrossIcon +import es.genol.tictactoe.ui.theme.DrawIcon import es.genol.tictactoe.ui.theme.TicTacToeTheme @OptIn(ExperimentalMaterial3Api::class) @Composable fun AppContent() { val viewModel: GameState = viewModel() - if (viewModel.isWinner) { + if (viewModel.isWinner) { + WinnerDialog(winner = viewModel.currentPlayer, behavior = { viewModel.cleanGrid() }) + } + + if (viewModel.moveNumber == 9) { + DrawDialog(behavior = { viewModel.cleanGrid() }) } TicTacToeTheme { @@ -37,8 +53,10 @@ fun AppContent() { TopAppBar( title = { Text(text = "TicTacToe") }, actions = { - Button(onClick = { viewModel.gridClean() }) { - Text(text = "REINICIAR") + if (viewModel.moveNumber != null) { + Button(onClick = { viewModel.cleanGrid() }) { + Text(text = "REINICIAR") + } } }) }, @@ -49,18 +67,19 @@ fun AppContent() { .padding(vertical = 15.dp) .fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally - ) {println("Antes de gameboard") + ) { GameBoard( boardSize = 3, playerValue = { gridId -> viewModel.gridState[gridId].player }, - buttonEnabled = !viewModel.isWinner + buttonEnabled = !viewModel.isWinner && viewModel.moveNumber != 9 ) { gridId -> - viewModel.gridMarkPlayer(gridId) + viewModel.playerMarkGrid(gridId) } } } } } -} \ No newline at end of file +} + diff --git a/app/src/main/java/es/genol/tictactoe/ui/elements/CircleIcon.kt b/app/src/main/java/es/genol/tictactoe/ui/elements/CircleIcon.kt index fed4524..0aa74fd 100644 --- a/app/src/main/java/es/genol/tictactoe/ui/elements/CircleIcon.kt +++ b/app/src/main/java/es/genol/tictactoe/ui/elements/CircleIcon.kt @@ -8,12 +8,3 @@ import androidx.compose.ui.res.painterResource import es.genol.tictactoe.R import es.genol.tictactoe.ui.theme.CustomGreen -@Composable -fun CircleIcon() { - Icon( - painter = painterResource(id = R.drawable.outline_circle_24), - contentDescription = "Cross red icon", - modifier = Modifier.fillMaxSize(), - tint = CustomGreen - ) -} \ No newline at end of file diff --git a/app/src/main/java/es/genol/tictactoe/ui/elements/CrossIcon.kt b/app/src/main/java/es/genol/tictactoe/ui/elements/CrossIcon.kt index f4eb151..42d6cba 100644 --- a/app/src/main/java/es/genol/tictactoe/ui/elements/CrossIcon.kt +++ b/app/src/main/java/es/genol/tictactoe/ui/elements/CrossIcon.kt @@ -8,12 +8,3 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import es.genol.tictactoe.ui.theme.CustomRed -@Composable -fun CrossIcon() { - Icon( - Icons.Default.Close, - contentDescription = "Cross red icon", - modifier = Modifier.fillMaxSize(), - tint = CustomRed - ) -} \ No newline at end of file diff --git a/app/src/main/java/es/genol/tictactoe/ui/elements/GameBoard.kt b/app/src/main/java/es/genol/tictactoe/ui/elements/GameBoard.kt index cc7c48c..942a8c8 100644 --- a/app/src/main/java/es/genol/tictactoe/ui/elements/GameBoard.kt +++ b/app/src/main/java/es/genol/tictactoe/ui/elements/GameBoard.kt @@ -13,6 +13,8 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp +import es.genol.tictactoe.ui.theme.CircleIcon +import es.genol.tictactoe.ui.theme.CrossIcon @Composable fun GameBoard( diff --git a/app/src/main/java/es/genol/tictactoe/ui/elements/GameDialogs.kt b/app/src/main/java/es/genol/tictactoe/ui/elements/GameDialogs.kt new file mode 100644 index 0000000..b73c74e --- /dev/null +++ b/app/src/main/java/es/genol/tictactoe/ui/elements/GameDialogs.kt @@ -0,0 +1,50 @@ +package es.genol.tictactoe.ui.elements + +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.Button +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import es.genol.tictactoe.ui.theme.CircleIcon +import es.genol.tictactoe.ui.theme.CrossIcon +import es.genol.tictactoe.ui.theme.DrawIcon + +@Composable +fun WinnerDialog( + winner: Boolean, + behavior: () -> Unit +){ + AlertDialog( + onDismissRequest = behavior, + confirmButton = { Button(onClick = behavior) { + Text(text = "Otra partida") + } }, + Modifier.fillMaxSize(.95f), + title = { Text(text = "Ganador!!!")}, + text = { + if (winner) { + CircleIcon() + } else { + CrossIcon() + } + } + ) +} + +@Composable +fun DrawDialog( + behavior: () -> Unit +){ + AlertDialog( + onDismissRequest = behavior, + confirmButton = { Button(onClick = behavior) { + Text(text = "Otra partida") + } }, + Modifier.fillMaxSize(.95f), + title = { Text(text = "Empate")}, + text = { + DrawIcon() + } + ) +} diff --git a/app/src/main/java/es/genol/tictactoe/ui/state/GameState.kt b/app/src/main/java/es/genol/tictactoe/ui/state/GameState.kt index a232202..f02ce3c 100644 --- a/app/src/main/java/es/genol/tictactoe/ui/state/GameState.kt +++ b/app/src/main/java/es/genol/tictactoe/ui/state/GameState.kt @@ -12,23 +12,31 @@ import kotlin.random.Random class GameState : ViewModel() { private var _gridState = MutableList(9) { Ficha() }.toMutableStateList() val gridState get() = _gridState.toList() - private var currentPlayer = ramdomPlayer() - var isWinner by mutableStateOf(false) - private set + private var _currentPlayer = ramdomPlayer() + val currentPlayer get() = !_currentPlayer - fun gridMarkPlayer(gridId: Int) { + private var _isWinner by mutableStateOf(false) + val isWinner get() = _isWinner + + private var _moveNumber by mutableStateOf(null) + val moveNumber get() = _moveNumber + + + fun playerMarkGrid(gridId: Int) { if (_gridState[gridId].player == null) { - _gridState[gridId] = _gridState[gridId].copy(player = currentPlayer) - isWinner = GameChecks(currentPlayer, gridData = gridState).playerWinnerCheck() - currentPlayer = !currentPlayer + _gridState[gridId] = _gridState[gridId].copy(player = _currentPlayer) + _isWinner = GameChecks(_currentPlayer, gridData = gridState).playerWinnerCheck() + _moveNumber = (_gridState.count { it.player != null }) + _currentPlayer = !_currentPlayer } } - fun gridClean() { + fun cleanGrid() { repeat(9) { _gridState[it] = Ficha() } - currentPlayer = ramdomPlayer() - isWinner = false + _currentPlayer = ramdomPlayer() + _isWinner = false + _moveNumber = null } private fun ramdomPlayer() = (Random.nextBits(bitCount = 1) > 0) diff --git a/app/src/main/java/es/genol/tictactoe/ui/theme/Color.kt b/app/src/main/java/es/genol/tictactoe/ui/theme/Color.kt index 484fa3d..255c870 100644 --- a/app/src/main/java/es/genol/tictactoe/ui/theme/Color.kt +++ b/app/src/main/java/es/genol/tictactoe/ui/theme/Color.kt @@ -11,4 +11,5 @@ val PurpleGrey40 = Color(0xFF625b71) val Pink40 = Color(0xFF7D5260) val CustomRed = Color(0xFFF72F2F) -val CustomGreen = Color(0xFF4DF72F) \ No newline at end of file +val CustomGreen = Color(0xFF4DF72F) +val CustomBlue = Color(0xFF2FA0F7) \ No newline at end of file diff --git a/app/src/main/java/es/genol/tictactoe/ui/theme/Icons.kt b/app/src/main/java/es/genol/tictactoe/ui/theme/Icons.kt new file mode 100644 index 0000000..d630b16 --- /dev/null +++ b/app/src/main/java/es/genol/tictactoe/ui/theme/Icons.kt @@ -0,0 +1,40 @@ +package es.genol.tictactoe.ui.theme + +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Close +import androidx.compose.material3.Icon +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import es.genol.tictactoe.R + +@Composable +fun CrossIcon() { + Icon( + Icons.Default.Close, + contentDescription = "Cross red icon", + modifier = Modifier.fillMaxSize(), + tint = CustomRed + ) +} + +@Composable +fun CircleIcon() { + Icon( + painter = painterResource(id = R.drawable.outline_circle_24), + contentDescription = "Cross red icon", + modifier = Modifier.fillMaxSize(), + tint = CustomGreen + ) +} + +@Composable +fun DrawIcon() { + Icon( + painter = painterResource(id = R.drawable.baseline_handshake_24), + contentDescription = "Draw blue icon", + modifier = Modifier.fillMaxSize(), + tint = CustomBlue + ) +} \ No newline at end of file diff --git a/app/src/main/res/drawable/baseline_handshake_24.xml b/app/src/main/res/drawable/baseline_handshake_24.xml new file mode 100644 index 0000000..bbd4456 --- /dev/null +++ b/app/src/main/res/drawable/baseline_handshake_24.xml @@ -0,0 +1,5 @@ + + +