포스트

2주차 과제 class화 (1)

이미 과제는 끝났지만, 클래스화를 하고싶은데 생각대로 그게 되지않았다.

사실 어떻게 나눠야할지 모르겠다가 더 맞는 표현인듯 하다.

그래서 새롭게 클래스 화 하려고 한다. 각 레벨에 대한 내용은 생략하겠다.

Lv.1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// main.swift
import Foundation

let game = BaseballGame()
game.start()

// BaseballGame.swift
import Foundation

class BaseballGame{
    
    var answer = Array<Int>()
    var numbers = Array<Int>()
    
    init(answer: [Int] = Array<Int>(), numbers: [Int] = Array<Int>() ) {
        self.answer = answer
        self.numbers = numbers
    }
    
    func start () {
        let answer = makeAnswer()
        print(answer)
    }
    
    func makeAnswer() -> [Int]{
        numbers = (1...9).map{$0}
        for _ in 0...2 {
            let a = numbers.randomElement()!
            answer.append(a)
            numbers.remove(at:numbers.firstIndex(of: a)!)
        }
        
        return answer
    }
}

Lv.2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import Foundation

class BaseballGame{
    
    var question = Array<Int>()
    var numbers = Array<Int>()
    var answer = Array<Int>()
    var gameStart : Bool = true
    var ball : Int = 0
    var strike : Int = 0
        
    func start () {
        
        let question = makeAnswer()
        gameStart = true
        print("<<<<<게임을 시작합니다>>>>>")

        while gameStart {

            print("숫자를 입력해주세요.") // for notification when app starts
            print(question)
            let input = Int(readLine()!)

            if let input = input { // if type is Int
                answer = String(input).map{Int(String($0))!}
                if answer.count != 3 {
                    print("3자리의 숫자가 아닙니다. 3자리로 입력해주세요")
                    continue
                }

                if answer[0] == answer [1] || answer[0] == answer [2] || answer[1] == answer [2] {
                    print("중복된 수가 존재 합니다. 다시 입력해주세요")
                    continue
                }

            }
            else { // if type is not Int
                print("숫자가 아닌 값이 입력 되었습니다. 숫자만 입력해주세요")
                continue
            }

            strike = 0
            ball = 0

            for i in question.indices {
                for j in question.indices {
                    if i == j {
                        if answer[i] == question[j] {
                            strike += 1
                        }
                    } else {
                        if answer[i] == question[j] {
                            ball += 1
                        }
                    }
                }
            }


            if strike == 3 {
                print("<<<<<축하합니다 정답입니다>>>>>.")
                gameStart = false
            } else if strike == 0 && ball == 0 {
                print("Nothing")
            } else {
                print("현재 \(strike) Strike \(ball) Ball 입니다.")
            }

        }
        
    }
    
    func makeAnswer() -> [Int]{
        numbers = (1...9).map{$0}
        for _ in 0...2 {
            let a = numbers.randomElement()!
            answer.append(a)
            numbers.remove(at:numbers.firstIndex(of: a)!)
        }
        
        return answer
    }
}


Lv.3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100

import Foundation

class BaseballGame{
    
    var question = Array<Int>()
    var numbers = Array<Int>()
    var answer = Array<Int>()
    
    var gameStart : Bool = true
    var quesMaking : Bool = true
    
    var ball : Int = 0
    var strike : Int = 0
    
