diff --git a/app/src/main/java/es/genol/tictactoe/GameChecks.kt b/app/src/main/java/es/genol/tictactoe/GameChecks.kt index e1e0c0f..67cb248 100644 --- a/app/src/main/java/es/genol/tictactoe/GameChecks.kt +++ b/app/src/main/java/es/genol/tictactoe/GameChecks.kt @@ -18,7 +18,7 @@ class GameChecks(private val player: Boolean, private val gridData: List) } result = 0 for (gridId in start..(stage * 2 + start) step stage) { - if (gridData[gridId].player == player) { + if (gridData[gridId].playerMark == player) { result++ } if (result == 3) return true @@ -32,7 +32,7 @@ class GameChecks(private val player: Boolean, private val gridData: List) for (start in 0..2) { result = 0 for (gridId in start..start + 6 step 3) { - if (gridData[gridId].player == player) { + if (gridData[gridId].playerMark == player) { result++ } if (result == 3) return true @@ -46,7 +46,7 @@ class GameChecks(private val player: Boolean, private val gridData: List) for (start in 0..6 step 3) { result = 0 for (gridId in start..start + 2) { - if (gridData[gridId].player == player) { + if (gridData[gridId].playerMark == player) { result++ } if (result == 3) return true diff --git a/app/src/main/java/es/genol/tictactoe/data/model/Ficha.kt b/app/src/main/java/es/genol/tictactoe/data/model/Ficha.kt index f69ddc7..315d9ea 100644 --- a/app/src/main/java/es/genol/tictactoe/data/model/Ficha.kt +++ b/app/src/main/java/es/genol/tictactoe/data/model/Ficha.kt @@ -1,3 +1,3 @@ package es.genol.tictactoe.data.model -data class Ficha(var player: Boolean? = null) \ No newline at end of file +data class Ficha(var playerMark: Boolean? = null) \ No newline at end of file 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 e70df38..ddef049 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 @@ -2,7 +2,6 @@ package es.genol.tictactoe.ui.elements import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.material3.Button import androidx.compose.material3.ExperimentalMaterial3Api @@ -16,21 +15,13 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel -import es.genol.tictactoe.ui.state.GameState +import es.genol.tictactoe.ui.state.GameStateVM import es.genol.tictactoe.ui.theme.TicTacToeTheme @OptIn(ExperimentalMaterial3Api::class) @Composable fun AppContent() { - val viewModel: GameState = viewModel() - - if (viewModel.isWinner) { - WinnerDialog(winner = viewModel.currentPlayer, behavior = { viewModel.cleanGrid() }) - } - - if (viewModel.moveNumber == 9) { - DrawDialog(behavior = { viewModel.cleanGrid() }) - } + val viewModel: GameStateVM = viewModel() TicTacToeTheme { Surface( @@ -42,7 +33,7 @@ fun AppContent() { TopAppBar( title = { Text(text = "TicTacToe") }, actions = { - if (viewModel.moveNumber != null) { + if (viewModel.gridMarkCount != null) { Button(onClick = { viewModel.cleanGrid() }) { Text(text = "REINICIAR") } @@ -54,15 +45,15 @@ fun AppContent() { Modifier .padding(it) .padding(vertical = 15.dp) - .fillMaxWidth(), - horizontalAlignment = Alignment.CenterHorizontally + .fillMaxSize(), + horizontalAlignment = Alignment.CenterHorizontally, ) { GameBoard( boardSize = 3, playerValue = { gridId -> - viewModel.gridState[gridId].player + viewModel.gridState[gridId].playerMark }, - buttonEnabled = !viewModel.isWinner && viewModel.moveNumber != 9 + buttonEnabled = !viewModel.isWinner && viewModel.gridMarkCount != 9 ) { gridId -> viewModel.playerMarkGrid(gridId) } @@ -70,5 +61,14 @@ fun AppContent() { } } } + + if (viewModel.isWinner) { + WinnerDialog(winner = viewModel.currentPlayer, behavior = { viewModel.cleanGrid() }) + } + + if (viewModel.gridMarkCount == 9) { + DrawDialog(behavior = { viewModel.cleanGrid() }) + } + } 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 942a8c8..623a74a 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 @@ -4,6 +4,7 @@ import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.aspectRatio +import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width @@ -48,9 +49,9 @@ fun GameBoard( ) { playerValue(grid[row][col])?.let { player -> if (player) { - CircleIcon() + CircleIcon(modifier = Modifier.fillMaxSize()) } else { - CrossIcon() + CrossIcon(modifier = Modifier.fillMaxSize()) } } } 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 index b73c74e..dc03596 100644 --- a/app/src/main/java/es/genol/tictactoe/ui/elements/GameDialogs.kt +++ b/app/src/main/java/es/genol/tictactoe/ui/elements/GameDialogs.kt @@ -24,9 +24,9 @@ fun WinnerDialog( title = { Text(text = "Ganador!!!")}, text = { if (winner) { - CircleIcon() + CircleIcon(modifier = Modifier.fillMaxSize()) } else { - CrossIcon() + CrossIcon(modifier = Modifier.fillMaxSize()) } } ) @@ -44,7 +44,7 @@ fun DrawDialog( Modifier.fillMaxSize(.95f), title = { Text(text = "Empate")}, text = { - DrawIcon() + DrawIcon(modifier = Modifier.fillMaxSize()) } ) } diff --git a/app/src/main/java/es/genol/tictactoe/ui/state/GameState.kt b/app/src/main/java/es/genol/tictactoe/ui/state/GameStateVM.kt similarity index 73% rename from app/src/main/java/es/genol/tictactoe/ui/state/GameState.kt rename to app/src/main/java/es/genol/tictactoe/ui/state/GameStateVM.kt index f02ce3c..a459bdf 100644 --- a/app/src/main/java/es/genol/tictactoe/ui/state/GameState.kt +++ b/app/src/main/java/es/genol/tictactoe/ui/state/GameStateVM.kt @@ -9,7 +9,7 @@ import es.genol.tictactoe.GameChecks import es.genol.tictactoe.data.model.Ficha import kotlin.random.Random -class GameState : ViewModel() { +class GameStateVM : ViewModel() { private var _gridState = MutableList(9) { Ficha() }.toMutableStateList() val gridState get() = _gridState.toList() @@ -19,15 +19,15 @@ class GameState : ViewModel() { private var _isWinner by mutableStateOf(false) val isWinner get() = _isWinner - private var _moveNumber by mutableStateOf(null) - val moveNumber get() = _moveNumber + private var _gridMarkCount by mutableStateOf(null) + val gridMarkCount get() = _gridMarkCount fun playerMarkGrid(gridId: Int) { - if (_gridState[gridId].player == null) { - _gridState[gridId] = _gridState[gridId].copy(player = _currentPlayer) + if (_gridState[gridId].playerMark == null) { + _gridState[gridId] = _gridState[gridId].copy(playerMark = _currentPlayer) _isWinner = GameChecks(_currentPlayer, gridData = gridState).playerWinnerCheck() - _moveNumber = (_gridState.count { it.player != null }) + _gridMarkCount = (_gridState.count { it.playerMark != null }) _currentPlayer = !_currentPlayer } } @@ -36,7 +36,7 @@ class GameState : ViewModel() { repeat(9) { _gridState[it] = Ficha() } _currentPlayer = ramdomPlayer() _isWinner = false - _moveNumber = null + _gridMarkCount = null } private fun ramdomPlayer() = (Random.nextBits(bitCount = 1) > 0) 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 index d630b16..2bc284a 100644 --- a/app/src/main/java/es/genol/tictactoe/ui/theme/Icons.kt +++ b/app/src/main/java/es/genol/tictactoe/ui/theme/Icons.kt @@ -1,6 +1,5 @@ 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 @@ -10,31 +9,31 @@ import androidx.compose.ui.res.painterResource import es.genol.tictactoe.R @Composable -fun CrossIcon() { +fun CrossIcon(modifier: Modifier = Modifier) { Icon( Icons.Default.Close, contentDescription = "Cross red icon", - modifier = Modifier.fillMaxSize(), + modifier = modifier, tint = CustomRed ) } @Composable -fun CircleIcon() { +fun CircleIcon(modifier: Modifier = Modifier) { Icon( painter = painterResource(id = R.drawable.outline_circle_24), contentDescription = "Cross red icon", - modifier = Modifier.fillMaxSize(), + modifier = modifier, tint = CustomGreen ) } @Composable -fun DrawIcon() { +fun DrawIcon(modifier: Modifier = Modifier) { Icon( painter = painterResource(id = R.drawable.baseline_handshake_24), contentDescription = "Draw blue icon", - modifier = Modifier.fillMaxSize(), + modifier = modifier, tint = CustomBlue ) } \ No newline at end of file