• 카테고리

    질문 & 답변
  • 세부 분야

    모바일 앱 개발

  • 해결 여부

    해결됨

(기초-3) 가위바위보 앱 만들기 / 코드 설정하기 - 2 (기초 앱 12강) 내 comChoice값의 자동 리셋

23.08.23 02:57 작성 조회수 221

0

//
//  ViewController.swift
//  RPSGame
//
//  Created by 윤동주 on 2023/08/23.
//

import UIKit

class ViewController: UIViewController {
    
    @IBOutlet weak var mainLabel: UILabel!
    
    @IBOutlet weak var comImageView: UIImageView!
    @IBOutlet weak var myImageView: UIImageView!
    
    
    @IBOutlet weak var comChoiceLabel: UILabel!
    @IBOutlet weak var myChoiceLabel: UILabel!
    
    var comChoice:Rps = Rps(rawValue: Int.random(in: 0...2))!
    var myChoice:Rps = Rps.rock
    
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        comImageView.image = #imageLiteral(resourceName: "ready")
        myImageView.image = UIImage(named: "ready.png")
        
        comChoiceLabel.text = "준비"
        myChoiceLabel.text = "준비"
    }
    
    
    @IBAction func rpsButtonTabbed(_ sender: UIButton) {
        let title = sender.currentTitle!
        switch title {
        case "가위": myChoice = Rps.scissors
        case "바위": myChoice = Rps.rock
        case "보": myChoice = Rps.paper
        default:
            break
        }
    }
    
    @IBAction func selectButtonTabbed(_ sender: UIButton) {
        switch comChoice {
        case Rps.scissors:
            comImageView.image = UIImage(named: "scissors.png")
            comChoiceLabel.text = "가위"
        case Rps.rock:
            comImageView.image = UIImage(named: "rock.png")
            comChoiceLabel.text = "바위"
        case Rps.paper:
            comImageView.image = UIImage(named: "paper.png")
            comChoiceLabel.text = "보"

        }
        
        switch myChoice {
        case .scissors:
            myImageView.image = #imageLiteral(resourceName: "scissors")
            myChoiceLabel.text = "가위"
        case .rock:
            myImageView.image = #imageLiteral(resourceName: "rock")
            myChoiceLabel.text = "바위"
        case .paper:
            myImageView.image = #imageLiteral(resourceName: "paper")
            myChoiceLabel.text = "보"
        }
        
        if comChoice == myChoice {
            mainLabel.text = "비겼다."
        } else if comChoice == .rock && myChoice == .paper {
            mainLabel.text = "이겼다."
        } else if comChoice == .scissors && myChoice == .rock {
            mainLabel.text = "이겼다."
        } else if comChoice == .paper && myChoice == .scissors {
            mainLabel.text = "이겼다."
        } else {
            mainLabel.text = "졌다."
        }
        
    }
    
    @IBAction func resetButtonTabbed(_ sender: UIButton) {
        comImageView.image = #imageLiteral(resourceName: "ready")
        comChoiceLabel.text = "준비"
        myImageView.image = #imageLiteral(resourceName: "ready")
        myChoiceLabel.text = "준비"
        
        mainLabel.text = "선택하세요."
        
//        comChoice = Rps(rawValue: Int.random(in: 0...2))!
        
    }
    
}

위와 같이 마지막에 comChoice에 대해 다시 random값 설정을 안해줘도 comChoice값이 새로 다시 랜덤값으로 변경이 됩니다. 이는 resetButtonTabbed에서 comImageView와 comChoiceLabel을 초기화하지 않았을 시에는 변경이 이뤄지지 않습니다. 이유가 무엇인지 궁금합니다.

답변 1

답변을 작성해보세요.

0

안녕하세요! Xerath님!

