[Swift] 숫자 야구 게임 만들기ing... whit. class

sonny·2024년 11월 5일
3

TIL

목록 보기
32/48
post-thumbnail

오늘 Lv.2 와 이어 어제 하지 못한 Input으로 입력받는 것 까지 구현을 해보려고 한다.

우선 만들어볼 클래스를 정리했다.

꼬질 글로 정리.. 진짜 급하게 써서 그렇다 원래 글씨 이쁘ㄷr

코드로 옮긴 후)

  • 정답 클래스 만들기
  • Input 클래스 만들기
  • 힌트 클래스 만들기 ( 스트라이크와 볼 구분)
  • baseballGame 클래스 만들기 ( 전체적인 관리, 각 클래스의 메서드 호출)

우선 이정도로 나누고, InputHandler 부터 해보자..

IntputHandler class 만들기

class 명을 뭐로 적어야할 지 감이 안와서 지피티의 도움을 받았다.

그리고 getInput 이라는 메서드를 구현해야하는데,

[Int] 로만 하면 정수가 아닌 값이 들어갈 경우 오류가 생길 수 있어 옵셔널로 처리했다.

그리고 쉼표로 입력 구분해서 하려고 했는데,

생각해보니 zip을 이용해서 묶을거라서 쉼표는 빼야겠다...

일단 여기서 중요한 것,

  • 입력값은 정수로 받기
  • 숫자는 세자리여야 하기
  • 0이 맨 앞에 올 수 없는 것 구현 (Lv.3)

[ 1차 트러블 ] return input이 되지 않는다.

그리고 readLine() 을 통해 텍스트를 입력 받고 input에 저장해준다.

여기서 if let = raedLine() 은 이제 입력이 3개가 아니거나,

숫자가 아닌 경우는 else 로 넘어가게 처리 했다.

근데 왜 이렇게 피가 잔뜩 날까...

[ 1차 해결 ]

해결해가다가 [Int]? 가 아니라 String? 으로 해야하는 부분을 알게 되었다.

readLine() 은 입력 자체를 String 으로 받기 때문에,

Int 로 명시하지 않아도 된다는 걸 알게 됐던 것이다.

그렇게 return input 을 하면 [Int]? 였을 땐 오류가 났지만,

String? 으로 바꾸니 오류가 나지 않을 수 있었다!!

그리고 위에서 바뀐 부분이 또 있는데,

return input 다음에 있는 else 에서 return 값을 먼저 적고 그 아래에 print 구문을 적었었다.

현재 바뀐 코드에는 printreturn nil 보다 앞에 와있는데,

if 문은 return이 나오면 바로 끝나기 때문에 그 전에 프린트를 적어줘야 한다는 것이었다.


[ 2차 트러블 ] LeadLine()에 공란으로 입력했을 때, "숫자를 입력해주세요." 가 나오지 않는다.

당연히 빈 공란이면 if let 라인을 타고 내려와서 맨 아래의 else가 프린트 될 줄 알았다.

하지만 아무 입력을 하지 않았음에도 불구하고 숫자를 입력해주세요 라는 프린트는 나오지 않았다.

[ 2차 해결 ]

여기서 사용된 건 isEmpty 라는건데,

이걸 어떻게 알 게 됐냐면,, 그냥 다른 친한 수강생분에게 현재 상황을 채팅으로 푸념하 듯 말했더니,

너무나도 당연하다는 듯이
.
.
.
" isEmpty로 비어있는거 확인하면 되는거 아니야? "

isEmpty 분명 낯은 익은데 기억나지 않아 급히 검색해봤다.

번역 하자면, ' 문자열에 문자가 없는지 여부를 나타내는 부울 값입니다. '라고 한다.

참과 거짓을 나눠주는 bool값이라서 단 한번의 체크로 값에 닿을 수 있다.. 완전 좋다

그렇게 바로 if 문을 이용하여 inputisEmpty 로 접근하여

프린트 구문을 입력해주고, 아닐경우 return nil 을 해주었다.

입력: 이 비워져있으니 숫자를 입력해주세요 라고 잘 뜬다.!


아뿔싸,,중복 번호 방지와 앞자리가 0일 경우가 없다.

일단 입력하는 곳의 중복 번호 방지는 과제엔 없었지만,

만약 답이 403 일 경우 사용자가 500 을 치게 되었을 때

원스트라이크 원볼이 나오게 된다.

