# ⚾️ NumberBaseball ## πŸ“– λͺ©μ°¨ 1. [μ†Œκ°œ](#🌱-μ†Œκ°œ) 2. [νƒ€μž„λΌμΈ](#⏰-νƒ€μž„λΌμΈ) 3. [μ‹œκ°ν™”λœ ν”„λ‘œμ νŠΈ ꡬ쑰](#πŸ‘€-μ‹œκ°ν™”λœ-ν”„λ‘œμ νŠΈ-ꡬ쑰) 4. [μ‹€ν–‰ ν™”λ©΄](#πŸ’»-μ‹€ν–‰-ν™”λ©΄) 5. [νŠΈλŸ¬λΈ” μŠˆνŒ…](#❓-νŠΈλŸ¬λΈ”-μŠˆνŒ…-❗️) 6. [ν”„λ‘œμ νŠΈ μˆ˜ν–‰ 쀑 핡심 κ²½ν—˜](#βœ…-ν”„λ‘œμ νŠΈ-μˆ˜ν–‰-쀑-핡심-κ²½ν—˜) 7. [μ°Έκ³  링크](#πŸ”—-μ°Έκ³ -링크) ## 🌱 μ†Œκ°œ `Gundy`와 `mene` νŒ€μ΄ λ§Œλ“  3개의 숫자둜 ν•˜λŠ” 숫자 야ꡬ κ²Œμž„μž…λ‹ˆλ‹€. ## ⏰ νƒ€μž„λΌμΈ ### Step 1 <center><img width="500" src="https://i.imgur.com/8AAQX3g.png"></center> <center><img width="500" src="https://i.imgur.com/elgGZzm.png"></center> <center><img width="500" src="https://i.imgur.com/ztw2KGa.png"></center> ### Step 2 <center><img width="500" src="https://i.imgur.com/ZkAWQfy.png"></center> <center><img width="500" src="https://i.imgur.com/OViDjYc.png"></center> ## πŸ‘€ μ‹œκ°ν™”λœ ν”„λ‘œμ νŠΈ ꡬ쑰 <center><img width="500" alt="μŠ€ν¬λ¦°μƒ· 2022-08-16 μ˜€ν›„ 4 35 22" src="https://user-images.githubusercontent.com/84453688/184835561-b17d400a-cddf-4b65-bcaf-2084e28b7c6a.png"></center> <br> | 승리 쑰건 | 슀트라이크 / λ³Ό νŒμ • | |:--:|:--:| |<img src="https://i.imgur.com/GOT8pGE.png" width="450">|<img src="https://i.imgur.com/mZfpg4X.png" width="450">| 이미지 좜처: https://play.google.com/store/apps/details?id=com.snownaul.baseballgame&hl=en&gl=US ## πŸ’» μ‹€ν–‰ ν™”λ©΄ | μ‚¬μš©μž 승리 | 컴퓨터 승리 | 잘λͺ»λœ μž…λ ₯ | |:--:|:--:|:--:| |<img src="https://i.imgur.com/Lc1z4VO.gif" width="300">|<img src="https://i.imgur.com/p6eklQT.gif" width="300">|<img src="https://i.imgur.com/XHoPvFt.gif" width="300">| ## ❓ νŠΈλŸ¬λΈ” μŠˆνŒ… ❗️ - #### ν•¨μˆ˜μ˜ μ—­ν•  뢄리 ν•˜λ‚˜μ˜ ν•¨μˆ˜κ°€ λ„ˆλ¬΄ λ§Žμ€ κΈ°λŠ₯을 κ°€μ§€κ²Œ λ˜λŠ” 경우, λ³„λ„μ˜ ν•¨μˆ˜λ‘œ λΆ„λ¦¬ν•˜λŠ” 과정을 κ±°μ³€μŠ΅λ‹ˆλ‹€. `compareNumber` ν•¨μˆ˜μ—μ„œ `checkResult`λ₯Ό, `inputNumbers` ν•¨μˆ˜μ—μ„œ `checkDuplication` ν•¨μˆ˜μ™€ `checkNumberRange` ν•¨μˆ˜λ₯Ό λΆ„λ¦¬ν•œ 것이 λŒ€ν‘œμ μž…λ‹ˆλ‹€. ν•¨μˆ˜λ₯Ό λΆ„λ¦¬ν•˜λŠ” κ³Όμ •μ—μ„œ μ§€μ—­ λ³€μˆ˜λŠ” μ‚¬μš©ν•˜μ§€ λͺ»ν•˜κ²Œ 되기 λ•Œλ¬Έμ— λ°˜ν™˜λΆ€λ₯Ό μΆ”κ°€ν•˜λŠ” λ“±μ˜ λ°©λ²•μœΌλ‘œ μƒˆλ‘œ μƒκΈ°λŠ” λ¬Έμ œλ“€μ„ ν•΄κ²°ν•˜μ˜€μŠ΅λ‹ˆλ‹€. - #### ν•¨μˆ˜ 호좜 μœ„μΉ˜ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•¨μ— μžˆμ–΄ μ μ ˆν•œ μœ„μΉ˜λ₯Ό κ³ λ―Όν•˜μ˜€μŠ΅λ‹ˆλ‹€. ν•¨μˆ˜μ˜ 역할을 λΆ„λ¦¬ν•˜κ³ λ‚œ λ‹€μŒμ—λ„ `compare` ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ `checkResult` ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜μ˜€μŠ΅λ‹ˆλ‹€. `compare` ν•¨μˆ˜λŠ” λ°˜ν™˜μ΄ μ—†λŠ” ν•¨μˆ˜μ˜€κΈ° λ•Œλ¬Έμ— μ§€μ—­ λ³€μˆ˜μΈ strike와 ball을 μ‚¬μš©ν•˜κΈ° μœ„ν•¨μ΄μ—ˆλŠ”λ°, 주된 ν•¨μˆ˜λ‘œ λ³΄μ΄λŠ” `startGame` ν•¨μˆ˜μ—μ„œ `compare` ν•¨μˆ˜μ™€ `checkResult` ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•¨μ΄ λ”μš± μ μ ˆν•΄ μˆ˜μ •ν•˜μ˜€μŠ΅λ‹ˆλ‹€. 이 κ³Όμ •μ—μ„œ μƒκΈ°λŠ” μ§€μ—­ λ³€μˆ˜ μ‚¬μš© λΆˆκ°€ λ¬Έμ œλŠ” `compare` ν•¨μˆ˜λ₯Ό (Int, Int) νƒ€μž…μ˜ νŠœν”Œ 값을 λ°˜ν™˜ν•˜κ²Œ ν•˜μ—¬ ν•΄κ²°ν•˜μ˜€μŠ΅λ‹ˆλ‹€. - #### 숫자λ₯Ό 담을 `Collection Type` **Set**와 **Array** 의 선택 Setλ₯Ό μ‚¬μš©ν•΄ 1-9κΉŒμ§€μ˜ λžœλ€ν•œ 숫자λ₯Ό 3κ°œκ°€ λ λ•ŒκΉŒμ§€ μΆ”κ°€ν•˜κ³  Array둜 λ³€ν™˜ν•˜μ—¬ μ‚¬μš©ν•˜λŠ” 방법과, 1-9κΉŒμ§€μ˜ μˆ«μžκ°€ λ“€μ–΄μžˆλŠ” Arrayλ₯Ό `shuffled` λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ„žμ–΄μ€€ ν›„ 3개의 숫자λ₯Ό λ½‘μ•„μ„œ μ‚¬μš©ν•˜λŠ” 방법을 μƒκ°ν•˜μ—¬ λ³΄μ•˜μŠ΅λ‹ˆλ‹€. Array μ‚¬μš© μ‹œ, Set에 insertν•˜κΈ° μœ„ν•΄ 루프λ₯Ό λŒλ¦¬μ§€ μ•Šμ•„λ„ 되고 Setλ₯Ό Array둜 λ³€ν™˜ν•˜λŠ” 과정을 κ±°μΉ˜μ§€ μ•Šμ•„λ„ λ˜μ–΄ μ΅œμ’…μ μœΌλ‘œλŠ” Arrayλ₯Ό μ‚¬μš©ν•˜λŠ” κ²ƒμœΌλ‘œ κ²°μ •ν•˜μ˜€μŠ΅λ‹ˆλ‹€. - #### 반볡문 νƒˆμΆœ 쑰건 μ΄ˆκΈ°μ—λŠ” 반볡문 νƒˆμΆœ 쑰건으둜 λ³€μˆ˜ `remainCount`κ°€ 0이 될 경우 λ°˜λ³΅λ¬Έμ„ μ’…λ£Œν•˜κ²Œ ν•˜μ—¬ `strike`κ°€ 3개인 κ²½μš°μ—λ„ `remainCount = 0` μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κ²Œ ν•˜μ˜€μŠ΅λ‹ˆλ‹€. μ΄λŠ” μ μ ˆν•˜μ§€ μ•Šμ•„ 보여 `remainCount`κ°€ 0μ΄κ±°λ‚˜ `strike`κ°€ 3개인 경우 `break`둜 νƒˆμΆœ 쑰건을 μˆ˜μ •ν•˜μ˜€μŠ΅λ‹ˆλ‹€. 이λ₯Ό μœ„ν•΄ `compare` ν•¨μˆ˜λ₯Ό (Int, Int) νƒ€μž…μ˜ νŠœν”Œ 값을 λ°˜ν™˜ν•˜κ²Œ ν•˜μ—¬ `gameScore` μ§€μ—­ μƒμˆ˜μ— ν• λ‹Ήν•˜μ˜€μŠ΅λ‹ˆλ‹€. - #### 남은 기회 μ΄ˆκΈ°ν™” 항상 κ²Œμž„μ„ ν•œ 번만 μ§„ν–‰ν•˜μ—¬ λͺ°λžλ˜ 문제점인 κ²Œμž„μ΄ λλ‚˜κ³ , μƒˆλ‘œμš΄ κ²Œμž„μ„ μ΄μ–΄κ°ˆ λ•Œ 남은 κΈ°νšŒκ°€ μ΄ˆκΈ°ν™” λ˜μ§€ μ•ŠλŠ” 이슈λ₯Ό λ°œκ²¬ν•˜μ˜€μŠ΅λ‹ˆλ‹€. μ΄ˆκΈ°ν™”ν•  수 μžˆλ„λ‘ `startGame` ν•¨μˆ˜ 내뢀에 μ΄ˆκΈ°ν™” μ½”λ“œλ₯Ό μΆ”κ°€ν•˜μ—¬ ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€. - #### 남은 기회 좜λ ₯ μ‚¬μš©μž μŠΉλ¦¬μ‹œμ—λ„ 남은 κΈ°νšŒκ°€ 좜λ ₯λ˜λŠ” λ¬Έμ œκ°€ μžˆμ–΄, ν•΄λ‹Ή 뢀뢄을 `checkResult` ν•¨μˆ˜ 내뢀에 쑰건문을 μΆ”κ°€ν•˜μ—¬ 승리 μ‹œμ—λŠ” 좜λ ₯λ˜μ§€ μ•Šλ„λ‘ λ³€κ²½ν•˜μ˜€μŠ΅λ‹ˆλ‹€. ## πŸ”— μ°Έκ³  링크 - [Swift API Design Guidelines - Naming](https://swift.org/documentation/api-design-guidelines/) - [Swift Language Guide - Optionals, nil, Optional Binding](https://docs.swift.org/swift-book/LanguageGuide/TheBasics.html) - [Swift Language Guide - Collection Types](https://docs.swift.org/swift-book/LanguageGuide/CollectionTypes.html) - [λˆ„κ΅¬λ‚˜ μ‰½κ²Œ μž…λ¬Έν•  수 μžˆλŠ” Git μž…λ¬Έ](https://backlog.com/git-tutorial/kr/intro/intro1_1.html) - [Git Book](https://git-scm.com/book/ko/v2) --- [πŸ” 맨 μœ„λ‘œ μ΄λ™ν•˜κΈ°](#⚾️-NumberBaseball) ###### tags: `README`