포스트

2주차 과제 class화 (2)

조금 더 세분화를 하였다.

기존에 GameModel로 모든 변수에 대해 관리를 하였다면?

그것을 좀 더 쪼개서 세분화 하였다.

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
// GameModel
struct GameModel {
    
    var question = Array<Int>()
    var answer = Array<Int>()
  
    var gameStart : Bool = true
    var gameTitle : Bool = true

    
}

// QuestionModel
struct QuestionModel {
    
    var numbers = Array<Int>()
    var quesMaking : Bool = true
    
}

// RecordModel
struct RecordModel {
    
    var gameCount : Int = 0
    var ansCount : Int = 0
    var scoreArray = Array<Int>()
    
}

// BallCountModel
struct BallCountModel {
    
    var ballCount = Dictionary<String,Int>()
    
}

여기까지가 모델이다.

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
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
// BaseballGame


import Foundation

class BaseballGame{
    
    var gameModel = GameModel()
    let recordManager = RecordManager()
    let makingQuestion = MakingQuestion()
    let ballCountManager = BallCountManager()
    
    func start () {
        
        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.inreaseAnsCount()
                            continue
                        }
                        
                        if gameModel.answer[0] == gameModel.answer [1] || gameModel.answer[0] == gameModel.answer [2] || gameModel.answer[1] == gameModel.answer [2] {
                            print("중복된 수가 존재 합니다. 다시 입력해주세요\n")
                            recordManager.inreaseAnsCount()
                            continue
                        }
                        
                    }
                    else {
                        print("숫자가 아닌 값이 입력 되었습니다. 숫자만 입력해주세요\n")
                        recordManager.inreaseAnsCount()
                        continue
                    }
                    
                    recordManager.inreaseAnsCount()
                    ballCountManager.resetAllBallCount()
       
                    ballCountManager.getTotalCount(gameModel.question, gameModel.answer)
                                       
                    if ballCountManager.getStrikeCount() == 3 {
                        print("<<<<<축하합니다 정답입니다>>>>>.\n")
                        recordManager.increaseGameCount()
                        recordManager.saveCount()
                        gameModel.gameStart = false
                        
                    } else if ballCountManager.getStrikeCount() == 0 &&  ballCountManager.getBallCount() == 0 {
                        print("Nothing\n")
                        
                    } else {
                        print("현재 \(ballCountManager.getStrikeCount()) Strike \(ballCountManager.getBallCount()) Ball 입니다.\n")
                    }
                    
                }
                
            case 2 :
                
                if recordManager.getGameCount() != 0 {
                    
                    print("<게임 기록 보기>")
                    
                    for i in 0 ..< recordManager.getGameCount() {
                        print("\(i+1) 번째 게임, 시도 횟수 : \(recordManager.getScoreCount()[i])")
                    }
                    print("")
                    continue
                    
                } else {
                    print("게임 기록이 없습니다.\n")
                    continue
                }
                
            case 3 :
                
                print("종료합니다")
                gameModel.gameTitle = false
                
            default :
                
                print("1, 2, 3 숫자만 입력하세요\n")            }
        }
    }
   
}

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

// BallCountManager

import Foundation

class BallCountManager {

    var ballCountModel = BallCountModel()
    
    
    func getTotalCount(_ question : [Int], _ answer : [Int]) {
        
        ballCountModel.ballCount = ["Strike": 0, "Ball" : 0 ]
        
        // Just want to use High order Function
        
        answer.enumerated().forEach{
            (aoffset, aelement) in question.enumerated().forEach{
                (qoffset, qelement) in
                
                if aoffset == qoffset {
                    if aelement == qelement {
                        ballCountModel.ballCount["Strike"]! += 1
                    }
                }else {
                    if aelement == qelement {
                        ballCountModel.ballCount["Ball"]! += 1
                    }
                }
            }
        }
        
       
    }
    
    func getBallCount () -> Int {
        
        if let ballCount = ballCountModel.ballCount["Ball"] {
            return ballCount
        } else {
            return 0
        }
        
    }
    
    func getStrikeCount () -> Int {
        
        if let strikeCount = ballCountModel.ballCount["Strike"] {
            return strikeCount
        } else {
            return 0
        }
        
    }
    
    func resetAllBallCount () {
        ballCountModel.ballCount["Strike"] = 0
        ballCountModel.ballCount["Ball"] = 0
    }
    
    func getAllBallCount () -> [String:Int] {
        let ballCount = ballCountModel.ballCount
            return ballCount
        
    }
    
}

// RecordManager

import Foundation

class RecordManager {
    
    var recordModel = RecordModel()
    
    func showRecords () {
        for i in recordModel.scoreArray.indices{
            print("\(i+1) 번째 게임, 시도 횟수 : \(recordModel.scoreArray[i])")
        }
    }
    
    // increase Count
    func inreaseAnsCount (){
        recordModel.ansCount += 1
    }
    
    func increaseGameCount () {
        recordModel.gameCount += 1
    }
    
    // Reset Count
    func resetCount () {
        recordModel.ansCount = 0
    }
    
    // add ansCount into Array
    func saveCount () {
        recordModel.scoreArray.append(recordModel.ansCount)
    }
    
    func getGameCount () -> Int {
        let gameCount = recordModel.gameCount
        return gameCount
    }
    
    func getScoreCount () -> [Int] {
        let scoreCount = recordModel.scoreArray
        return scoreCount
    }
    
}

확실히 이렇게 구분해놓으니 좀 더 코드를 처음 보는사람도 이게 어떤의미로 쓰였는지 보기 좋다는 생각이 들었다.

나누면서 뭔가 swift공부할때처럼 내가 class, struct를 나눠서 쓰는게 더 와닿았다!

튜터님께 다시 피드백을 받으러 갔다.

확실히 전보다 낫다고 하셨고, 튜터님 개인적인 욕심이라면, 실제 게임내 부분에 관한 로직도 조금 더 숨길수 있을것 같다고 하셨다.

물론 그건 튜터님 개인 욕심이라 지금도 충분하다고 하시지만, 뭔가 좀 더 도전해보고 싶은 마음이 생긴다.

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