과제 목표
lv.1 부터 lv.6까지 이루어진 과제이다.
컴퓨터가 설정한 임의의 설정값 Answer를 맞추기 위해 사용자가 입력값 세 자리 수를 input에 넣었을 때
숫자의 위치와 숫자가 모두 맞으면 스트라이크, 숫자는 맞지만 위치가 틀릴 경우 볼로 표기하며
그 외에는 별도 표기가 없다.



하나의 main 함수만으로도 나머지 파일들과 컴파일이 가능하다.
처음에 여러 프로젝트를 만들어서 내야하나 생각했지만 깃헙에 올라갈 때 너무 파일마다 나무뿌리마냥 뻗어있는 것이
싫어서 이것저것 찾아보다가 방법을 생각하게 되었다.
lv.1 숫자 야구 게임


Int.random(in: 100...999)와 차이를 두어야 하는 것은 두 가지가 있었는데
1. 0을 사용하면 안된다.
2. 숫자의 중복 사용이 불가능하다
이 조건을 만족시키기 위해 백의 자리 수, 십의 자리 수, 일의 자리 수를 나누어 각 자리 수에 대한 조건을 달고
조건을 만족하지 못할 경우 while의 무한 루프를 통해 computerAnswer를 계속 다시 생성한다.
그리고 무한 루프를 어떻게 종료시킬까에 대해서 간단하게 isUnusableNumber 변수를 만들었는데
말 그대로 사용 불가능한 숫자인지에 대한 Boolean이다.
처음은 당연히 사용 불가능을 기준으로 두어야하기에 true이며 while문이 돌지만
0도 사용되지 않았으며 숫자의 중복 사용도 없을 경우 사용 가능한 숫자가 되었기에
isUnusableNumber는 false가 된다. 그리고 while을 빠져나온다.
그리고 같이 공부하는 최진문 님의 코드에서 감명받은 부분이 하나 있었는데,
Int.random을 설정할 때 애초에 0을 사용하면 안되고 숫자의 중복 사용이 불가능하다면
Int.random의 범위는 100...999가 아니라 123...987이다.
0을 사용하지 않으며 숫자가 겹치지 않는 최소 숫자와 최대 숫자이기 때문이다.
굳이 100, 101, 999 같은 숫자가 나와서 while문을 더 돌지 않아도 되기에 효율적이다.

앞서 보여준 makeAnswer 함수를 통해 comNumber를 생성한다.
userNumber는 0으로 초기화되어있으며 while문 내에서 계속 userInput을 받아 if let 바인딩으로 벗겨내고
Int형으로 변환시켜 comNumber와 비교한다.
정답일 경우 Homerun! 을 출력하며 함수를 종료한다.
lv.2 숫자 야구 게임


세 자리 숫자가 아닌 모든 경우의 수에 대한 예외처리를 해야하기에
입력값이 3자리인지, Int로 변환이 가능한지, 서로 다른 3개의 숫자가 들어있는지를 조건에 추가하고 아닐 경우 오류 메세지를 띄웠다.
볼, 스트라이크 판정에 대한 referee 함수를 추가로 설정해두었다. (아래에서 설명)
while문에 대한 탈출 조건을 원래 숫자가 같은지 직접 비교하였으나 referee 함수로 판별할 수 있게 되면서
3 스트라이크일 경우 while문 탈출 조건으로 변경하였다.
그리고 과제 노션에 0 스트라이크 0 볼일 경우에는 0 0 을 출력하는 게 아니라 Nothing으로 출력되길래 if문을 하나 달아서
Nothing을 출력할 수 있도록 해주었다.

스트라이크, 볼을 판독하는 referee 함수이다.
파라미터 두 개를 필요로 하며 strike와 ball이라는 Int형 변수 두 개를 반환한다.
여기서 심판은 컴퓨터의 숫자들과 유저의 숫자들을 가지고 ABS(Automatic Ball-strike System)의 도움을 받는다.