    func start () {
        
        let question = makeQuestion()
        gameStart = true
        print("<<<<<게임을 시작합니다>>>>>")
        
        while gameStart {
            
            print("숫자를 입력해주세요.") // for notification when app starts
            print(question)
            let input = Int(readLine()!)
            
            if let input = input { // if type is Int
                answer = String(input).map{Int(String($0))!}
                if answer.count != 3 {
                    print("3자리의 숫자가 아닙니다. 3자리로 입력해주세요\n")
                    continue
                }
                
                if answer[0] == answer [1] || answer[0] == answer [2] || answer[1] == answer [2] {
                    print("중복된 수가 존재 합니다. 다시 입력해주세요\n")
                    continue
                }
                
            }
            else { // if type is not Int
                print("숫자가 아닌 값이 입력 되었습니다. 숫자만 입력해주세요\n")
                continue
            }
            
            strike = 0
            ball = 0
            
            for i in question.indices {
                for j in question.indices {
                    if i == j {
                        if answer[i] == question[j] {
                            strike += 1
                        }
                    } else {
                        if answer[i] == question[j] {
                            ball += 1
                        }
                    }
                }
            }
            
            
            if strike == 3 {
                print("<<<<<축하합니다 정답입니다>>>>>.\n")
                gameStart = false
            } else if strike == 0 && ball == 0 {
                print("Nothing\n")
            } else {
                print("현재 \(strike) Strike \(ball) Ball 입니다.\n")
            }
            
        }
        
    }
    
    func makeQuestion() -> [Int]{
        
        numbers = (0...9).map{$0}
        
        while quesMaking {
            var a = 0
            a = numbers.randomElement()!
            question.append(a)
            numbers.remove(at:numbers.firstIndex(of: a)!)
            
            if question[0] == 0 {
                question = []
                continue
            }
            
            if question.count == 3 {
                quesMaking = false
            }
        }
        
        return question
    }
}

Lv.4~6

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
// BaseballGame


import Foundation

class BaseballGame{
    
    var question = Array<Int>()
    var numbers = Array<Int>()
    var answer = Array<Int>()
    var ballCount = Dictionary<String,Int>()
    
    var gameStart : Bool = true
    var quesMaking : Bool = true
    var gameTitle : Bool = true
    
    var ball : Int = 0
    var strike : Int = 0
    
    // MARK: - Function : Game Start
    func start () {
        
        var recordManager = RecordManager()
        
        while gameTitle {
            print("<<<<<게임을 시작합니다>>>>>") // for notification when app starts
            print("1. 게임 시작하기. 2. 게임 기록 보기 3. 종료하기")
            let titleInput = Int(readLine()!)
            switch titleInput {
            case 1 :
                question = makeQuestion()
                gameStart = true
                recordManager.ansCount = 0
                while gameStart {
                    
                    print("숫자를 입력해주세요.") // for notification when app starts
                    print(question)
                    let input = Int(readLine()!)
                    
                    if let input = input { // if type is Int
                        answer = String(input).map{Int(String($0))!}
                        if answer.count != 3 {
                            print("3자리의 숫자가 아닙니다. 3자리로 입력해주세요\n")
                            recordManager.ansCount += 1
                            continue
                        }
                        
                        if answer[0] == answer [1] || answer[0] == answer [2] || answer[1] == answer [2] {
                            print("중복된 수가 존재 합니다. 다시 입력해주세요\n")
                            recordManager.ansCount += 1
                            continue
                        }
                        
                    }
                    else { // if type is not Int
                        print("숫자가 아닌 값이 입력 되었습니다. 숫자만 입력해주세요\n")
                        recordManager.ansCount += 1
                        continue
                    }
                    recordManager.ansCount += 1
                    strike = 0
                    ball = 0
                    
                    ballCount = getBallCount(question, answer)
                    
                    if ballCount["Strike"] == 3 {
                        print("<<<<<축하합니다 정답입니다>>>>>.\n")
                        recordManager.gameCount += 1
                        recordManager.scoreArray.append(recordManager.ansCount)
                        gameStart = false
                    } else if strike == 0 && ball == 0 {
                        print("Nothing\n")
                    } else {
                        print("현재 \(ballCount["Strike"] ?? 0) Strike \(ballCount["Ball"] ?? 0) Ball 입니다.\n")
                    }
                    
                }
            case 2 :
                if recordManager.gameCount != 0 {
                    
                    print("<게임 기록 보기>")
                    
                    for i in 0..<recordManager.gameCount {
                        print("\(i+1) 번째 게임, 시도 횟수 : \(recordManager.scoreArray[i])")
                    }
                    print("")
                    continue
                    
                } else { // when user type 2, before starting game
                    print("게임 기록이 없습니다.\n")
                    continue
                }
            case 3 :
                print("종료합니다")
                gameTitle = false
            default :
                print("1, 2, 3 숫자만 입력하세요\n")            }
        }
    }
    