지금 resetButtonTapped 버튼이 눌리면 동작하는 함수.. 즉, 아래 코드 부분에서, comChoice에 대해 다시 random값 설정을 안해줘도 comChoice값이 새로 다시 랜덤값으로 변경이 된다고 말씀하셨는데...

    @IBAction func resetButtonTabbed(_ sender: UIButton) {
        comImageView.image = #imageLiteral(resourceName: "ready")
        comChoiceLabel.text = "준비"
        myImageView.image = #imageLiteral(resourceName: "ready")
        myChoiceLabel.text = "준비"
        
        mainLabel.text = "선택하세요."
        
//        comChoice = Rps(rawValue: Int.random(in: 0...2))!
        
    }


그러면, comChoice속성(변수)의 내용을 print를 해서 한번 확인해보시겠어요?

print(comChoice)

와 같은 코드를... resetButtonTapped 버튼이 눌리면 동작하는 함수.. 가장 마지막에 넣어서 실제 comChoice값이 랜덤으로 바뀌는지 확인해보시면 좋을 것 같습니다.

    @IBAction func resetButtonTabbed(_ sender: UIButton) {
        comImageView.image = #imageLiteral(resourceName: "ready")
        comChoiceLabel.text = "준비"
        myImageView.image = #imageLiteral(resourceName: "ready")
        myChoiceLabel.text = "준비"
        
        mainLabel.text = "선택하세요."
        
//        comChoice = Rps(rawValue: Int.random(in: 0...2))!
        print(comChoice)
    }


그리고 앱을 실행해보시고, 리셋버튼을 계속 누르면서... print에서 출력이 되는 내용을 확인해 보시면.. 리셋버튼을 계속 다시 눌러도 실제 데이터(컴퓨터가 선택한 가위/바위/보 값)가 변하지 않습니다.


리셋버튼이 눌리면,
아래와 같은 코드로 인해 (같은 화면에 보이는 것들을 바꿔주기 때문에..)

    @IBAction func resetButtonTabbed(_ sender: UIButton) {
        comImageView.image = #imageLiteral(resourceName: "ready")
        comChoiceLabel.text = "준비"
        myImageView.image = #imageLiteral(resourceName: "ready")
        myChoiceLabel.text = "준비"
        mainLabel.text = "선택하세요."
    }

 

화면에 보이는 컴퓨터가 선택한 이미지와, 레이블이 다시 셋업(초기화)이 되어서.. 컴퓨터의 선택도 바뀌는 것처럼 보일지는 몰라도, 실제 comChoice변수(속성)가 가지고 있는 데이터(가위인지, 바위인지, 보인지)는 변하지 않습니다.


일단 화면을 준비시킨 상태에서,
가위/바위/보 중에 어떤 것을 (1) 컴퓨터가 선택하는지(2) 사용자(나)가 선택하는 값을 후에..
즉, selectButtonTapped를 눌렀을때 비교하기 때문에..

실제 앱의 화면에서 표기하는 데이터와는 일시적인 차이가 생깁니다.
그리고 일시적인 차이가 생긴다고 하더라도,
(화면에는 준비라고 나와도, 컴퓨터는 가위를 선택한 상태 같은 것이 되어야 하겠죠. 게임적인 요소를 위해서요.)


그래서.. 여기 앱에서 구현하려는 것은,
resetButtonTapped 를 눌렀을때.. 컴퓨터의 선택도 변화를 주어야 하니까...

내부에는 아래와 같이 컴퓨터의 선택값을 초기화 해주는 작업이 필요한 거죠.

comChoice = Rps(rawValue: Int.random(in: 0...2))!

위의 코드가 없다면.. 처음 컴퓨터의 선택이 예를 들어.. 처음 앱을 시작할때 랜덤으로 "가위"가 선택되면,
resetButton을 눌러도.. 계속 "가위"로 유지될 뿐입니다..!


위의 과정을
다시 한번 잘 생각해보시고.. 다시 질문주시면 좋을 것 같아요 :)

 

감사합니다...!