[7] Java/Kotlin - java 2차 개인과제 (1차)

2024. 9. 23. 15:15Java,Kotlin

728x90

 

※ 숫자야구 게임 만들기

ㄴ 레벨 1,2,3,4로 구성

 

※ 캠프에서 제공해준 힌트와 예시코드, 그리고 구글에 수많은 예시 코드들이 있었는데,

모두 참고하지 않고 구성했습니다. 코드가 많이 길어져서 블로그 1차정리 끝나면 코드를 개선할 생각입니다.

 

[ Lv.1 기본 숫자야구 게임 ]

요구사항)

1. 정답숫자 생성하기

2. 정답을 맞추기 위한 숫자입력하기

3. 정답,입력값 비교하여 스트라이크, 볼, 아웃 출력

4. 정답이 같을 경우 게임 종료 (3스트라이크)

5. 정답을 맞출때까지 계속 실행이 가능해야함.

 

※ [입력숫자와 정답숫자에 대한 조건]

ㄴ 서로 다른 3자리수이다.

ㄴ 숫자는 중복불가이다.

ㄴ 1~9까지의 숫자로만 구성되어 있다.

 

 

[코드설명]

1) 정답숫자 랜덤3자리 생성 메서드

2) 중간에 int num으로 자릿수 지정하는 값이 있는데 만들어놓고 나중에 레벨4요구사항에서 필요한 부분이었다.

3) 레벨3까지 만들고나서 마지막에 매개변수 받는형태로 변경해서 자릿수 지정되도록 설정하면 될듯하다.

 

 

 

[코드설명]

1) 배열의 각각의 숫자를 체크해서 스트라이크, 볼,아웃을 구하기 위해 배열을 만들었다.

ㄴ ArrayList로 정답과 입력값에 대하여 3자리를 각각 1자리씩 비교할 수 있도록 했다.

2) 정답 배열에 대해서 입력값의 각 자리수를 대입하여 정답배열의 index를 구해왔다. 

ㄴ 해당 자리수를 구해와서 스트라이크, 볼, 아웃을 판단할 수 있다.

 

 

[코드설명]

1) 스트라이크 로직으로 먼저 strike와 ball을 초기화 했다.

ㄴ스트라이크, 볼 조건에따라 증감시켜서 카운트를 구해올 용도이다.

2) 위에서 정답&입력값배열을 get으로 각각 자리수의 숫자를 가져오고 그 숫자끼리 비교해서 일치할경우 스트라이크이다.

ㄴ 스트라이크가 되었을때 strike변수를 증감시킨다.

3) 3스트라이크가 되었을때 정답처리

ㄴ 정답처리를 하고 반복문을 탈출시킨다.

 

[코드설명]

1) 아웃 로직은 strike가 0이고 볼이 없을 경우 아웃이다.

ㄴ strike == 0과 뒤에 변수 3개는 indexOf로 배열의 인덱스를 반환하는역할인데 아예 포함되어 있지 않을때는 -1를 반환한다. 그렇기 때문에 다 -1 값을 가지게 된다면 아웃이다.

2) 볼 로직은 1차로 2스트라이크까지만 반환되게 해두었다.(3스트라이크는 어차피 정답이라 반환할 필요가없기 때문이다)

ㄴ 각 볼의 로직은 위에서 설명한 아웃(-1)과 각 인덱스가 0,1,2로 딱 떨어지는 경우를 제외하고 ball이 증감하도록 했다.

ㄴ 0,1,2로 인덱스가 순서대로 맞아 떨어진다는것은 결국 스트라이크 이기 때문이다.

3) 마지막은 스트라이크와 볼이 0일 경우엔 나올 필요가 없기때문에 조건을 추가했다.

ㄴ System.out.print()를 사용하여 줄바꿈하지않고 조건에 맞을때 스트라이크와 볼이 붙어서 출력되도록 설정했다.

4) 젤 밑에 cnt는 입력 횟수를 증감시키는 역할이다.

ㄴ 임의로 넣어둔 기능인데 추후 레벨3에서 활용되는 기능으로 가공해서 사용할 예정이다.

 

[ Lv.1 실행영상 ]

 

 

[ Lv.2 기본 숫자야구 게임 ]

 

요구사항)

1. 입력값 3자릿수 검사

2. 입력값 중복체크

3. 입력값 숫자만 입력가능학게 검사

4. 처음시작할때 1,2,3으로 게임에 대한 설정을 고를 수 있게

ㄴ 레벨3,4와 이어지는 파트

ㄴ 이런형태로 Scanner로 구현

 

※ 다 입력값에 대한 유효성검사를 하는 부분이다. 그리고 정답 랜덤값 생성은 배열로 만들때 무작위, 중복없음, 3자리수 자리지정가능 조건을 다지켰기 때문에 입력값에서만 유효성체크를 진행하면된다.

 

 

[코드설명]

1) 요구사항 4번 Scanner로 게임 설정을 고를 수 있도록 설정했다. setting이란 변수로 처리했다.

2) 아래에 1입력시 게임시작 부분에 보면 줄바꿈을 위해 시도횟수 한번넘었을때부터 줄바꿈을 해준다.

ㄴ 볼스트라이크랑 숫자를입력하세요가 붙어서 나와서 줄바꿈을했다.

 

 

[코드설명]

1) 숫자만 입력가능하도록 예외처리를 진행했다.

InputMismatchException은 정수로 입력해야하는데 문자열을 입력한 경우에 발생한다.

ㄴ NumberFormatException은 숫자가 아닌 문자열을 숫자로 변환할때 발생한다.(혹시모를상황대비) 

 

2)while문 밖에서 num2로 ArrayList배열을 만들어뒀고, 입력받은 3자리숫자를 각각 배열 3개로 만든다.

ㄴ 추가로 checkNum변수를 증감시켜서 숫자 갯수를 구해온다.

ㄴ 갯수를 기준으로 자릿수 예외처리를 진행했다.

 

 

[코드설명]

1) 입력값 3자리 수를 각각 비교해서 중복된 값을 체크한다.

조건문으로 하나라도 중복되버리면 중복된 값은 입력못하도록 체크했다.

 

 

[ Lv.2 실행영상 ]

ㄴ 영상 소리 끄고 들으시길 바랍니다. 마지막에 소리가 들어갔습니다.

 

 

[ 중간 회고 ]

ㄴ 레벨2까지 구현하면서 레벨3과 4에 일부분 활용할 수 있는 기능들이 있어서 3,4도 빠르게 진행할 수 있을거 같다.

스트라이크, 볼, 아웃 로직을 생각하면서 좀 머리가 아팠는데 현재 코드가 엄청길고 별로지만 구현한 것은 뿌듯했다.

레벨3,4에 들어가기전에 생각한 코드 줄이는 방법이 있어서 활용해볼 생각이다. 


9월12일에 전달받고, 사실 과제진행시간은 몇시간 되지 않았다.
현재 9월13일(금)인데 내가 생각했던것보다 빠르게 진행되고 있어서 다행이다. 기능별로 메서드도 구분해야하고 패키지 구조도 설계해야해서 아직 많이 남았지만 얼른 마무리해서 남은시간은 자습하고 강의를 다시 듣는 시간을 마련해야겠다.

아 그리고 레벨 1,2까지 트러블슈팅도 미리 작성해둬야겠다.

728x90