    // MARK: - Getting Ball count
    func getBallCount(_ question : [Int], _ answer : [Int]) -> [String : Int]{
        
        // init strike & ball count
        strike = 0
        ball = 0
        ballCount = ["Strike": 0, "Ball" : 0 ]
        
        answer.enumerated().map{$0}.forEach{
            (aoffset, aelement) in question.enumerated().map{$0}.forEach{
                (qoffset, qelement) in
                if aoffset == qoffset {
                    if aelement == qelement {
                        strike+=1
                    }
                }else {
                    if aelement == qelement {
                        ball+=1
                    }
                }
            }
        }
        
        ballCount["Strike"] = strike
        ballCount["Ball"] = ball
        
        return ballCount
    }
    
    // MARK: - Making Question
    func makeQuestion() -> [Int]{
        
        // initialize
        question = []
        numbers = (0...9).map{$0}
        quesMaking = true
        
        // making question
        while quesMaking {
            var a = 0
            a = numbers.randomElement()!
            question.append(a)
            numbers.remove(at:numbers.firstIndex(of: a)!)
            
            if question[0] == 0 {
                question = []
                continue
            }
            
            if question.count == 3 {
                quesMaking = false
            }
        }
        
        return question
    }
}

// RecordManager

import Foundation

struct RecordManager {
    
    var gameCount : Int = 0
    var ansCount : Int = 0
    var scoreArray = Array<Int>()
    
    func showRecords () {
        for i in scoreArray.indices{
            print("\(i+1) 번째 게임, 시도 횟수 : \(scoreArray[i])")
        }
    }
    
}



튜터님과 대화를 하던중. 변수를 Model화 해서 별도의 Struct에 넣는게 어떨까라는 생각이 들었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
// Record Manager

import Foundation

struct RecordManager {
    
    var gameCount : Int = 0
    var ansCount : Int = 0
    var scoreArray = Array<Int>()
    
    func showRecords () {
        for i in scoreArray.indices{
            print("\(i+1) 번째 게임, 시도 횟수 : \(scoreArray[i])")
        }
    }
    
    // increase Count
    mutating func inreaseCount (){
        ansCount += 1
    }
    
    // Reset Count
    mutating func resetCount () {
        ansCount = 0
    }
    
}

// MakingQuestion

import Foundation

class MakingQuestion {
    
    var gameModel = GameModel()
    
    func makeQuestion() -> [Int]{
        
        // initialize
        gameModel.question = []
        gameModel.numbers = (0...9).map{$0}
        gameModel.quesMaking = true
        
        // making question
        while gameModel.quesMaking {
            
            var a = 0
            
            a = gameModel.numbers.randomElement()!
            gameModel.question.append(a)
            gameModel.numbers.remove(at:gameModel.numbers.firstIndex(of: a)!)
            
            if gameModel.question[0] == 0 {
                gameModel.question = []
                continue
            }
            
            if gameModel.question.count == 3 {
                gameModel.quesMaking = false
            }
            
        }
        
        return gameModel.question
    }
    
}

// Handling Ball Count

import Foundation

class HandlingBallCount {
    
    var gameModel = GameModel()
    
    func getBallCount(_ question : [Int], _ answer : [Int]) -> [String : Int]{
        
        gameModel.ballCount = ["Strike": 0, "Ball" : 0 ]
        
        // Just want to use High order Function
        
        answer.enumerated().map{$0}.forEach{
            (aoffset, aelement) in question.enumerated().map{$0}.forEach{
                (qoffset, qelement) in
                if aoffset == qoffset {
                    if aelement == qelement {
                        gameModel.ballCount["Strike"]! += 1
                    }
                }else {
                    if aelement == qelement {
                        gameModel.ballCount["Ball"]! += 1
                    }
                }
            }
        }
        
        return gameModel.ballCount
    }
}

// Baseball Game


