## 1. 제목: 숫자야구게임 ## 2. 소개: 임의의 수 3개를 입력하여 컴퓨터의 임의의 수 3개와 비교하는 게임 ### 게임 규칙 위치랑 숫자가 같으면 스트라이크, 위치는 다른데 숫자는 같으면 볼. 9번의 기회동안 3스트라이크를 완성하면 승리 ## 3. 팀원 3-1. 사진 (아바타 or 미모지) <img width="200" alt="image" src="https://user-images.githubusercontent.com/114971172/209290192-27c1d18e-fd9a-4d47-97cd-2151e29dcea7.png"> <img width="200" alt="image" src="https://user-images.githubusercontent.com/70146658/209290337-44326f63-60ee-49b7-8170-e3c3ec750002.png"> 3-2. 닉네임 리지 & brody ## 4. 타임라인 [STEP1] 1) 2022.12.19 임의의 정수 3개를 생성하는 함수 구현 2) 2022.12.20 유저 입력과 컴퓨터 입력을 비교하는 함수 구현 [STEP2] 1) 2022.12.21 사용자 입력 에러처리 및 게임시작함수 구현 2) 2022.12.21 3개숫자 입력 오류처리 기능 구현 3) 2022.12.22 step2 요구사항에 맞게 유저입력과 컴퓨터수를 비교하는 함수 구현 4) 2022.12.22 기능 및 임의의 3개 정수 검증 구현 ## 5. 시각화된 프로젝트 구조(순서도) <img src = "https://user-images.githubusercontent.com/70146658/208584198-60fc9c84-51c3-45af-8dc3-d8eb5fb9c1a1.png" width = "500" height = "1000"> ## 6. 실행 화면 및 기능 설명 |사용자 승리|컴퓨터 승리| |---|---| |<img width="320" alt="스크린샷 2022-12-23 오후 4 32 06" src="https://user-images.githubusercontent.com/114971172/209277493-07774860-8958-4e07-96a2-9cd5d24a5584.png">|<img width="320" alt="스크린샷 2022-12-23 오후 4 32 06" src="https://user-images.githubusercontent.com/70146658/209292504-8c9cae30-706e-45b3-8acb-691ca249756f.png">| |[사용자승리]</br>- 코드를 실행하면 게임 메뉴가 출력</br>- 원하는 기능인 1을 입력하면 안내 문구 출력 후 입력칸 출력</br>- 임의의 수 3개 입력받기</br>- 입력받은 숫자가 스트라이크인지 볼인지 판별하여 결과 출력</br>- 남은 기회가 차감되어 출력</br>- 3 스트라이크 달성 후 사용자 승리! 출력</br>- 다시 게임 시작|[컴퓨터승리]</br>- 코드를 실행하면 게임 메뉴가 출력</br>- 원하는 기능인 1을 입력하면 안내 문구 출력 후 입력칸 출력</br>- 임의의 수 3개 입력받기</br>- 입력받은 숫자가 스트라이크인지 볼인지 판별하여 결과 출력</br>- 남은 기회가 차감되어 출력</br> - 남은 기회가 0이고 사용자가 3 스트라이크를 완성하지 못하면 컴퓨터 승리...! 출력</br>- 다시 게임 시작| ## 7. 트러블 슈팅 ### 7-1. 겪었던 문제점, 고민했던 부분 → 해결책 ### 함수의 기능 분리 함수의 코드를 작성할 때 게임이 제대로 작동하는지에 대해 초점을 맞추다 보니 함수의 기능적인 측면은 고려하지 못한것 같다. 제이푸시의 의견대로 함수는 한가지 일만 하도록 수정을 하는 것이 좋고 그 이유는 함수의 기능이 지금 작성한 함수보다 단순해지면 오류를 처리하고 어느 구간에서 어떤 함수를 써야하는지 한눈에 파악하기 쉬울 것 같다! 또한 함수가 많아지면 main 파일의 길이가 길어지므로 파일 분리를 해보려고 한다! -> 작성한 함수중 복잡한 함수는 분리하여 한가지 기능만 하도록 구현, 파일을 분리하여 작성해서 해결 #### 함수의 기능 분리 작성에 도움이 되는 팁! (by.제이푸시) 숫자야구게임을 시작하는 함수를 작성하고 그 안에 필요한 함수들을 입력해보기! 우리가 STEP0 에서 만든 순서도를 참고하면 훨씬 좋을 것 같다 ### 에러처리에 대한 방법 에러처리에 대해 do catch문을 작성 -> 다른 깊이의 에러처리를 하려다보니 코드의 가독성이 좋지않아지는 문제가 생김 -> Result타입 사용의 제안 -> Result타입을 이용해서 해결 ### 코드스타일 ```swift forEach (0..<computerBallsArray.count).forEach{ index in if computerBallsArray[index] == userBallsArray[index] { strike += 1 return } ``` for문을 명시적으로 사용하지 않고 (0.. <computerBalls.count).forEach{ print($0) } 와 같은 코드처럼 코드를 작성하는 방법이 권장하는 코드인지 고민하였음. → 리뷰어를 통해 권장하지 않는 코드스타일은 아니라고 리뷰를 받았음. → for 구문은 break,continue 처럼 제어구문을 사용할 수 있는 반면 forEach는 return을 통해 for 구문의 continue 역할의 제어만 가능한 점을 고려하여 for 구문을 사용할 필요성은 없어 forEach로 코드를 한줄로 단순화 시키고자 함. ### 변수명네이밍 변수명에 computerBallArray, userBallsArray로 타입이 들어가게 작성하는 것이 API Design GuideLines에서 지양하는 것이라 생각되어 네이밍이 고민이었음 → 변수명에 타입만 적힌것이 아니라 역할도 명시되어 있기 때문에 직관적으로 사용하는 것이 적합하다고 생각되어 유지 ### 네이밍 시점 코드를 작성할 때 네이밍을 하는 것이 어려워서 완성되기 전 commit을 할 때 임시이름으로 구현해서 커밋을 올렸음. -> 시간이 걸려도 그떄그때 하는 것이 좋다는 피드백을 받았고 이 말에 대해 생각해보니 나중에 오류가 발생했을 때 네이밍을 미리미리 하지않는다면 고치기 힘들 거라는 생각이 들어 미리미리 네이밍을 하기로 결정함. -> 네이밍, 컨벤션 등 기본적인 것에 무게를 두자! ### 타입 설정 중복되지 않는 임의의 수 3개를 담는 Set 타입 선정 그런데 볼과 스트라이크를 비교하는 과정에서 Set 타입으로 두개의 Input 값을 비교하면서 Set 자체의 내장함수만으로는 값을 비교하기 어려웠음 → Array 타입으로 변환 하여 해결 ### 중복숫자 제거하기 중복된 숫자를 입력값으로 받지 않게 하기 위해 작성한 코드가 하나하나 비교해주는 방법으로 작성하였음. 그러나 이 코드의 가독성이 떨어지고 추후 3개 이상의 숫자를 비교한다면 오류처리를 하기 어렵다고 생각함. -> Set 또는 고차함수로 바꾸기! README DAY에 README를 완벽하게 완성하는 것이 아니기 때문에 포트폴리오 제출시 다시 한번 다듬어 봅시다. ## 참고 링크 - [Swift API Design GuideLines - Naming](https://www.swift.org/documentation/api-design-guidelines/) - [Swift Doc - Error Handling](https://docs.swift.org/swift-book/LanguageGuide/ErrorHandling.html) - [Apple Developer Documentation - Result](https://developer.apple.com/documentation/swift/result) - [Apple Developer Documentation - compactMap](https://developer.apple.com/documentation/swift/sequence/compactmap(_:)) <style> table:nth-of-type(1) { display:table; width:100%; } table:nth-of-type(1) th:nth-of-type(2) { width:50%; } </style>