Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
4104934
Update README: 풀 리퀘스트 작성 규칙 추가
Jamong-mini Nov 4, 2024
ca65084
Update README : 마크다운 문법 수정
Jamong-mini Nov 4, 2024
a1f36f5
✨ Lv1 기능 구현
name-mun Nov 4, 2024
71ebc28
✨ 입력값 예외 처리 구현
name-mun Nov 5, 2024
4315d3f
✨ Lv2 기능 구현
name-mun Nov 5, 2024
3d1fbd2
🎨 불필요한 주석 삭제
name-mun Nov 5, 2024
9da9f0a
♻️ 파일을 하나로 합치고 코드 구조 개선
name-mun Nov 5, 2024
0720a26
Revert "♻️ 파일을 하나로 합치고 코드 구조 개선"
name-mun Nov 5, 2024
08e21a9
🔥 코드 통합을 위한 파일 및 코드 제거
name-mun Nov 5, 2024
c3abca4
✨ LV1 - 랜덤 숫자를 생성하는 class 기능 구현
name-mun Nov 6, 2024
d63454c
✨ LV2 - 게임을 실행하는 BaseballGame 클래스 생성
name-mun Nov 6, 2024
82286cd
✨ LV2 - 입력값 예외 처리를 하는 InputError 클래스 구현
name-mun Nov 6, 2024
3e62ae8
✨ LV2 - 결과값을 저장하는 Result enum 구현
name-mun Nov 6, 2024
ab0e5ca
✨ LV2 - 정답을 알려주는 compareInput 메서드 구현
name-mun Nov 6, 2024
3cb8337
✨ LV3 - 정답이 되는 숫자의 범위를 변경하는 기능 구현
name-mun Nov 6, 2024
61d9187
🔥 불필요한 코드 삭제
name-mun Nov 6, 2024
89d76a5
✨ LV4 - 안내 문구 구현
name-mun Nov 6, 2024
b7d758c
✨ LV4 - 안내 문구와 gameStart 메서드 연결
name-mun Nov 6, 2024
bd5fea5
✨ LV4 - 정답 맞힌 경우 selectCategory 메서드로 이동
name-mun Nov 6, 2024
d5069da
🔧 input의 예외 처리 변경
name-mun Nov 6, 2024
33a3bc0
✨ LV5 - 게임 기록 기능 구현
name-mun Nov 6, 2024
13b3ebe
🐛 랜덤 숫자가 한 번만 생성되는 문제 해결
name-mun Nov 6, 2024
02c4fc4
✨ LV6 - 게임 종료 기능 구현
name-mun Nov 6, 2024
6fb1f60
✨ LV6 - 입력값 오류 메시지 기능 구현
name-mun Nov 7, 2024
e544ac2
🐛 게임 기록이 없을 시 크래시가 나는 오류 해결
name-mun Nov 7, 2024
e2a4892
Merge pull request #1 from name-mun/mun
name-mun Nov 7, 2024
fd2f7a6
📝 README 수정
name-mun Nov 7, 2024
65c1ee3
📝 README 자세하게 수정
name-mun Nov 7, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
143 changes: 72 additions & 71 deletions README.md
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
Expand Up @@ -249,6 +249,7 @@
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_STYLE = Automatic;
MACOSX_DEPLOYMENT_TARGET = 15.0;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
};
Expand All @@ -258,6 +259,7 @@
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_STYLE = Automatic;
MACOSX_DEPLOYMENT_TARGET = 15.0;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
};
Expand Down
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>
24 changes: 24 additions & 0 deletions Week2-BaseballGame/Week2-BaseballGame/InputError.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
class InputError {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

에러 처리의 경우 Error 프로토콜을 활용해보는 것도 좋아 보입니다!


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.

21 changes: 0 additions & 21 deletions Week2-BaseballGame/Week2-BaseballGame/Lv_2(필수구현).swift

This file was deleted.

15 changes: 0 additions & 15 deletions Week2-BaseballGame/Week2-BaseballGame/Lv_3(도전구현).swift

This file was deleted.

24 changes: 0 additions & 24 deletions Week2-BaseballGame/Week2-BaseballGame/Lv_4(도전구현).swift

This file was deleted.

20 changes: 0 additions & 20 deletions Week2-BaseballGame/Week2-BaseballGame/Lv_5(도전구현).swift

This file was deleted.

26 changes: 0 additions & 26 deletions Week2-BaseballGame/Week2-BaseballGame/Lv_6(도전구현).swift

This file was deleted.

65 changes: 65 additions & 0 deletions Week2-BaseballGame/Week2-BaseballGame/RandomNumber.swift
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]()
Copy link
Contributor

Choose a reason for hiding this comment

The 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

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

처음보는 방식의 정답을 체크하는 방법이네요!! 메소드 없이 for-in문으로 구현하신게 멋져요!!
처음보고 볼이 안나오는거 아닌가? 하고 자세히 보니 제가 잘못 생각하고 있었다는걸 알 수 있었습니다ㅎㅎ

제가 indices라는 배열의 메소드를 사용해보지 않아서 개인적인 궁금증으로 만약 randomNumber 배열에 멤버가 없으면, 즉 인덱스가 없으면 에러가 발생할까?? 실험을 해봤습니다만...
결과는 그냥 for-in문이 실행되지 않고 에러 없이 무사히 넘어가더라구요!!
범위연산자를 쓰면 a...b일 때 b가 a보다 크지 않으면 에러가 발생하기도 해서 안정성을 생각하면 indices를 사용하는 편이 더 좋을 것 같다고 생각햇어요!


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
}
}
Loading