Java_숫자 야구 게임
intelliJ로 숫자 야구 게임 만들기
<RULE>
- 컴퓨터는 0과 9 사이의 서로 다른 숫자 3개를 무작위로 뽑습니다. (ex) 123, 759
- 사용자는 컴퓨터가 뽑은 숫자를 맞추기 위해 시도합니다.
- 컴퓨터는 사용자가 입력한 세자리 숫자에 대해서, 아래의 규칙대로 스트라이크(S)와 볼(B)를 알려줍니다.
- 숫자의 값과 위치가 모두 일치하면 S
- 숫자의 값은 일치하지만 위치가 틀렸으면 B
- 기회는 무제한이며, 몇번의 시도 후에 맞췄는지 기록됩니다.
- 숫자 3개를 모두 맞춘 경우, 게임을 종료합니다.
숫자야구게임을 만드는데
일단 제일 큰 문제는 이렇게 큰 틀을 짜는 방법을 몰라서 많이 헤맸던 것같다.
그래서 구글링을 많이해서 여차저차 만들기는 했지만.. 결국 내가 스스로 만들지는 못했기에 내가 해냈다고 할 수 없는 것같다.
그리고 아직 객체 뒤쪽 강의를 듣지 않고 미션을 진행하려고 하다보니 모르는 부분이나 헷갈리는 부분들이 많았었다.
(set을 선언할때는 Set<Integer> set = new HashSet<>(); 이지만 생성할때는 왜 HashSet인지에 대한 부분,
그리고 while문과 for문의 차이점, 향상된 for문이 익숙치 않았던 점, charAt을 사용하는 방법)
이제 Java 강의를 2주차 들었기에 혼자 틀을 짜고 모든 것을 이해한 상태로 만들 수 없을 거라고 자기 합리화를 하며 ㅜㅜ 열심히 구글링을 했고 그 대신 코드를 내 것으로 만들기 위해 팀원들과 함께 코드 해석에 온 힘을 다 쏟았다.
그렇게 완성된
[완성코드]
import java.util.HashSet;
import java.util.Set;
import java.util.Scanner;
public class Basic {
public static void main(String[] args) throws Exception {
Scanner scanner = new Scanner(System.in); //입력기(사용자가 숫자를 입력해야하니까)
System.out.println("컴퓨터가 숫자를 생성하였습니다. 답을 맞춰보세요!");
String gameNumber = ""; //문자열 변수 선언
Set<Integer> set = new HashSet<>(); //컬렉션 생성 . 자료구조 중복금지 : Set 순서 필요 : HashSet
while(true){ //자릿수 늘리기 자유로움 while vs for 차이
int number = (int)(Math.random()*10); //숫자 무작위 선택(Math.random함수는 0~1사이의 랜덤 수를 나타내므로 *10으로 단위수를 올려주고 (int)코드를 통해 정수를 만들어줌
set.add(number); // 컬렉션에 저장
if(set.size()==3){ //size가 3인 숫자만큼 무작위 선택
for(int item : set){ //향상된 for문 (변수타입 변수명 : 목록변수){연산}
String numberStr = Integer.toString(item); //숫자열을 문자열로 변경 toString(위의 gameNumber과 합치기 위해)
gameNumber+=numberStr;
}
break; // 3개의 숫자가 형성되면 빠져나와라
}
}
int chance = 1 ; // 기회는 1부터 시작
while(true){ //while문을 통해 무한 반복
int strike = 0;
int ball = 0;
System.out.print(chance+ "번째 시도 : ");
String answer = scanner.nextLine();
for(int i=0;i<3;i++){
if(gameNumber.charAt(i)==answer.charAt(i)){ //charAt : 문자열의 위치를 파악
strike+=1; //charAt함수를 통해 위치와 숫자가 맞으면 strike가 1추가 됨
}else{
if(answer.indexOf(gameNumber.charAt(i))!=-1){ //indexOf: 자리의 위치에 값이 있는지 찾는 메소드 (단점 : 중복을 허용할때는 쓸수 없음) 찾는값이 없으면 indexOf = -1이 나온다. 그러므로 -1이 아닐때 ball카운트 +1
ball+=1;
}
}
}
if(strike==3){
System.out.println(chance+ "번만에 맞히셨습니다.");
System.out.println("게임을 종료합니다.");
break;
}else{
System.out.println(ball+"B"+strike+"S");
}
chance+=1;
}
}
}
❤️🔥 for문과 while 문의 차이점!
for문은 반복 횟수를 명확히 알거나 배열을 순회할때 사용하면 좋음
while문은 무한루프나 특정 조건을 만족하는지의 여부가 중요할때 사용하면 좋음
❤️🔥 charAt
기본형 변수인 char는 단 한 글자만 저장할 수 있는 변수여서 Scanner로 입력받을때에는 String타입으로밖에 받을 수 없다.
그래서 charAt를 사용하여야한다.
String으로 저장된 문자열 중에서 한 글자만 선택해서 char타입으로 변환해줌
그러므로
for(int i=0;i<3;i++){
if(gameNumber.charAt(i)==answer.charAt(i)){ //charAt : 문자열의 위치를 파악
strike+=1; //charAt함수를 통해 위치와 숫자가 맞으면 strike가 1추가 됨
}else{
if(answer.indexOf(gameNumber.charAt(i))!=-1){ //indexOf: 자리의 위치에 값이 있는지 찾는 메소드 (단점 : 중복을 허용할때는 쓸수 없음) 찾는값이 없으면 indexOf = -1이 나온다. 그러므로 -1이 아닐때 ball카운트 +1
ball+=1;
이 부분을 보면 랜덤숫자 3개(gameNumber)의 charAt(0)이 사용자가 입력한(answer) charAt(0)의 숫자가 같으면 strike +1
i가 0부터 2까지 for문이 계속 돌게 되는 것이다.
오늘 몰랐던 것을 반복 복습해야겠다..