각 숫자를 가지고 abs로 넘어오면 각 숫자를 쪼개어 나머지 연산을 통해 digits라는 int 배열에 담긴다.
나머지 연산을 통해 배열에 들어가기 때문에 123이라는 숫자가 들어오면 3 2 1 순으로 담기게 되기에 마지막에
reversed()를 해서 넘겨주면 123이 [1, 2, 3]으로 넘어가게 된다.

위치와 숫자가 같을 경우 스트라이크를 하나 올리고
숫자는 포함되어있지만 위치가 같지 않은 경우(다른 인덱스일 경우) 볼이 증가한다.
그리고 스트라이크와 볼을 리턴하는 referee 함수 및 abs 함수이다.
lv.3 숫자 야구 게임


lv.2의 정답 숫자 조건을 약간만 수정하면 0도 가능하면서 맨 앞이 0이 오지 않도록 설정할 수 있다.
우선 0이 없을 경우에만 들어올 수 있는 if문을 제거한다.
그리고 중요한 작업이 하나 남았는데 lv.1 및 lv.2에서 불필요한 while문을 돌리지 않기 위해 123...987로 설정했었던 코드를
이제 0이 들어가는 경우의 수까지 생각해야한다.
102...987로 변경해준다.

lv.4 숫자 야구 게임

시작할 때 안내 문구를 보여주어야 한다.
이 말의 뜻은 가장 먼저 시작되어야 할 함수가 변경되었다는 것이다.
그렇다고 main에 써두었던 호출 조건을 변경하기는 싫었다.

새로운 start 함수를 작성하였다. 가장 먼저 실행되어야하기 때문이다.
기존의 start 함수는 playBall 함수로 이름을 변경하였다.
때문에 start 함수에서 기본적인 셋팅 및 사용자 입력을 먼저 받으며, 해당 입력값에 대한 switch문을 실행하게 된다.
1을 입력한 경우에는 기존의 start 함수였던 playBall 함수가 실행되며 기존 레벨처럼 게임이 실행된다.
switch문에서 Default 값은 무조건 주어야하기에 올바른 숫자를 입력하라고 써두었다.

while 탈출 조건으로 break를 넣어 종료시켰던 이전 레벨과 달리 정답을 맞추면 재시작하는 조건이 붙어야 했다.
break를 삭제하고 start()를 호출해주었다.
원래는 start 함수의 이름을 바꾸지 않고 start 함수 안에 모든 것을 구현하고 바로 다시 호출하려했으나
자기 자신 내에서 다시 호출하기에는 조건이 더 필요했다.
그래서 새로운 start 함수에 신규 조건들을 추가하고 start 함수를 다시 호출하는걸로 했다.
오늘의 한 마디
이론으로 아는 것보다 실제로 해보았을 때 막혀버리는 두려움과 괴로움이 상상 이상이다.
직접 부딪혀가면서 문제를 해결하고 이해하는 것이 내 공부 스타일에 더 맞는 느낌이다.
이론으로 완벽하게 이해하고 넘어가려던 과거의 시간들이 조금 아쉽기도 하다.
앞으로도 더 많이 막혀보고 답답해야 성장할 수 있을 것 같다.\
내일은 lv.5와 lv.6도 꼭 구현되었으면!
'iOS > TIL (Today I Learned)' 카테고리의 다른 글
[230315] 코드로 UI 짜기 'Netfilx Log-in' #1 | TIL (1) | 2024.03.15 |
---|---|
[240313] 스파르타 코딩 클럽 12일차 '숫자 야구 게임 lv.5~6 + 7' | TIL (1) | 2024.03.13 |
[230311] 스파르타 코딩 클럽 10일차 '고차함수' | TIL (1) | 2024.03.11 |
[230308] 스파르타 코딩 클럽 9일차 'Timer' | TIL (0) | 2024.03.08 |
[240307] 스파르타 코딩 클럽 8일차 'Git & Github' | TIL (2) | 2024.03.07 |
과제 목표
lv.1 부터 lv.6까지 이루어진 과제이다.
컴퓨터가 설정한 임의의 설정값 Answer를 맞추기 위해 사용자가 입력값 세 자리 수를 input에 넣었을 때
숫자의 위치와 숫자가 모두 맞으면 스트라이크, 숫자는 맞지만 위치가 틀릴 경우 볼로 표기하며
그 외에는 별도 표기가 없다.



하나의 main 함수만으로도 나머지 파일들과 컴파일이 가능하다.
처음에 여러 프로젝트를 만들어서 내야하나 생각했지만 깃헙에 올라갈 때 너무 파일마다 나무뿌리마냥 뻗어있는 것이
싫어서 이것저것 찾아보다가 방법을 생각하게 되었다.
lv.1 숫자 야구 게임


Int.random(in: 100...999)와 차이를 두어야 하는 것은 두 가지가 있었는데
1. 0을 사용하면 안된다.
2. 숫자의 중복 사용이 불가능하다
이 조건을 만족시키기 위해 백의 자리 수, 십의 자리 수, 일의 자리 수를 나누어 각 자리 수에 대한 조건을 달고
조건을 만족하지 못할 경우 while의 무한 루프를 통해 computerAnswer를 계속 다시 생성한다.
그리고 무한 루프를 어떻게 종료시킬까에 대해서 간단하게 isUnusableNumber 변수를 만들었는데
말 그대로 사용 불가능한 숫자인지에 대한 Boolean이다.
처음은 당연히 사용 불가능을 기준으로 두어야하기에 true이며 while문이 돌지만
0도 사용되지 않았으며 숫자의 중복 사용도 없을 경우 사용 가능한 숫자가 되었기에
isUnusableNumber는 false가 된다. 그리고 while을 빠져나온다.
그리고 같이 공부하는 최진문 님의 코드에서 감명받은 부분이 하나 있었는데,
Int.random을 설정할 때 애초에 0을 사용하면 안되고 숫자의 중복 사용이 불가능하다면
Int.random의 범위는 100...999가 아니라 123...987이다.
0을 사용하지 않으며 숫자가 겹치지 않는 최소 숫자와 최대 숫자이기 때문이다.
굳이 100, 101, 999 같은 숫자가 나와서 while문을 더 돌지 않아도 되기에 효율적이다.

앞서 보여준 makeAnswer 함수를 통해 comNumber를 생성한다.
userNumber는 0으로 초기화되어있으며 while문 내에서 계속 userInput을 받아 if let 바인딩으로 벗겨내고
Int형으로 변환시켜 comNumber와 비교한다.
정답일 경우 Homerun! 을 출력하며 함수를 종료한다.
lv.2 숫자 야구 게임


세 자리 숫자가 아닌 모든 경우의 수에 대한 예외처리를 해야하기에
입력값이 3자리인지, Int로 변환이 가능한지, 서로 다른 3개의 숫자가 들어있는지를 조건에 추가하고 아닐 경우 오류 메세지를 띄웠다.
볼, 스트라이크 판정에 대한 referee 함수를 추가로 설정해두었다. (아래에서 설명)
while문에 대한 탈출 조건을 원래 숫자가 같은지 직접 비교하였으나 referee 함수로 판별할 수 있게 되면서
3 스트라이크일 경우 while문 탈출 조건으로 변경하였다.
그리고 과제 노션에 0 스트라이크 0 볼일 경우에는 0 0 을 출력하는 게 아니라 Nothing으로 출력되길래 if문을 하나 달아서
Nothing을 출력할 수 있도록 해주었다.

스트라이크, 볼을 판독하는 referee 함수이다.
파라미터 두 개를 필요로 하며 strike와 ball이라는 Int형 변수 두 개를 반환한다.
여기서 심판은 컴퓨터의 숫자들과 유저의 숫자들을 가지고 ABS(Automatic Ball-strike System)의 도움을 받는다.

각 숫자를 가지고 abs로 넘어오면 각 숫자를 쪼개어 나머지 연산을 통해 digits라는 int 배열에 담긴다.
나머지 연산을 통해 배열에 들어가기 때문에 123이라는 숫자가 들어오면 3 2 1 순으로 담기게 되기에 마지막에
reversed()를 해서 넘겨주면 123이 [1, 2, 3]으로 넘어가게 된다.

위치와 숫자가 같을 경우 스트라이크를 하나 올리고
숫자는 포함되어있지만 위치가 같지 않은 경우(다른 인덱스일 경우) 볼이 증가한다.
그리고 스트라이크와 볼을 리턴하는 referee 함수 및 abs 함수이다.
lv.3 숫자 야구 게임


lv.2의 정답 숫자 조건을 약간만 수정하면 0도 가능하면서 맨 앞이 0이 오지 않도록 설정할 수 있다.
우선 0이 없을 경우에만 들어올 수 있는 if문을 제거한다.
그리고 중요한 작업이 하나 남았는데 lv.1 및 lv.2에서 불필요한 while문을 돌리지 않기 위해 123...987로 설정했었던 코드를
이제 0이 들어가는 경우의 수까지 생각해야한다.
102...987로 변경해준다.

lv.4 숫자 야구 게임

시작할 때 안내 문구를 보여주어야 한다.
이 말의 뜻은 가장 먼저 시작되어야 할 함수가 변경되었다는 것이다.
그렇다고 main에 써두었던 호출 조건을 변경하기는 싫었다.

새로운 start 함수를 작성하였다. 가장 먼저 실행되어야하기 때문이다.
기존의 start 함수는 playBall 함수로 이름을 변경하였다.
때문에 start 함수에서 기본적인 셋팅 및 사용자 입력을 먼저 받으며, 해당 입력값에 대한 switch문을 실행하게 된다.
1을 입력한 경우에는 기존의 start 함수였던 playBall 함수가 실행되며 기존 레벨처럼 게임이 실행된다.
switch문에서 Default 값은 무조건 주어야하기에 올바른 숫자를 입력하라고 써두었다.

while 탈출 조건으로 break를 넣어 종료시켰던 이전 레벨과 달리 정답을 맞추면 재시작하는 조건이 붙어야 했다.
break를 삭제하고 start()를 호출해주었다.
원래는 start 함수의 이름을 바꾸지 않고 start 함수 안에 모든 것을 구현하고 바로 다시 호출하려했으나
자기 자신 내에서 다시 호출하기에는 조건이 더 필요했다.
그래서 새로운 start 함수에 신규 조건들을 추가하고 start 함수를 다시 호출하는걸로 했다.
오늘의 한 마디
이론으로 아는 것보다 실제로 해보았을 때 막혀버리는 두려움과 괴로움이 상상 이상이다.
직접 부딪혀가면서 문제를 해결하고 이해하는 것이 내 공부 스타일에 더 맞는 느낌이다.
이론으로 완벽하게 이해하고 넘어가려던 과거의 시간들이 조금 아쉽기도 하다.
앞으로도 더 많이 막혀보고 답답해야 성장할 수 있을 것 같다.\
내일은 lv.5와 lv.6도 꼭 구현되었으면!
'iOS > TIL (Today I Learned)' 카테고리의 다른 글
[230315] 코드로 UI 짜기 'Netfilx Log-in' #1 | TIL (1) | 2024.03.15 |
---|---|
[240313] 스파르타 코딩 클럽 12일차 '숫자 야구 게임 lv.5~6 + 7' | TIL (1) | 2024.03.13 |
[230311] 스파르타 코딩 클럽 10일차 '고차함수' | TIL (1) | 2024.03.11 |
[230308] 스파르타 코딩 클럽 9일차 'Timer' | TIL (0) | 2024.03.08 |
[240307] 스파르타 코딩 클럽 8일차 'Git & Github' | TIL (2) | 2024.03.07 |