야구랑 정말 연관은 딱히 없는 것 같지만 자바를 처음 배울 때 많이들 연습하는 야구게임입니다. 컴퓨터가 랜덤으로 3자리 숫자를 만들어놓으면 우리가 하나씩 쳐가면서 스트라이크가 세개가 나올때까지 열심히 하는 것이죠. 물론 여러번 해봤는데도 완전히 맞추기는 어렵더라구요. (호두빵아 코드를 더 정교하게 짜봐...) 아무튼 ! r_num과 u_num을 짭니다. 크기가 3개인 배열로요. 여기서도 boolean이 등장하네요. 1byte밖에 되지 않지만 나름 쓸모가 많은 녀석 같습니다. 여기서는 초기화를 따로 해줬어요. 그냥요. 컴퓨터에게 랜덤한 숫자 3자리를 만들어보라고 시킵니다. 0번째 자리, 1번째 자리, 2번째 자리 각각 만들어줬어요. 444처럼 세 자리가 모두 같으면 안 되기 때문에 이를 방지하기 위해서 각 자리수가 중복되지 않는다는 조건을 적어줬습니다. 만약 중복된다면 즉시 하던일을 멈추라고 break;를 걸어줬어요. 만약 그렇지 않다면 쭉 내려와서 아래의 for문을 문제없이 실행하게 되겠죠. 물론 컴퓨터가 무슨 숫자를 생각하고 있는지 모른 상태에서 해야 진짜라고 할 수 있겠지만 아직 기초단계이므로 숫자를 봐가면서 기능이 제대로 작동하는지를 봐야겠습니다.
기회는 딱 10번뿐이에요. 그 안에 맞추든가 아니면 그냥 실패하든가 둘 중에 하나입니다. for문을 한 번 신나게 돌려봅니다. i가 0일때, 즉 제일 먼저 시작할때 u_num[0]이 우리가 키보드로 입력하는 숫자 하나가 되게 합니다. 그리고 이것은 이해하기 쉽게끔 (0+1) , 1번째 수가 됩니다. 이렇게 for문을 세번 돌리면 세개의 수를 만들어낼 수 있겠죠. 위의 r_Num에서처럼 이번에도 중복은 있을 수 없는 일이기에 똑같이 조건문을 걸어줍니다. 위에서와 다른점은 break가 걸리고 왜 갑자기 안 되는거지? 의아해할 수 있는 사용자를 위해 너가 같은 숫자를 입력해서 비교가 진행이 안 되는거라고 친절하게 설명을 덧붙일 수 있다는 점입니다. 그러니까 중복된 숫자를 내놓지 말라고 협박(아님) 하는 것이죠.
우리가 궁극적으로 알고싶은 것은 그래서 스트라이크랑 볼 갯수가 몇갠데? 일것입니다. 위에서 아무리 숫자를 만들어내고 지지고 볶아봤자 쓸모가 없으면 안 되겠죠 그래서 마지막 부분에서는 컴퓨터의 숫자와 나의 숫자를 비교해서 스트라이크와 볼을 알아내보겠습니다. 스트라이크와 볼은 정수로 0으로 선언과 함께 초기화를 해줬습니다. 이번에는 이중포문입니다. 하나의 for문만 돌리게 되면 교차 비교가 불가능하기 때문이죠. 여기서 주목해야 할 부분은 if 조건절 안입니다.
ball의 경우 if(u_num[i] == r_num[j] && i!= j)라고 나와있습니니다. 배열안의 숫자는 동일한게 있는데 위치는 다르다는 뜻이죠. 예를 들어서 철수와 영희는 둘 다 엄지손가락에 점이 있습니다. 그런데 철수는 점이 손톱 바로 아래에 있고 영희는 지문 마디 아래에 점이 있네요. 그러면 둘 다 엄지에 점은 갖고 있으나 완벽하게 일치하지는 않는 것입니다(쉬운 예시를 위한 것이므로 무리수라고 생각이들수도 있습니다..) 스트라이크는 못 치더라도 아웃보다는 ball이 낫겠죠. 적어도 내가 낸 숫자 중 하나는 컴퓨터의 숫자 어딘가에 있다는 뜻일테니까요.
스트라이크는 위의 조건절에서 i==j가 됩니다. 위치까지 완전히 일치해야 하는 것입니다. 이렇게 적고보니 당연한 이치인 것 같기도 합니다. 만약 스트라이크가 두개를 초과, 즉 3개가 되면 숫자를 완전히 맞춘것이므로 break가 걸려 종료되게 됩니다. 게임은 클리어가 되겠죠. 하지만 안타깝게도 숫자를 다 맞추지 못하면 다시 도전..또 도전..의 길을 걷게 될 것입니다.
'Java > 자바 문제 풀이' 카테고리의 다른 글
상속을 통한 운동 선수 입출력 관리 (상속 형변환) (0) | 2021.05.18 |
---|---|
DAO, DTO를 활용해서 학생 성적 정보 입력하기(get,set) (0) | 2021.05.18 |