09월 23일 작성... 요약:
0. 모든 사건의 발단... 숫자 게임이라고 하여 int 타입만을 써야한다는 아니다.
1. 정답 숫자 생성은 ramdom.nextInt()
2. 문자형이 갖는 아스키코드 값을 원하는 숫자로 바꿀 때는 - '0'
요구 사항
- 1. 정답 숫자 생성하기
동일한 숫자가 반복되지 않는 서로 다른 세 자리 수
- 2. 정답을 맞추기 위한 숫자 입력받기
동일한 숫자가 반복되지 않는 세 자리 수를 입력받는다.
숫자로만 입력 받고 다른 방식으로 입력 받지 않는다.
- 3. 결과값 출력하기 (정답과 입력값을 비교하기 위한 게임 로직 필요)
위에서 생성한 정답 숫자와 입력 받은 숫자를 비교.
- 4. 정답을 맞출 때까지 숫자 입력을 반복
진행 순서는 1 -> 2 -> 3 -> 4
2번에서 Scanner 사용.
3번에서 자리수를 확인하고 숫자를 확인해야한다.
4번은 2번과 3번을 반복하는 것.
Class를 번호에 맞춰 총 4개 생성하자. 1번 : MakeNumber , 2번 : InputNumber , 3번 : MatchNumbers 4번 : 메인
Main은 1번 수행 후 while 문으로 2번과 3번 반복 수행.
문제
1. 어떤 타입으로 정답 숫자를 가지고 있을 것인가 ?? 어떤 타입으로 받든지... 세자리를 한 번에 받아서 자리수에 따른 숫자 비교 가능?
2. 한 번에 입력 받은 세자리 수를 각각 어떻게 읽어내서 위와 비교할 것인가 ??
문제 해결 아이디어
1. 생성자에서 매개 변수로 (int a, int b int c)를 넣어 a, b, c를 각각 백의 자리, 십의 자리, 일의 자리로 하여 자리수 문제를 해결하자.
2. 정답 수를 만들 때, Map을 사용해서 Key를 자리수로, Value를 자리수에 해당하는 숫자로 설정.
3. 정답 수를 만들 때, 중복이 없는 HashSet Class 로 숫자 3개 뽑고, ArrayList로 형변환.
4. 입력 받은 숫자는 charAt() 사용해서 하나씩 때어놓기.
나는 3번으로 결정
..
..
1부터 9까지의 수를 임의로 가져오는 부분에서 막혔다.... 구글링 드가자~
random.nextInt(9) + 1;
로 1부터 9까지 임의의 숫자를 가져올 수 있음.
ramdom.nextInt() 가 궁금하다면 -> https://heytech.tistory.com/167
그렇게 코드를 작성하던 도중....
입력 받은 숫자를 아스키코드로 읽어오는 현상 발생.
위에서처럼 강제 형변환 해보자! 근데 이건 안됨. 왜 ?? char 타입은 원래 문자를, 단 하나의 문자를 저장한다. 보통 `char ex = 'A'; `라는 식으로 쓰인다. 하지만 아래의 예시처럼 ch0에 50이 저장되어있다고 해보자. 이때 강제 형변환
int int0 = (int) ch0;
를 하면 redundant-불필요한-라고 알림이 뜨는데, ch0에 이미 int형의 문자 형태로 저장된 숫자 50을 가지고 있다. 50은 int형(자동 형변환 처리됨)이므로 강제 형변환을 할 필요가 없다.
char ch0 = answerNumber.charAt(0);
char ch1 = answerNumber.charAt(1);
char ch2 = answerNumber.charAt(2);
int int0 = (int) ch0;
int int1 = (int) ch1;
int int2 = (int) ch2;
gpt 도움 받아서 아래 코드로 해결. char 타입에서는 문자 형태로 저장된 숫자를 유니코드 값으로 가지고 있다.
char ch = '5'; // 문자 형태로 저장된 숫자
문자 '5'의 유니코드 값은 53이다. 문자 '0'의 유니코드 값은 48이므로, '5' - '0'는 53 - 48 = 5 가 된다.
즉 문자 'x' - '0' 을 통해 원하는 숫자값을 얻을 수 있다.
char ch0 = answerNumber.charAt(0);
char ch1 = answerNumber.charAt(1);
char ch2 = answerNumber.charAt(2);
int int0 = ch0 - '0';
int int1 = ch1 - '0';
int int2 = ch2 - '0';
게임 도중 숫자를 반복 입력하고, 정답에 가까워지는 부분에서 막혔다....
반복 어떻게 함??
do while 문으로 실행 범위를 로직에 넣고, 메서드의 리턴값을 boolean 타입으로 해보자 ....
boolean 타입의 변수에 메서드의 리턴값 저장해서 해결.
메서드에서 int 값을 3개 반환 받고 이를 활용하기 위해선 어떻게 해야할까?
찾아본 결과 배열을 만들고 배열을 반환 받는 방법, 객체를 생성하여 객체로 반환 받는 방법 등이 있다.
전자는 정답 세 자리 수를 만들 때 해봤으므로 후자의 방법을 택했다.
전자와 후자의 전체적은 맥락은 비슷했지만, 객체의 생성자에서 매개 변수를 int 3개로 설정하고, Main 클래스에서 받아온 int 값 3개를 나누어 연산하기 위해 Main에서 객체를 생성했다.
끝 !!!!!
Main
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
MakeNumber makeNumber = new MakeNumber();
MatchNumbers matchNumbers = new MatchNumbers();
ArrayList<Integer> numberList = new ArrayList<>(makeNumber.makeNumbers());
System.out.println(numberList);
boolean endGameKey = false;
do {
InpuetNumber threeInts = InpuetNumber.getThreeInts();
endGameKey = matchNumbers.operate(numberList, threeInts.first, threeInts.second, threeInts.third, endGameKey);
} while (endGameKey);
}
}
MakeNumber
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
public class MakeNumber {
int a;
int b;
int c;
Random random = new Random();
public MakeNumber (){
}
// 정답 숫자 3개 세팅
Set<Integer> makeNumbers () {
Set<Integer> numberSet = new HashSet<>();
a = random.nextInt(9) + 1;
numberSet.add(a);
do {
b = random.nextInt(9) + 1;
numberSet.add(b);
} while (b==a);
do {
c = random.nextInt(9) + 1;
numberSet.add(c);
} while (c==a || c==b);
return numberSet;
}
}
MatchNumbers
import java.util.ArrayList;
public class MatchNumbers {
int ballCount=0;
int strikeCount=0;
boolean operate (ArrayList<Integer> arrayList, int a, int b, int c, boolean endGameKey) {
if (arrayList.contains(a)) {
ballCount ++;
if (arrayList.get(0)==a) {
strikeCount ++;
ballCount --;
}
}
if (arrayList.contains(b)) {
ballCount ++;
if (arrayList.get(1)==b) {
strikeCount ++;
ballCount --;
}
}
if (arrayList.contains(c)) {
ballCount ++;
if (arrayList.get(2)==c) {
strikeCount ++;
ballCount --;
}
}
switch (strikeCount) {
case 3 :
System.out.println("༼ つ ◕_◕ ༽つ 정답이다. 지나가도 좋다.");
strikeCount =0;
ballCount =0;
endGameKey = false;
break;
default:
System.out.println("ball: " + ballCount);
System.out.println("strike: " + strikeCount);
strikeCount =0;
ballCount =0;
endGameKey = true;
}
return endGameKey;
}
}
'Java > 기타' 카테고리의 다른 글
숫자 야구 게임 Lv 4 (14) | 2024.09.22 |
---|---|
숫자 야구 게임 Lv3 (0) | 2024.09.14 |
숫자 야구 게임 Lv2 (1) | 2024.09.13 |
1, 2주차 과제 다시 하기. (4) | 2024.09.07 |
계산기 만들기 (0) | 2024.09.06 |