-
Notifications
You must be signed in to change notification settings - Fork 6
야구 게임 단계별 기능 구현 완료 #14
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: mun
Are you sure you want to change the base?
Changes from all commits
4104934
ca65084
a1f36f5
71ebc28
4315d3f
3d1fbd2
9da9f0a
0720a26
08e21a9
c3abca4
d63454c
82286cd
3e62ae8
ab0e5ca
3cb8337
61d9187
89d76a5
b7d758c
bd5fea5
d5069da
33a3bc0
13b3ebe
02c4fc4
6fb1f60
e544ac2
e2a4892
fd2f7a6
65c1ee3
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,71 +1,72 @@ | ||
# 숫자 야구 게임 과제 (Week 2) | ||
숫자 야구 게임은 1에서 9까지의 서로 다른 3개의 숫자를 맞추는 게임입니다. <br> | ||
각 레벨마다 기능이 확장되며, 팀원들이 협업하여 매주 주어진 과제를 해결해 나갑니다. | ||
|
||
# 📝 협업 규칙 | ||
### 레포지토리 설정 및 브랜치 관리 | ||
**1** **Fork로 가져오기**: 각 팀원은 레포지토리를 Fork하여 자신의 개인 레포지토리로 가져옵니다.<br> | ||
**2** **브랜치 생성**: Fork한 개인 레포지토리에서 각자의 이름을 딴 브랜치를 생성합니다.<br> | ||
**3** **Pull Request**: 과제를 마친 후, 각자의 브랜치로 Pull Request를 생성하여 코드 리뷰를 요청합니다. 모든 팀원이 Pull Request에 코멘트를 달고 피드백을 제공합니다. <br> | ||
**4** **수정 및 Merge**: 피드백을 반영하여 수정하고, 팀원들의 동의를 얻은 후 merge를 진행합니다. <br> | ||
|
||
이 과정을 통해 서로의 코드에 대해 이해를 높이고, “왜 이렇게 작성했는지”에 대한 질문과 답변을 주고받으며 과제를 진행합니다. | ||
# 📂 코드 파일 구조 | ||
* main.swift: 게임의 메인 진입점으로, 레벨을 선택하고 시작할 수 있도록 구성되어 있습니다. startGame() 함수가 게임의 시작을 담당합니다. | ||
* Lv_1.swift ~ Lv_6.swift: 각 레벨별 요구사항에 맞게 구현된 파일입니다. 각 파일에는 해당 레벨의 기능을 구현하는 함수가 포함되어 있습니다. | ||
|
||
⠀📜 구현 가이드 | ||
|
||
### main.swift | ||
Command Line Tool 프로젝트에서는 하나의 `main.swift` 파일에서만 프로그램을 시작할 수 있습니다. 따라서 각 레벨별 기능을 별도의 파일로 구현한 후, `main.swift` 파일에서 해당 레벨의 함수를 호출하여 실행하도록 구성합니다. | ||
|
||
```swift | ||
import Foundation | ||
|
||
func startGame() { | ||
print("레벨을 선택하세요 (1, 2, 3, 4, 5, 6):") | ||
|
||
if let input = readLine(), let level = Int(input) { | ||
switch level { | ||
case 1: | ||
levelOne() | ||
case 2: | ||
levelTwo() | ||
case 3: | ||
levelThree() | ||
case 4: | ||
levelFour() | ||
case 5: | ||
levelFive() | ||
case 6: | ||
levelSix() | ||
default: | ||
print("유효하지 않은 레벨입니다. 1~6까지를 선택해주세요.") | ||
} | ||
} else { | ||
print("잘못된 입력입니다.") | ||
} | ||
} | ||
|
||
// 게임 시작 | ||
startGame() | ||
``` | ||
* startGame() 함수에서 게임의 레벨을 선택하여 시작할 수 있도록 구성합니다. | ||
* 사용자가 입력한 레벨 번호에 따라 해당 레벨의 함수를 호출하여 게임을 진행합니다. | ||
|
||
|
||
### 각 레벨 파일 (Lv_1.swift ~ Lv_6.swift) - 구현 파일 | ||
|
||
**Lv_1.swift** | ||
|
||
```swift | ||
import Foundation | ||
|
||
func levelOne() { | ||
// 1. 정답을 생성하는 로직을 추가합니다. | ||
// 2. 유저가 정답을 맞출 때까지 반복해서 입력을 받습니다. | ||
// 3. 입력값이 유효한지 검사하고 힌트를 제공하는 기능을 구현합니다. | ||
} | ||
``` | ||
|
||
각 레벨별로 구현하시면 됩니다. | ||
# Swift로 야구게임 만들기 | ||
|
||
## 📄 개요 | ||
랜덤으로 생성된 3자리 숫자를 맞추는 게임으로, 사용자가 입력한 숫자와 정답을 비교해 결과를 알려주고 기록을 저장합니다. | ||
|
||
## 🛠️ 주요 기능 | ||
- **랜덤 숫자 생성**: 게임 시작 시 서로 다른 3자리 숫자를 생성합니다. | ||
- **입력값 비교**: 사용자가 입력한 숫자와 정답을 비교하여 결과를 반환합니다. | ||
- **게임 기록 저장**: 사용자의 게임 기록을 저장하고 확인할 수 있는 기능입니다. | ||
- **게임 종료**: 사용자가 종료를 원하면 게임이 종료됩니다. | ||
|
||
## ⚠️ 참고사항 | ||
- **랜덤 숫자 생성 제약**: 서로 다른 임의의 숫자 3자리를 생성하며, 첫 자리는 0이 될 수 없습니다. | ||
- **사용자 입력값 예외 처리**: 3자리의 숫자가 아닌 경우 예외 처리가 이루어집니다. | ||
|
||
## ✏️ 상세 설명 | ||
### `BaseballGame` | ||
게임을 시작하고, 기록을 보고 종료하는 기능이 있는 클래스입니다. | ||
<br> | ||
**selectCategory()** | ||
<br> | ||
사용자는 게임을 시작하고, 기록을 보고 게임을 종료할 수 있습니다. 올바르지 않은 값을 입력했을 경우 예외 처리했습니다. | ||
<br> | ||
**gameStart()** | ||
<br> | ||
랜덤 숫자를 생성하여 사용자의 값과 비교한 뒤 결과를 출력합니다. | ||
<br> | ||
**printGameHistory()** | ||
<br> | ||
게임 순서와 게임 시도 횟수를 확인합니다. | ||
<br> | ||
**gameOver()** | ||
<br> | ||
게임을 종료합니다. | ||
|
||
### `RandomNumber` | ||
랜덤 숫자를 생성하고 랜덤 숫자와 사용자의 입력값을 비교하는 클래스입니다. | ||
<br> | ||
**makeRandomNumber** | ||
<br> | ||
서로 다른 3개의 수를 생성합니다. | ||
<br> | ||
**compareInput()** | ||
<br> | ||
랜덤 숫자와 입력값을 비교하여 스트라이크, 볼을 사용하여 결과를 반환합니다. | ||
|
||
### `Result` | ||
게임 결과를 저장하는 열거형으로, `success`, `strikeBall`, `strike`, `ball`, `out`이 있습니다. | ||
<br> | ||
**printResult()** | ||
<br> | ||
게임 결과를 출력하는 메서드입니다. | ||
|
||
### `InputError` | ||
사용자의 입력값에 오류가 있는지 확인하는 클래스입니다. | ||
<br> | ||
**checkInputErrorMain()** | ||
<br> | ||
메인 화면에서 입력값 오류가 있는지 확인합니다. | ||
<br> | ||
**checkInputErrorGame()** | ||
<br> | ||
게임 화면에서 입력값 오류가 있는지 확인합니다. | ||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
<?xml version="1.0" encoding="UTF-8"?> | ||
<Bucket | ||
uuid = "40968E4B-0A6D-4E5F-89DD-D8EE7AF97A4A" | ||
type = "1" | ||
version = "2.0"> | ||
</Bucket> |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
<?xml version="1.0" encoding="UTF-8"?> | ||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||
<plist version="1.0"> | ||
<dict> | ||
<key>SchemeUserState</key> | ||
<dict> | ||
<key>Week2-BaseballGame.xcscheme_^#shared#^_</key> | ||
<dict> | ||
<key>orderHint</key> | ||
<integer>0</integer> | ||
</dict> | ||
</dict> | ||
</dict> | ||
</plist> |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
class InputError { | ||
|
||
func checkInputErrorMain(_ input: String?) -> Bool { | ||
guard input!.count == 1, let inputInt = Int(input!) else { | ||
return true | ||
} | ||
|
||
return false | ||
} | ||
|
||
// 입력값이 올바른지 확인하는 메서드 | ||
func checkInputErrorGame(_ input: String?) -> Bool { | ||
// 입력값의 길이가 3이 아니거나, 다른 타입이 있는 경우 | ||
guard input!.count == 3, let inputInt = Int(input!), Set(input!).count == 3 else { | ||
return true | ||
} | ||
// 첫 번째 자리에 0이 있는 경우 | ||
if Array(input!)[0] == "0" { | ||
return true | ||
} | ||
|
||
return false | ||
} | ||
} |
This file was deleted.
This file was deleted.
This file was deleted.
This file was deleted.
This file was deleted.
This file was deleted.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,65 @@ | ||
class RandomNumber { | ||
var randomNumber = [Int]() | ||
|
||
init() { | ||
randomNumber = makeRandomNumber() | ||
} | ||
|
||
// 서로 다른 임의수 3개를 만드는 함수 | ||
func makeRandomNumber() -> [Int] { | ||
// 랜덤 숫자를 저장할 Set 생성 | ||
var randomNumber = [Int]() | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 요 프로퍼티는 쓰이지 않는 것 같아서,, 없어도 될 것 같아요! |
||
|
||
// 서로 다른 숫자가 3개를 생성할 때까지 반복 | ||
while (randomNumber.count < 3) { | ||
let thisRandomNumber = Int.random(in: 0...9) | ||
|
||
// 배열의 첫 요소이고 랜덤 숫자가 0인지 확인 | ||
if thisRandomNumber == 0 && randomNumber.count == 0 { | ||
continue | ||
} | ||
|
||
// 중복값이 없으면 배열에 랜덤 숫자 추가 | ||
if !randomNumber.contains(thisRandomNumber) { | ||
randomNumber.append(thisRandomNumber) | ||
} | ||
} | ||
|
||
// 베열로 변환 후 반환 | ||
return randomNumber | ||
} | ||
|
||
// 랜덤 숫자와 입력값을 비교하는 함수 | ||
func compareInput(_ input: [Int]) -> Result { | ||
// 결과를 저장한 변수 생성 | ||
var strike = 0 | ||
var ball = 0 | ||
|
||
for i in randomNumber.indices { | ||
for j in input.indices { | ||
// 자리&숫자 같으면 스트라이크 | ||
if i == j && randomNumber[i] == input[j] { strike += 1 } | ||
// 숫자만 같으면 볼 | ||
else if randomNumber[i] == input[j] { ball += 1 } | ||
} | ||
} | ||
Comment on lines
+38
to
+45
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 처음보는 방식의 정답을 체크하는 방법이네요!! 메소드 없이 제가 |
||
|
||
let result: Result | ||
|
||
if strike > 0 && ball > 0 { | ||
result = .strikeBall | ||
} else if strike == 3 { | ||
result = .success | ||
} else if strike > 0 { | ||
result = .strike | ||
} else if ball > 0 { | ||
result = .ball | ||
} else { | ||
result = .out | ||
} | ||
|
||
result.printResult(strike: strike, ball: ball) | ||
|
||
return result | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
에러 처리의 경우 Error 프로토콜을 활용해보는 것도 좋아 보입니다!