[ 개발 기본 지식 ] 텍스트 기반의 가위 바위 보 게임 -2

sonny·2024년 9월 16일
1

개발 지식이 통통

목록 보기
7/11
post-thumbnail

그래도 나름 xcode를 배우는 입장이니 UIkit으로도 제작에 도전했다. 아예 내가 다 하는건 무리였고 구글링하며 작성해보는게 최선이었다.
확실히 직접 베이스부터 차근차근 해보니 감이 잡혀왔다.

전체코드

import UIKit

class ViewController: UIViewController {
    
    @IBOutlet weak var resultLabel: UILabel! // 결과
    @IBOutlet weak var iOSChoiceLabel: UILabel! // iOS의 선택
    
    let option = ["가위", "바위", "보"] // 게임 옵션
  

    override func viewDidLoad() {
        super.viewDidLoad()
       
    }

    @IBAction func userChoiceSelected(_ sender: UIButton) {
        
           guard let userChoice = sender.titleLabel?.text else { return }
           let computerChoice = option.randomElement()!
           
        iOSChoiceLabel.text = "iOS: \(computerChoice)"
           
        let result = determineResult(userChoice: userChoice, computerChoice: computerChoice)
                resultLabel.text = result // 승패 결과만 표시
    

}
    
    func determineResult(userChoice: String, computerChoice: String) -> String {
            if userChoice == computerChoice {
                return "비기비기 야야"
            } else if (userChoice == "가위" && computerChoice == "보") ||
                      (userChoice == "바위" && computerChoice == "가위") ||
                      (userChoice == "보" && computerChoice == "바위") {
                return "이기셨,,네요"
            } else {
                return "당신이 졌네요^^"
            }
        }
    }

차근 차근 코드 설명

@IBOutlet weak var resultLabel: UILabel!

resultLabel은 게임의 결과를 표시하기 위한 UILabel이다. IBOutlet으로 설정되어 있어 Storyboard에서 연결된 UILabel을 코드에서 참조할 수 있다.

@IBOutlet weak var computerChoiceLabel: UILabel!

computerChoiceLabel은 컴퓨터의 선택을 표시하기 위한 UILabel이다. IBOutlet으로 설정되어 있어 Storyboard에서 연결된 UILabel을 코드에서 참조할 수 있다.

let options = ["가위", "바위", "보"]

게임에서 사용할 선택지들을 배열로 정의한 것이다. "가위", "바위", "보"의 세 가지 옵션을 포함한다.

override func viewDidLoad()

viewDidLoad는 뷰 컨트롤러의 뷰가 메모리에 로드된 후 호출되는 메서드이다. 초기 설정이나 데이터 로딩을 이곳에서 할 수 있다. 이 코드에서는 기본적인 초기화만 수행한다.

@IBAction func userChoiceSelected(_ sender: UIButton)

이 메서드는 버튼이 눌렸을 때 호출된다. @IBAction으로 선언되어 있어 Storyboard에서 버튼의 액션을 이 메서드와 연결할 수 있다.

sender: 누른 버튼을 나타내는 UIButton 객체

guard let userChoice = sender.titleLabel?.text else { return }

sender.titleLabel?.text를 통해 눌린 버튼의 제목을 가져와 userChoice 상수에 저장한다. 버튼의 제목이 nil인 경우, 메서드 실행을 중지한다 (return).

let computerChoice = options.randomElement()!

options 배열에서 무작위로 하나의 요소를 선택하여 computerChoice 상수에 저장한다. randomElement() 메서드는 배열에서 무작위로 요소를 반환하며, !는 강제 언래핑으로 배열이 비어있지 않다는 가정을 한다.

iOSChoiceLabel.text = "iOS: \(computerChoice)"

iOSChoiceLabel의 텍스트를 "iOS: "와 함께 computerChoice 값을 설정하여 화면에 컴퓨터의 선택을 표시한다.

let result = determineResult(userChoice: userChoice, computerChoice: computerChoice)

determineResult 메서드를 호출하여 사용자의 선택(userChoice)과 컴퓨터의 선택(computerChoice)을 비교하고 결과를 계산한다. 결과는 result 상수에 저장된다.