import Foundation

class BaseballGame{
    
    var gameModel = GameModel()
    
    func start () {
        
        var recordManager = RecordManager()
        let makingQuestion = MakingQuestion()
        let handlingBallCount = HandlingBallCount()
        
        while gameModel.gameTitle {
            
            print("<<<<<게임을 시작합니다>>>>>")
            print("1. 게임 시작하기. 2. 게임 기록 보기 3. 종료하기")
            
            let titleInput = Int(readLine()!)
            
            switch titleInput {
                
            case 1 :
                
                gameModel.question = makingQuestion.makeQuestion()
                gameModel.gameStart = true
                
                recordManager.resetCount()
                
                while gameModel.gameStart {
                    
                    print("숫자를 입력해주세요.")
                    print(gameModel.question)
                    
                    let input = Int(readLine()!)
                    
                    if let input = input {
                        
                        gameModel.answer = String(input).map{Int(String($0))!}
                        
                        if gameModel.answer.count != 3 {
                            print("3자리의 숫자가 아닙니다. 3자리로 입력해주세요\n")
                            recordManager.inreaseCount()
                            continue
                        }
                        
                        if gameModel.answer[0] == gameModel.answer [1] || gameModel.answer[0] == gameModel.answer [2] || gameModel.answer[1] == gameModel.answer [2] {
                            print("중복된 수가 존재 합니다. 다시 입력해주세요\n")
                            recordManager.inreaseCount()
                            continue
                        }
                        
                    }
                    else {
                        print("숫자가 아닌 값이 입력 되었습니다. 숫자만 입력해주세요\n")
                        recordManager.inreaseCount()
                        continue
                    }
                    
                    recordManager.inreaseCount()
                    
                    gameModel.ballCount["Strike"] = 0
                    gameModel.ballCount["Ball"] = 0
                    
                    gameModel.ballCount = handlingBallCount.getBallCount(gameModel.question, gameModel.answer)
                    
                    if gameModel.ballCount["Strike"] == 3 {
                        print("<<<<<축하합니다 정답입니다>>>>>.\n")
                        recordManager.gameCount += 1
                        recordManager.scoreArray.append(recordManager.ansCount)
                        gameModel.gameStart = false
                        
                    } else if gameModel.ballCount["Strike"] == 0 &&  gameModel.ballCount["Ball"] == 0 {
                        print("Nothing\n")
                        
                    } else {
                        print("현재 \(gameModel.ballCount["Strike"] ?? 0) Strike \(gameModel.ballCount["Ball"] ?? 0) Ball 입니다.\n")
                    }
                    
                }
                
            case 2 :
                
                if recordManager.gameCount != 0 {
                    
                    print("<게임 기록 보기>")
                    
                    for i in 0..<recordManager.gameCount {
                        print("\(i+1) 번째 게임, 시도 횟수 : \(recordManager.scoreArray[i])")
                    }
                    print("")
                    continue
                    
                } else {
                    print("게임 기록이 없습니다.\n")
                    continue
                }
                
            case 3 :
                
                print("종료합니다")
                gameModel.gameTitle = false
                
            default :
                
                print("1, 2, 3 숫자만 입력하세요\n")            }
        }
    }
   
}

// main

import Foundation

let game = BaseballGame()
game.start()

// Game Mode

import Foundation

struct GameModel {
    
    var question = Array<Int>()
    var numbers = Array<Int>()
    var quesMaking : Bool = true
    
    var answer = Array<Int>()
    var ballCount = Dictionary<String,Int>()

    var gameStart : Bool = true
    var gameTitle : Bool = true
    
    var gameCount : Int = 0
    var ansCount : Int = 0
    
    var scoreArray = Array<Int>()
    
}

어떻게 보면 이렇게 바꾸면서 gameModel.property 로 다 바뀐것같다.

이게 맞는지는 솔직히 잘 모르겠다.

다른 튜터님과 이야기 해본결과, 좀 더 Model에 대해 세분화를 해보는게 어떠냐는 말을 들어 더 세분화를 해보기로한다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.