그래서 입력 할 때 중복번호를 작성할 경우 다시 작성하라는 프린트 값도 나와야하고...

앞자리가 0인 경우도 "앞자리가 0이 될 수 없다" 고 알려줘야 했다.
.
.
.
그렇게 부랴부랴 폭풍 검색을 통해 구현했다.
.
.

총 Input 쪽만 구현한 코드..

( 스트라이크랑 볼도 구분하는거 만들어야하는데 조점례 )

중복 방지는 캡슐화로

일단 눈에 띄는 부분이 있다면,

맨 위쪽을 보면 class 밑에 private 을 이용해서 중복입력을 확인 하는 곳에 접근을 했다.

캡슐화를 배울 때 알게 되었는데,

private 로 설정된 변수나 메서드는 그 선언이 포함 된 클래스 내에서만 접근이 가능하다고 한다.

이로서 외부 코드에서 overlapInputs에는 직접 접근하지 못할 것이다.

만약 외부에서 Set 에 잘못된 데이터를 추가하는 걸 방지할 수 있게 된다.

contains ?

번역 )

주어진 요소가 집합에 존재하는지 여부를 나타내는 부울 값을 반환합니다.

쉽게 말하면 특정 컬렉션,, 배열이나 집합 내에 값이 존재하는지 확인하는 메서드다.

contains 메서드는 주어진 elementcollection 에 존재하면 true를 반환하고, 존재하지 않으면 false 를 반환한다.

그렇다는 건 사용자가 입력한 inputoverlapInputs라는 Set

이미 포함되어 있는지를 확인 하는 것인데,

어제 공부해서 알다시피 Set 은 중복값을 없애기 때문에 값이 이미 존재하는지 쉽게 확인이 가능하다.

마지막.....입력값.... 확인

다른 입력값은 다 확인했고, 숫자가 아닌 문자를 입력할 경우 숫자만 입력하라는 것도 뜬다.

마지막 print 구문은 if let input = readLine()은 입력이 없을 경우 nil을 반환하는데,

옆에 EOP 라고 써 놓은게 있다.

사용자가 더이상 입력하지 않거나 파일의 끝에 도달했음을 의미한다고 한다.

그래서 저 print 구문이 나오는 경우는 파일의 끝에 도달했을 경우라는 뜻이다.

실행하면서 왜 저 마지막 프린트문은 나오지않는건가 궁금했어서 알아본 것.

덕분에 EOP 라는 것도 알게되었다.

중복값의 프린트가 되지 않는다.

..... 중복값 입력하면 프린트 구문 나오게 처리 다 한 것 같은데 나오지 않는다..

다시 좀 알아봐야겠다..


음...

오늘 스트라이크와 볼 구현까지 하려고 했는데 우선 여기까지 하고 다른 할 일이 있어서 멈추었다.

전체적으로 InputHandler 클래스는 사용자 입력을 안전하고 효율적으로 처리하는데 초점을 맞춰봤다.

다양한 조건을 검증하여 올바른 입력만을 수집할 수 있도록 설계했는데,

중복 입력 방지와 유효성 검사를 통해 게임의 공정성을 유지할 수 있는 기반을 만드려고 했지만 중복 입력은 좀 더 알아봐야겠다.

이런 게임만들면서 여러 메서드를 이용해보는 그런 좋은 경험이 되길 바라는 마음이다.. 그래도 오늘 여러 메서드도 사용해봐서 재미있게 작업했던 것 같다.

꼭 힌트클래스를 구현하고, 도전가이드까지 열심히 도전하련다..

profile
iOS 좋아. swift 좋아.

8개의 댓글

comment-user-thumbnail
2024년 11월 5일

if 문 보기 싫어서 guard 문으로 바꾸는 중.. .
스트라이크랑 볼로 표시해주는 기능 구현 중. . .

답글 달기
comment-user-thumbnail
2024년 11월 5일

저 글씨가 꼬질이면 내 글씨는 도대체 무엇일까...

1개의 답글
comment-user-thumbnail
2024년 11월 6일

론겸씨 실력이 팍팍 늘고있군요

1개의 답글
comment-user-thumbnail
2024년 11월 6일

콘솔 창에 느낌표 7개 붙은 데서 뜨거운 열정이 느껴지고, 스탈뜨 오타가 귀엽다.

1개의 답글
comment-user-thumbnail
2024년 11월 7일

아 코드에서 피 난다는 게 그런 뜻이었군요 ㅋㅋㅋ

답글 달기