Я использую изображения (.png), чтобы показать «X» и «O» в игре. Но кажется, что они не появляются до окончания игры. < /P>
Логика игры: < /p>
enum class Player {
X, O
}
enum class GameState {
ONGOING, DRAW, X_WON, O_WON
}
class TicTacToe {
var board by mutableStateOf(Array(3) { CharArray(3) { ' ' } })
var currentPlayer by mutableStateOf(Player.X)
var gameState by mutableStateOf(GameState.ONGOING)
fun makeMove(
row: Int,
col: Int,
board: Array,
) {
if(board[row][col] != ' ') return
board[row][col] = currentPlayer.name.first()
currentPlayer = if(currentPlayer == Player.X) {
Player.O
} else {
Player.X
}
gameState = getGameState(board)
}
fun getGameState(
board: Array,
): GameState {
var winner = ' '
//rows and columns
for (i in 0..2) {
if (board[0] != ' ' && board[0] == board[1] && board[1] == board[2]) {
winner = board[0]
break
}
if (board[0] != ' ' && board[0] == board[1] && board[1] == board[2][i]) {
winner = board[0][i]
break
}
}
// Diagonals
if (winner == ' ' && board[0][0] != ' ' && board[0][0] == board[1][1] && board[1][1] == board[2][2]) {
winner = board[0][0]
}
if (winner == ' ' && board[0][2] != ' ' && board[0][2] == board[1][1] && board[1][1] == board[2][0]) {
winner = board[0][2]
}
return when (winner) {
'X' -> GameState.X_WON
'O' -> GameState.O_WON
else -> {
val isDraw = board.all { row -> row.all { cell -> cell != ' ' } }
if (isDraw) GameState.DRAW else GameState.ONGOING
}
}
}
fun reset(
board: Array,
) {
for (i in 0..2) {
for (j in 0..2) {
board[i][j] = ' '
}
}
gameState = GameState.ONGOING
}
}
< /code>
Экран игры: < /p>
@Composable
fun GameScreen(
modifier: Modifier = Modifier,
) {
val recomposeTrigger = remember { mutableIntStateOf(0) }
val game = remember { mutableStateOf(TicTacToe()) }
if(game.value.gameState == GameState.DRAW || game.value.gameState == GameState.O_WON || game.value.gameState == GameState.X_WON) {
GameEndModal(
gameState = game.value.gameState,
onPlayAgain = {
game.value.reset(game.value.board)
}
)
}
Box(
modifier = modifier
.size(300.dp)
.background(Color(0xFFBA00FF))
.padding(16.dp),
contentAlignment = Alignment.Center
) {
TicTacToeGrid()
Column(
modifier = Modifier.size(300.dp),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
for(row in 0..2) {
Row(
modifier = Modifier
.weight(1f)
) {
for(col in 0..2) {
val imageRes: Painter? = when(game.value.board[row][col]) {
'X' -> {
painterResource(R.drawable.x)
}
'O' -> {
painterResource(R.drawable.o)
}
else -> {
null
}
}
Box(
modifier = Modifier
.weight(1f)
.fillMaxSize()
.clickable {
game.value.makeMove(row, col, board = game.value.board)
recomposeTrigger.value++
},
contentAlignment = Alignment.Center
) {
if (imageRes != null) {
Image(
painter = imageRes,
contentDescription = null,
modifier = Modifier
.fillMaxSize()
.padding(4.dp)
)
}
}
}
}
}
}
}
}
< /code>
Изображение Среднее игре:
Щелкнуть поля не переоценивает композицию Gamescreen < /p>
Конец изображения:
В конце изображения загружаются должным образом < /p>
Я сделал нажимаемое поле для повторного. переменная и увеличивая ее на щелчке (что, я знаю, не является хорошей практикой), но все же она не сработала.
Подробнее здесь: https://stackoverflow.com/questions/797 ... tablestate
Изображения не обновляются, несмотря на измененный мутабестат ⇐ Android
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
В чем разница между «помнить» и «мутабестат» в Android JetPack Compose?
Anonymous » » в форуме Android - 0 Ответы
- 11 Просмотры
-
Последнее сообщение Anonymous
-