Я использую изображения (.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
-
Anonymous
1753340291
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[i][0] != ' ' && board[i][0] == board[i][1] && board[i][1] == board[i][2]) {
winner = board[i][0]
break
}
if (board[0][i] != ' ' && board[0][i] == board[1][i] && board[1][i] == 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>
Я сделал нажимаемое поле для повторного. переменная и увеличивая ее на щелчке (что, я знаю, не является хорошей практикой), но все же она не сработала.
Подробнее здесь: [url]https://stackoverflow.com/questions/79712246/images-are-not-updated-despite-a-changed-mutablestate[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия