Advertisement
Artyom_Kopan

ViewModel.kt

May 30th, 2022
188
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 2.38 KB | None | 0 0
  1. import androidx.compose.runtime.getValue
  2. import androidx.compose.runtime.mutableStateOf
  3. import androidx.compose.runtime.setValue
  4.  
  5. class ViewModel {
  6.     var state: State by mutableStateOf(initialState())
  7.         private set
  8.  
  9.     data class State(
  10.         val buttons: List<Button>,
  11.         var currentSymbol: Symbol, // показывает, чей сейчас ход
  12.         var screen: Screen,
  13.         var winStatus: WinStatus,
  14.         var userSide: Symbol?, // в режиме бота показывает, за какую сторону играет игрок
  15.         val unusedButtons: MutableList<Int>, // в режиме бота содержит № ещё не использованных кнопок
  16.         var gameMode: GameMode
  17.     )
  18.  
  19.     private fun initialState(): State = State(
  20.         buttons = fetchButtons(),
  21.         currentSymbol = Symbol.CROSS,
  22.         screen = Screen.START_GAME,
  23.         winStatus = WinStatus.CONTINUES,
  24.         userSide = null,
  25.         unusedButtons = (0 until BUTTONS_COUNT).toMutableList(),
  26.         gameMode = GameMode.SINGLE
  27.     )
  28.  
  29.     private inline fun updateState(update: State.() -> State) {
  30.         state = state.update()
  31.     }
  32.  
  33.     fun onButtonSelect(buttonId: Int) = updateState { // ход на игровом поле
  34.         if (!buttons[buttonId].isActivate) {
  35.             buttons[buttonId].symbol = currentSymbol
  36.             buttons[buttonId].isActivate = true
  37.             currentSymbol = if (currentSymbol == Symbol.CROSS) Symbol.NOUGHT else Symbol.CROSS
  38.             unusedButtons.remove(buttonId)
  39.             isWin()
  40.         }
  41.         // isWin()
  42.         copy(currentSymbol = currentSymbol)
  43.     }
  44.  
  45.     fun onStartGame() = updateState {
  46.         copy(screen = Screen.MODE_CHOICE)
  47.     }
  48.  
  49.     fun onChoiceSingleMode() = updateState {
  50.         gameMode = GameMode.SINGLE
  51.         copy(screen = Screen.GAME_FIELD)
  52.     }
  53.  
  54.     fun onChoiceBotMode() = updateState {
  55.         gameMode = GameMode.BOT
  56.         copy(screen = Screen.SIDE_CHOICE)
  57.     }
  58.  
  59.     fun onChoiceCrosses() = updateState {
  60.         screen = Screen.GAME_FIELD
  61.         copy(userSide = Symbol.CROSS)
  62.     }
  63.  
  64.     fun onChoiceNoughts() = updateState {
  65.         screen = Screen.GAME_FIELD
  66.         copy(userSide = Symbol.NOUGHT)
  67.     }
  68.  
  69.     private fun isWin() = updateState {
  70.         winStatus = getWinStatus(buttons)
  71.         copy(winStatus = winStatus)
  72.     }
  73. }
  74.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement