학습 목표
- 시도 횟수 표기하기
- 프로그램을 종료시키는 함수 구현
- switch문 내 구현된 1,2,3 외 다른 입력값에 대한 오류 메세지 출력
- 자체 개발 Develop
lv.5 숫자 야구 게임
게임 기록 보기를 구현하기 위해서 필요한 것들을 먼저 생각해보았다.
- 몇 번의 시도인지 세어볼 tryCount라는 변수
- tryCount를 정답을 맞출 때마다 해당 숫자를 추가할 배열 recordArr (Int형 배열)
- 해당 recordArr에 tryCount를 담아줄 record 함수 구현
- 사용자가 합당한 userInput을 제공했을 때 tryCount를 1 증가시킬 tryCount += 1의 위치 찾기
이 정도로 정리해볼 수 있었다.
해당 위치에 선언하고 초기화하게 된다면, 게임이 다시 시작될때마다 tryCount가 다시 0부터 시작하기에
정답을 맞출 경우 tryCount를 초기화하지 않아도 된다.
함수 내에 선언된 이유는 정답을 맞추었음을 알리는 코드가 playBall 함수 내에 있기 때문이다.
굳이 밖에다 선언할 이유가 없다. playBall 함수 내에서만 쓰일 변수이기 때문에.
guard let 바인딩을 벗어난 바로 다음 시점에 tryCount를 1 증가시킨다.
유효하지 않은 입력에 대한 count를 제한하기 위해서이다.
클래스 내 모든 함수에서 해당 변수를 다룰 수 있도록 class 바로 아래에 전역적인 변수로 선언하였다.
이따 생성할 record 함수 내에서도 recordArr 배열에 접근이 가능하다.
또한 정답을 맞추었을 경우 playBall 함수 내에서도 tryCount를 가지고 recordArr에 접근이 가능해야하기 때문이다.
정답일 경우 recordArr 배열에 tryCount의 숫자를 배열의 인덱스로 추가한다.
여러 게임을 진행할 경우 인덱스 넘버는 0, 1, 2, 3 순으로 증가하며 배열에 쌓인다.
이후 작성한 함수를 case 2에 담아준다.
기록보기(recordPrint)가 실행된 이후에는 start 함수를 호출하여 프로그램의 메인 화면으로 이동한다.
lv.6 숫자 야구 게임
lv.6라기엔 많이 고칠 것이 없었다.
case 3를 작성한 후 종료한다는 안내 문구와 함께 exit(0)로 프로그램을 종료했다.
프로그램 종료 시 자동으로 게임의 기록이 초기화된다. 때문에 별도로 구현할 필요는 없었다.
case 1,2,3에 대한 내용은 작성되었으니 switch문에서 절대 빠져서는 안되는 default를 작성해주었다.
올바른 숫자가 아니라는 문구를 출력하고 다시 메인 화면을 재출력하는 코드로 진행했다.
lv.6 구현 조건에서 종료하기의 경우 프로그램이 종료되어야하는데 이전의 게임 기록들도 초기화가 되어야한다는건
게임 기록 초기화에 대한 코드를 작성하라는 것인지 exit(0)가 초기화도 같이 진행한다는 것을 알고 넘어가라는 것인지
잘 이해가 되지 않았다.
하지만 exit(0)는 종료와 초기화를 만족시킬 수 있지만, 만약 recordReset() 같은 것을 사용해서 초기화만 시킨다면
종료를 만족시키지 못한다고 생각하여 lv.6에서는 exit(0)를 채택하였다.
그래서 찝찝한 마음에 과제에는 없는 lv.7을 만들어보기로 했다.
lv.7 숫자 야구 게임 (자체 개선판)
구현 목표
- 기록 보기의 경우 정렬 기준을 플레이 순서대로가 아닌 최고기록 순으로 변경
- 프로그램을 종료시키지 않으면서 기록을 삭제할 수 있도록 구현
원래의 recordArr를 정렬하고 최고기록 정렬배열(sortedRecords)과 실행순서 배열(recordArr) 두 개를 비교해가며
(index + 1) 등이 (gameNumber)번째 게임인지, 해당 gameNumber에서 try한 count는 몇 번인지를 출력하도록 변경하였다.
그리고 게임 기록이 없다면 특이사항이 없지만 else 아래에 recordReset 함수를 추가하여
게임 기록이 있을 경우 recordReset 함수를 실행할 수 있도록 조정하였다.
위에서 설명했다시피 게임 기록이 있을 경우 실행되는 함수이다.
userChoice 값을 사용자에게 입력값으로 받아내는데 옵셔널의 경우를 감안해 guard let으로 벗겨낸 후 사용하였다.
입력값이 없을 경우 입력값이 없다는 경고문과 함께 다시 이 함수를 실행시킨다.
입력값으로 y가 들어왔을 경우 게임 기록을 담았던 배열을 초기화시킨다.
이외의 모든 입력이 있는 경우에는 게임 기록 초기화없이 메인 화면으로 이동한다.
다만 문제가 하나 생겼다.
분명 입력값이 없으면 "입력값이 없습니다" 라며 다시 첫 문장이 와야하는데
그냥 메인 화면으로 돌아가버린다.
guard let에서 빈 문자열에 대한 조건을 주지 않아서이다.
해당 guard let 바인딩에서 빈 문자열이 아닐 경우에만 guard let 바인딩을 통과시키도록 추가로 코드를 구성했다.
이제는 그냥 엔터만 쳐버린 빈 문자열일 경우 guard let의 else 쪽으로 빠지게 될 것이다.
오늘의 한 마디
막상 처음 받아들었을 때는 막막했지만 직접 과제를 헤쳐나가면서 스스로 구현하고싶은 기능을 구현해보는 단계까지 왔다는 것이 뿌듯하다.
여기서 안주하지 말고 더 달려나가자. 꾸준히 노력하면 안될 건 없다.
'iOS > TIL (Today I Learned)' 카테고리의 다른 글
[240318] Xcode 기초 & LLDB & ToDo List #1 | TIL (2) | 2024.03.18 |
---|---|
[230315] 코드로 UI 짜기 'Netfilx Log-in' #1 | TIL (1) | 2024.03.15 |
[230312] 스파르타 코딩 클럽 11일차 '숫자 야구 게임 lv.1~lv.4' | TIL (0) | 2024.03.12 |
[230311] 스파르타 코딩 클럽 10일차 '고차함수' | TIL (1) | 2024.03.11 |
[230308] 스파르타 코딩 클럽 9일차 'Timer' | TIL (0) | 2024.03.08 |