Изображения не обновляются, несмотря на измененный мутабестатAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Изображения не обновляются, несмотря на измененный мутабестат

Сообщение Anonymous »

Я использую изображения (.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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»