스위프트 베이스볼 게임 만들기 v0.1

임의의 3자리 숫자(중복 불가)를 컴퓨터가 자동으로 만들고, 사용자가 해당 숫자를 맞추는 게임입니다. 자릿수가 맞으면 Strike, 자릿수는 맞지 않지만 해당 숫자가 들어있으면 Ball입니다. v0.1버전에서는 Try 횟수 제한을 하지는 않았습니다. v0.2 버전에서는 Try 횟수 제한 및 Model 부분의 구조화를 좀 더 강화할 예정입니다.

01. 일단 손코딩

작업 노트: Baseball Game을 만들기 위해, 일단 키노트에 핵심적일 것이라고 생각되는 조건들(필요한 변수 및 연산 함수)을 1시간 정도 구성해본 다음 실제 작업에 착수했더니 훨씬 수월하게 진행할 수 있었습니다.

02. 뷰콘트롤러

//
//  ViewController.swift
//  0920_BaseballGame
//
//  Created by 김기윤 on 21/09/2017.
//  Copyright © 2017 amywork. All rights reserved.
//

import UIKit

class ViewController: UIViewController {


    //Mark - 00. Property
    private var isRunning: Bool = false
    private var displayLabelList: [UILabel]?
    private var selectedNumberList: [Int]?
    var numStrike: Int = 0
    var numBall: Int = 0
    var randomNumberList: [Int]?
    var historyStr: String = ""

    //Mark - 01. UILabel
    @IBOutlet weak var scoreLabel: UILabel!
    @IBOutlet weak var displayLabel01: UILabel!
    @IBOutlet weak var displayLabel02: UILabel!
    @IBOutlet weak var displayLabel03: UILabel!
    @IBOutlet weak var historyLabel: UITextView!
  
    // Mark - 02. ViewDidLoad
    override func viewDidLoad() {
        super.viewDidLoad()
        displayLabelList = [displayLabel01,displayLabel02,displayLabel03]
    }
    
    //게임 Brain 모델 의 instance 생성
    var brain: GameBrain = GameBrain()
    
    //Mark - 03. Start button Click : 시작
    @IBAction func btnReplay(_ sender: UIButton) {
        resetProperty()
        isRunning = true
        randomNumberList = brain.makeRandomList()
        historyStr = ""
        historyLabel.text = ""
        scoreLabel.text = ""
    }
    
    //Mark - 04. Clear Button (숫자 지우기)
    @IBAction func btnCancel(_ sender: UIButton) {
        resetProperty()
    }

    //Mark - 05. UIButton: btnNumber click
    @IBAction func btnNumClick(_ sender: UIButton) {
        if isRunning {
            let selectedNum = sender.tag
            if selectedNumberList!.count < displayLabelList!.count && !selectedNumberList!.contains(selectedNum) {
                selectedNumberList?.append(selectedNum)
                let lastIndex = selectedNumberList!.count - 1
                let inputLabel = displayLabelList![lastIndex]
                inputLabel.text = "\(selectedNum)"
            }else {
                scoreLabel.text = "중복 숫자 불가 🤡"
            }
        }
    }
    
    
    //Mark - 06. UIButton: btnCheck, btnCancel, btnReplay
    @IBAction func btnCheck(_ sender: UIButton) {
        if isRunning && selectedNumberList!.count == displayLabelList!.count {
        
            // Brain, 계산을 부탁해
            let result = brain.compareCheck(arr1: selectedNumberList!, arr2: randomNumberList!)

            
            //scoreLabel, history에 전시
            var displayLabelStr: String = ""
            for i in 0..<3 {
                displayLabelStr += "\(selectedNumberList![i])"
            }
            
            if result.s + result.b == 0 {
                scoreLabel.text = "3 Out!"
                historyStr += displayLabelStr + " : 3 Out! \n"
            }else if result.s == 3 {
                scoreLabel.text = "YES👌🏻👏🏻♥️"
                historyStr += displayLabelStr + " YES👌🏻👏🏻♥️"
            }else {
                scoreLabel.text = "S: \(result.s), B:  \(result.b)"
                historyStr += displayLabelStr + " S: \(result.s), B:  \(result.b) \n"
            }
            
        }
        historyLabel.text = historyStr
        resetProperty()
    }
    

    //초기화 Method
    func resetProperty() {
        selectedNumberList = []
        numStrike = 0
        numBall = 0
        for label in displayLabelList! {
            label.text = "-"
        }
    }

}

03. 연산 모델

////
////  CompareClass.swift
////  0920_BaseballGame
////
////  Created by 김기윤 on 21/09/2017.
////  Copyright © 2017 amywork. All rights reserved.


import Foundation
class GameBrain {

    // 두개의 배열을 받아서, strike / ball을 체크해서 tuple로 넘겨준다.
    func compareCheck(arr1: [Int], arr2: [Int]) -> (s: Int,b: Int) {
        
        var strike: Int = 0
        var ball: Int = 0
        for i in 0..<arr1.count {
            if arr1[i] == arr2[i] {
                strike += 1
            }else if arr2.contains(arr1[i]) {
                ball += 1
            }
        }
        return (s: strike,b: ball)
    }
 
    
    
    // 3자릿수의 랜덤수 생성 함수
    func makeRandomList() -> [Int] {
        var randomNumberList: [Int] = []
        while randomNumberList.count < 3 {
            let randomNum: Int = Int(arc4random_uniform(10))
            if !randomNumberList.contains(randomNum) {
                randomNumberList.append(randomNum)
            }
        }
        return randomNumberList
    }
    
    
}