병아리의 코딩 일기

[UIKit] Storyboard로 간단한 앱 만들기 (3) - 가위바위보 게임 본문

카테고리 없음

[UIKit] Storyboard로 간단한 앱 만들기 (3) - 가위바위보 게임

oilater 2024. 4. 14. 12:57

이번에는 가위바위보 게임을 만들어보자

3개 정도 만들어보니 이제 Storyboard 사용법은 어느 정도 익숙해졌다!

 

 

 

 

 

배운 것들

Enum에 익숙하지 않았는데 사용법을 알게 되었다.

SwiftFile을 선택한 뒤 RpsEnum 이라는 이름으로 다음과 같이 만들어주자.

타입으로 Int를 준 이유는 원시값(raw value)을 주기 위함이다.

컴퓨터가 랜덤으로 가위, 바위, 보를 선택할 때 RspEnum(rawValue: Int.random(in: 0...2))! 이런 식으로 사용할 수 있다.

 

끝에 !를 붙이는 이유는 이게 옵셔널 타입으로 감싸져있기 때문에 풀어줘야 한다.

지금은 값이 안들어 가는 상황은 나오지 않으므로 !로 옵셔널을 벗겨줘도 괜찮다.

import Foundation

// 원시값(raw value)
enum RpsEnum: Int {
    case rock
    case scissors
    case paper
}

 

전체 코드

초보 대상 강의이기 때문에 깔끔한 코드보단 구현에 집중한 코드다.

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: RpsEnum = RpsEnum(rawValue: Int.random(in: 0...2))!
    var myChoice: RpsEnum = RpsEnum.rock
    
    // 함수 / 메서드
    override func viewDidLoad() {
        super.viewDidLoad()
        // 1) 첫번째/두번째 이미지 뷰에 준비(묵) 이미지를 띄워야 함
        comImageView.image = #imageLiteral(resourceName: "ready")
        myImageView.image = UIImage(named: "ready.png")
        // 2) 첫번째/두번째 레이블에 "준비"라고 문자열을 띄워야 함
        comChoiceLabel.text = "준비"
        myChoiceLabel.text = "준비"
        
    }

    
    
    @IBAction func rpsButtonTapped(_ sender: UIButton) {
        // 가위/바위/보를 선택해서 그 정보를 저장해야 함
        comChoice = RpsEnum(rawValue: Int.random(in: 0...2))!
        guard let title = sender.currentTitle else { return }
        print(title)
        switch title {
        case "가위":
            // 가위 열거형을 만들어서 저장
            myChoice = RpsEnum.scissors
        case "바위":
            // 바위 열거형을 만들어서 저장
            myChoice = RpsEnum.rock
        case "보":
            // 보 열거형을 만들어서 저장
            myChoice = RpsEnum.paper
        default:
            break
        }
        
    }
    
    
    @IBAction func selectButtonTapped(_ sender: UIButton) {
        // 1) 컴퓨터가 랜덤 선택한 이미지 표시
        // 2) 컴퓨터가 랜덤 선택한 것을 레이블에 표시
        switch comChoice {
        case RpsEnum.rock:
            comImageView.image = #imageLiteral(resourceName: "rock")
            comChoiceLabel.text = "바위"
        case RpsEnum.paper:
            comImageView.image = #imageLiteral(resourceName: "paper")
            comChoiceLabel.text = "보"
        case RpsEnum.scissors:
            comImageView.image = #imageLiteral(resourceName: "scissors")
            comChoiceLabel.text = "가위"
        }
        // 3) 내가 선택한 것을 이미지 뷰에 표시
        // 4) 내가 선택한 것을 레이블에 표시
        switch myChoice {
        case RpsEnum.rock:
            myImageView.image = #imageLiteral(resourceName: "rock")
            myChoiceLabel.text = "바위"
        case RpsEnum.paper:
            myImageView.image = #imageLiteral(resourceName: "paper")
            myChoiceLabel.text = "보"
        case RpsEnum.scissors:
            myImageView.image = #imageLiteral(resourceName: "scissors")
            myChoiceLabel.text = "가위"
        }
        
        // 5) 컴퓨터가 선택한 것, 내가 선택한 것을 비교 이겼는지/비겼는지/졌는지 판단/표시
        if comChoice == myChoice {
            mainLabel.text = "비겼다"
        } else if comChoice == .rock && myChoice == .paper {
            mainLabel.text = "이겼다"
        } else if comChoice == .paper && myChoice == .scissors {
            mainLabel.text = "이겼다"
        } else if comChoice == .scissors && myChoice == .rock {
            mainLabel.text = "이겼다"
        } else {
            mainLabel.text = "졌다"
        }
    }
    
    
    @IBAction func resetButtonTapped(_ sender: UIButton) {
        // 1) 컴퓨터가 다시 준비 이미지뷰에 표시
        // 2) 컴퓨터가 다시 준비 레이블에 표시
        comImageView.image = #imageLiteral(resourceName: "ready")
        comChoiceLabel.text = "준비"
        
        // 3) 내 선택 이미지뷰에도 준비 이미지 표시
        // 4) 내 선택 레이브렝도 준비 문자열 표시
        myImageView.image = #imageLiteral(resourceName: "ready")
        myChoiceLabel.text = "준비"
        
        // 5) 메인레이블 "선택하세요" 표시
        mainLabel.text = "선택하세요"
        
        // 6) 컴퓨터가 다시 랜덤 가위바위보 선택하고 저장
        comChoice = RpsEnum(rawValue: Int.random(in: 0...2))!
        
    }
}
728x90
반응형
LIST