resultLabel.text = result

resultLabel의 텍스트를 result 상수로 설정하여 화면에 승패 결과만 표시한다. 여기에는 사용자의 선택이 포함되지 않고, 결과만 나타난다.

func determineResult(userChoice: String, computerChoice: String) -> String

사용자의 선택과 컴퓨터의 선택을 비교하여 게임 결과를 결정하는 메서드이다. 결과에 따라 비기고 지고 이겼다는 문자열을 반환한다.

if userChoice == computerChoice {
                return "비기비기 야야" }

if userChoice == computerChoice: 사용자의 선택이 컴퓨터의 선택과 같을 때를 의미한다.
예를 들어, 사용자가 "가위"를 선택하고, 컴퓨터도 "가위"를 선택했다면 이 조건이 참이 된다.
return "비기비기 야야": 두 선택이 같다면, "비기비기 야야"라는 문자열을 반환한다. 즉, 비긴 경우를 나타내는 메시지.

else if (userChoice == "가위" && computerChoice == "보") ||
         (userChoice == "바위" && computerChoice == "가위") ||
         (userChoice == "보" && computerChoice == "바위") {
    return "이기셨,,네요"
}

else if: 첫 번째 조건이 거짓인 경우 (비기지 않은 경우) 이 조건을 검사한다. 이 부분에서는 사용자가 이길 수 있는 모든 경우를 나열하고 있다.

userChoice == "가위" && computerChoice == "보": 사용자가 "가위"를 선택하고, 컴퓨터가 "보"를 선택했을 때. 가위는 보를 이긴다.

userChoice == "바위" && computerChoice == "가위": 사용자가 "바위"를 선택하고, 컴퓨터가 "가위"를 선택했을 때. 바위는 가위를 이긴다.

userChoice == "보" && computerChoice == "바위": 사용자가 "보"를 선택하고, 컴퓨터가 "바위"를 선택했을 때. 보는 바위를 이긴다.

return "이기셨,,네요": 사용자가 이기는 경우에는 "이기셨,,네요"라는 메시지를 반환.

else {
    return "당신이 졌네요^^"
}

위의 두 조건(비김, 사용자가 이김)에 모두 해당하지 않으면 이 부분이 실행된다. 즉, 사용자가 지는 경우를 나타내는 것.
return "당신이 졌네요^^": 이 경우에는 "당신이 졌네요^^"라는 메시지를 반환.


완성본

만들면서 아쉬웠던 부분은 각 버튼마다 오토레이아웃을 설정해주어 휴대폰의 해상도가 달라지더라도 비율을 맞춰주고 싶었는데 se로 내려가니 아예 맞지도 않게 나와서 오토레이아웃에 대한 이해도가 더 필요하다는 것을 느꼈다. 그리고 가위바위보를 하면서 위에 이미지또한 승패에 맞게 변경되는 작업도 추가로 하고 싶었다. 그 부분도 하게 되면 이 포스트에 수정날짜를 넣어서 추가해보도록 하려한다. 전체적으로 심심한 배경색도 그라데이션 느낌으로 주는 것도 해 볼 예정. 그리고 처음보는 논리연산자도 있었는데 && 라던지 | |가 생소했다. 논리연산자는 따로 글을 정리 해보려한다.

&& (AND), || (OR), ! (NOT)

< 24.09.18 >
오토레이아웃 설정까지 해서 아이폰 11사이즈로도 위치 벗어나지 않는 것 확인. 오토레이아웃을 많이 걸어봐야 이해가 되는 것 같다. 처음에 멋 모르고 엄청나게 많은 오토레이아웃을 걸어놔버려서 걸어도 걸지 않은 것 처럼 뒤죽박죽이었는데 차근차근 하나씩 눌러보고 검색해보고 알아냈다...!!
그리고 Xcode를 업그레이드 했더니 이제 아이폰 15사이즈가 나오지 않고 16사이즈가 나오더라 괜히 아쉬웠다.


마지막으로 뿌듯하게 채워가는 잔디를 보며 흐뭇한 미소를 짓고 마무리 해본다.

profile
iOS 좋아. swift 좋아.

0개의 댓글