wafflestudio / seminar-2020

2020 Rookies 세미나
28 stars 49 forks source link

kotlin break 문 뒤의 라인 실행 안됨 #149

Open Wits15730 opened 4 years ago

Wits15730 commented 4 years ago

저는 checkWinOrNot() 함수를 처음에는 다음과 같이 작성했습니다.

  1. val win= [[1,2,3], [4,5,6] ... ] 으로서 승리조건이 되는 3개의 위치의 인덱스를 모아놓은 것이다.
  2. for (i in 0..8) { // cells의 해당 인덱스에 있는 String들이 모두 같고 ""이 아닌지 판단한다 // 만약 그렇다면 "O" 인지 "X" 인지 구분해 gameStatus 변경, 루프 종료 (break) }
  3. 그런데 아래와 같이 break문을 쓸 때마다 이상하게 그 윗줄에 있는 gameStatus 변경이 안 됩니다. 그냥 라인을 건너뛰는 것 같아요. Log를 직어봐도 그 밑으로는 실행이 되는데, 이상하게 gameStatus는 변경이 안 됩니다.
스크린샷 2020-09-11 오후 5 50 09

다른 방법으로 ('concluded'변수 도입) 해결 하긴 했지만, 왜 break문 밑줄이 작동이 안되는지 의문이 듭니다.

스크린샷 2020-09-11 오후 5 48 00
sanggggg commented 4 years ago

코드 전체를 보여주면 도움을 드릴 수 있을 것 같습니다. 아니면 gameStatus.value 를 로그에서 직접 찍어보는 것도 실제 값이 바뀌고 있는지 체크하는데 도움이 될 것 같습니다. Log.d("CheckGameStatus", gameStatus.value) 이렇게 말이에요

그리고 코드는 스크린샷을 올릴 필요 없이 xxxkotlin val a = 3; val b = 4; val c = a + b; xxx 의 x 대신 백틱 (`) 를 사용해 주시면

val a = 3;
val b = 4;
val c = a + b;

이렇게 하이라이트된 코드를 올리실 수 있습니다

Hank-Choi commented 4 years ago

해당부분을 똑같이 구현했을 때 문제가 안생기는 걸로 봐서는 아마 다른부분 문제가 아닐까 싶습니다.

Wits15730 commented 4 years ago

감사합니다 좀 더 찾아보겠습니니다. 참고로 제 코드는 다음과 같습니다

package com.sanggggg.tictactoe

import android.util.Log
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel

@Suppress("PrivatePropertyName")
class TicTacToeViewModel : ViewModel() {

    // TODO: Make your ViewModel!
    // CONSTANTS FOR views text (DO NOT FIX)
    private val PLAYER_O = "O"
    private val PLAYER_X = "X"

    private val STATUS_PLAYING = "PLAYING..."
    private val STATUS_O_WIN = "PLAYER O WIN!"
    private val STATUS_X_WIN = "PLAYER X WIN!"
    private val STATUS_DRAW = "DRAW!"

    // recommended LiveData fields (fill free to fix it)
    val cells = ArrayList<MutableLiveData<String>>()
    val gameStatus = MutableLiveData<String>()
    val win: Array<IntArray> = arrayOf(intArrayOf(0,1,2), intArrayOf(3,4,5), intArrayOf(6,7,8)
        , intArrayOf(0,3,6), intArrayOf(1,4,7), intArrayOf(2,5,8), intArrayOf(0,4,8), intArrayOf(2,4,6))
    private var whoseTurn = true
    private var concluded : Boolean = false

    init {
        for (i in 0..8) {
            cells.add(MutableLiveData(""))
        }
        restart()
    }

    // recommended function structures (fill free to fix it)
    fun clickCell(pos: Int) {
        if (whoseTurn) {
            cells[pos].value = PLAYER_O
            whoseTurn = !whoseTurn
        }
        else{
            cells[pos].value = PLAYER_X
            whoseTurn = !whoseTurn
        }
        checkWinOrNot()
    }

    fun restart() {
        whoseTurn = true
        gameStatus.value = STATUS_PLAYING
        for (i in 0..8) {
            cells[i].value = ""
        }
        concluded = false
    }

    fun checkWinOrNot() {
        if (!concluded) {
            var draw: Boolean = true
            for (i in 0..7) {
                if (concluded){
                    break
                }
                val patter = arrayOf(
                    cells[win[i][0]].value,
                    cells[win[i][1]].value,
                    cells[win[i][2]].value
                )
                if (patter[0] == patter[1] && patter[1] == patter[2] && patter[0] != "") {
                    if (patter[0] == "O") {
                        Log.d("O_WINS", "O_____________")
                        gameStatus.value = STATUS_O_WIN
                        Log.d("O_VALUE", "O^^^^^^^")
                        break
                    } else {
                        Log.d("X_WINS", "X_____________")
                        gameStatus.value = STATUS_X_WIN
                        Log.d("X_VALUE", "X^^^^^^^")
                        break
                    }
                }
                if ("O" in patter && "X" in patter && draw) {
                    Log.d("draw_possible", "DRAW_FAIL")
                } else {
                    draw = false
                }
            }
            if (draw) {
                Log.d("DRAW_SUCEED", "DRAW_____________")
                gameStatus.value = STATUS_DRAW
                break
            }
        }
    }

}