숫자 야구 게임은 두 명이 즐길 수 있는 추리 게임으로, 상대방이 설정한 3자리의 숫자를 맞히는 것이 목표입니다. 각 자리의 숫자와 위치가 모두 맞으면 '스트라이크', 숫자만 맞고 위치가 다르면 '볼'로 판정됩니다. 예를 들어, 상대방의 숫자가 123일 때 132를 추리하면 1스트라이크 2볼이 됩니다. 이러한 힌트를 활용하여 상대방의 숫자를 추리해 나가는 게임입니다.
스파르타코딩클럽에서 iOS를 수강 중 swift문법 심화 주차에 과제로 부여받은 개인프로젝트입니다.
-
게임 메뉴 : [ 게임시작 / 기록보기 / 종료하기 ] 3가지 중 하나를 선택할 수 있습니다.
-
정답 생성 : 0~9까지의 숫자를 무작위로 조합해 3자리 숫자를 생성합니다. 숫자는 중복이 안되며, 맨 앞자리 숫자는 0이 될 수 없습니다.
-
입력값과 정답 비교 : 입력값과 정답을 비교하여 스트라이크, 볼 힌트 메세지를 출력합니다. 정답이라면 게임 메뉴로 돌아갑니다.
-
게임 기록 보기 : 게임 차수별 몇 번을 시도했는지 시도 회수를 확인할 수 있습니다.
- 2024.11.04(월) ~ 2024.11.07(목)
-
랜덤값 생성 방식(1) : Array에 담은 랜덤값 3개를 100의자리수, 10의자리수, 1의자리수로 만들어 합치기 위해 제곱근 함수
pow()를 사용하려 했지만 오류메세지가 발생했다. 메세지는Cannot convert value of type 'Decimal' to expected argument type 'Int'.pow()가 반환하는decimal이라는 타입을Int타입으로 변환할 수 없다고 한다. 타입이 달라 발생하는 문제인 것 같다. 그래서pow()의 결과값을Int로 타입캐스팅 해줬지만 또 다른 에러메세지를 만났다."BinaryInteger"라는 프로토콜은 정수 타입이 따르는 프로토콜인데Decimal은 소수를 포함하기에 호환되지 않는 다는 내용이다. 따라서pow()의 인자를Double로 수정함으로써 해결했다. -
랜덤값 생성 방식(2) - 아이디어 : 처음에 생각했던 랜덤값을 만드는 아이디어는 이렇다.
(1)배열에 랜덤값 3개 입력. (2)배열을 반복문을 통해 중복제거. (3)중복이 제거되었을 경우 다시 랜덤값 추가.이러한 방식은 반복문이 너무 많이 필요하고 코드가 지저분해지게 되어 다른 방법을 찾았다. 중복 제거를 생각하다 보니set의 특성이 생각나서 set에 반복문을 통해 count가 3이 될때까지 랜덤값을 넣는 방식으로 변경했다.set은 중복을 허용하지 않아 같은 랜덤값일 경우 자동으로 삭제되기 때문에 간단하게 랜덤값을 만들 수 있었다. -
랜덤값 생성 방식(3) - String타입에서 Int타입으로 변환 :
배열에 담긴 랜덤값을String으로 변환 후Int값으로 변환해 return을 하려고 했다. 여기서 발생한 문제는 숫자 맨 앞자리가 0일 경우ex) 023Int로 타입 변환을 하면 0이 사라지고 23이 된다는 것이다. 해결방안으로 처음에 생각한 방법은 숫자를 생성할 때 부터 맨 앞자리에 0이 오지 않도록 조건문을 설정하는 것이었다. 하지만 더 간단하게 만들고자 고민한 결과, 아직 문제의 정답으로 설정된 것이 아니기 떄문에 2자리로 생성된 경우 10을 곱해023일 경우230이 되도록 수정했다.


