교재: 명품 java essential/ 7단원 컬렉션과 제네릭
<Open Callenge>
일단 Word클래스의 코드입니다.
class Word {
String eng;
String kor;
public Word(String eng, String kor) {
this.eng = eng;
this.kor = kor;
}
}
영어와 그에 대응하는 한국어를 멤버변수로 넣어줬습니다.
public 클래스인 WordQuiz에는 1개의 필드, 4개의 멤버변수를 만들어줬습니다.
private Vector<Word> v; | Word클래스 객체의 벡터 |
public WordQuiz() | 생성자. 벡터v에 미리 값을 넣어준다.(책에 있는 것과 같음) |
private Word[] shuffle(Word[] choice) | 정답을 섞은 보기 4개를 Set배열에 넣어줬는데, 거기 저장되어있는 값들을 랜덤하게 섞어주는 함수. |
public int makeQ(int correct_idx) | 선지를 만들기 위한 함수. 정답에 해당하는 인덱스(0~17)를 받아 랜덤하게 서로 다른 인덱스 3개를 더 뽑은 뒤 Set에 넣고 shuffle함수를 돌려준다. 그 다음 랜덤하게 정렬된 선지를 출력한 후, 정답에 대응되는 선택지 번호를 출력한다.(1~4) |
public boolean go() | 프로그램 동작의 메인이 되는 함수. 벡터v에서 랜덤하게 정답인덱스를 고른 후, makeQ함수에 넣어준다. 그 다음 사용자에게 입력을 받아 그 값이 정답인지 아닌지 출력해준다. 만약 입력값이 1~4가 아닐 경우 false를 출력, 맞다면 true를 출력한다. |
1) WordQuiz() 생성자
public WordQuiz() {
v = new Vector<Word>();
v.add(new Word("love", "사랑"));
v.add(new Word("animal", "동물"));
v.add(new Word("eye", "눈"));
v.add(new Word("trade", "거래"));
v.add(new Word("emotion", "감정"));
v.add(new Word("painting", "그림"));
v.add(new Word("fault", "오류"));
v.add(new Word("society", "사회"));
v.add(new Word("picture", "사진"));
v.add(new Word("doll", "인형"));
v.add(new Word("honey", "꿀"));
v.add(new Word("human", "인간"));
v.add(new Word("bear", "곰"));
v.add(new Word("hate", "미워하다"));
v.add(new Word("paper", "종이"));
v.add(new Word("book", "책"));
v.add(new Word("map", "지도")); // 17
}
2) shuffle메소드
private void shuffle(Word[] choice) {
int a, b;
for (int i = 0; i < 10; i++) {
a = (int) (Math.random() * 4);
b = (int) (Math.random() * 4);
Word temp = choice[a];
choice[a] = choice[b];
choice[b] = temp;
}
}
인덱스 0~3중 2개를 랜덤하게 선택하여 자리를 바꿔주는 걸 10번 반복해줬습니다.
충분히 잘 섞였겠죠?
3) makeQ 메소드
public int makeQ(int correct_idx) {
Set<Word> s = new HashSet<>();
Word temp = v.get(correct_idx);
s.add(temp);
while (s.size() < 4) {
int rand_idx = (int) (Math.random() * 17);
temp = v.get(rand_idx);
s.add(temp);
}
Word[] choice = s.toArray(new Word[0]);
shuffle(choice);
for (int i = 0; i < choice.length; i++) {
System.out.print("(" + (i + 1) + ") " + choice[i].kor + " ");
}
System.out.print(">>");
int idx = 0;
for (int i = 0; i < choice.length; i++) {
if (choice[i] == v.get(correct_idx)) {
idx = i;
break;
}
}
return idx + 1;
}
v의 인덱스 중 정답으로 설정된 인덱스를 입력받습니다.(0~16중 하나겠죠)
중복방지 검사를 위해 Set자료구조를 이용해줬습니다. set의 사이즈가 4가 되면 서로 다른 값 4개가 저장되겠죠?
(같은 값이 중복되어 저장될 수 없다는 걸 이용한 겁니다.)
Set에 정답 인덱스를 넣어준 뒤, 0~17중 서로다른 3개의 값을 더 넣어줍니다.
그리고 set의 값을 배열로 받아 shuffle함수를 수행시켜주고 선지를 출력해줍니다.
마지막엔 정답의 선지를 반환해줍니다. idx는 배열인덱스 0 1 2 3을 기준으로 저장되어 있기 때문에 1을 더한값을 출력해줍니다.
4) go메소드
public boolean go() {
Scanner scanner = new Scanner(System.in);
int correct_idx;
String correct_Q;
int correct_asw;
correct_idx = (int) (Math.random() * 17);
correct_Q = v.get(correct_idx).eng;
System.out.println("================================================");
System.out.println(correct_Q + "?");
correct_asw = makeQ(correct_idx);
int input;
try {
input = scanner.nextInt();
} catch (InputMismatchException e) {
return false;
}
if (input != 1 && input != 2 && input != 3 && input != 4)
return false;
if (input == correct_asw)
System.out.println("Excellent !!");
else
System.out.println("No. !!");
return true;
}
correct_idx는 벡터 v에서의 정답 위치 인덱스
correct_Q는 벡터 v에서의 정답의 영어값
correct_asw는 선택지 4개 중 정답인 선택지
먼저 correct_idx를 0~16중 랜덤한 값으로 결정해줍니다.
그리고 correct_asw는 makeQ메소드를 받도록 해줍니다. makeQ는 선지를 출력해주고 정답인 선지를 반환하니까요.
그 다음엔 사용자의 입력을 받아 정답인 선지일 경우 Excellent를 반환합니다.
이 때 1,2,3,4가 아닌 다른 값을 입력할 경우 false를 반환합니다. false는 main에서 받아 게임의 반복유무를 결정해줍니다.
5) main함수
public static void main(String[] args) {
WordQuiz quiz = new WordQuiz();
boolean go = true;
System.out.println("영어 어휘 테스트를 시작합니다. 1~4 외 다른 입력시 종료합니다.");
while (go) {
go = quiz.go();
}
System.out.println("================================================");
System.out.println("프로그램을 종료합니다.");
}
go는 게임의 반복유무를 결정해주는 변수입니다.
go에 quiz의 go메소드의 입력값을 넣어주고, false가 들어가면 게임이 종료됩니다.
<전체코드>
import java.util.*;
class Word {
String eng;
String kor;
public Word(String eng, String kor) {
this.eng = eng;
this.kor = kor;
}
}
public class WordQuiz {
private Vector<Word> v;
public WordQuiz() {
v = new Vector<Word>();
v.add(new Word("love", "사랑"));
v.add(new Word("animal", "동물"));
v.add(new Word("eye", "눈"));
v.add(new Word("trade", "거래"));
v.add(new Word("emotion", "감정"));
v.add(new Word("painting", "그림"));
v.add(new Word("fault", "오류"));
v.add(new Word("society", "사회"));
v.add(new Word("picture", "사진"));
v.add(new Word("doll", "인형"));
v.add(new Word("honey", "꿀"));
v.add(new Word("human", "인간"));
v.add(new Word("bear", "곰"));
v.add(new Word("hate", "미워하다"));
v.add(new Word("paper", "종이"));
v.add(new Word("book", "책"));
v.add(new Word("map", "지도")); // 17
}
private void shuffle(Word[] choice) {
int a, b;
for (int i = 0; i < 10; i++) {
a = (int) (Math.random() * 4);
b = (int) (Math.random() * 4);
Word temp = choice[a];
choice[a] = choice[b];
choice[b] = temp;
}
}
public int makeQ(int correct_idx) {
Set<Word> s = new HashSet<>();
Word temp = v.get(correct_idx);
s.add(temp);
while (s.size() < 4) {
int rand_idx = (int) (Math.random() * 17);
temp = v.get(rand_idx);
s.add(temp);
}
Word[] choice = s.toArray(new Word[0]);
shuffle(choice);
for (int i = 0; i < choice.length; i++) {
System.out.print("(" + (i + 1) + ") " + choice[i].kor + " ");
}
System.out.print(">>");
int idx = 0;
for (int i = 0; i < choice.length; i++) {
if (choice[i] == v.get(correct_idx)) {
idx = i;
break;
}
}
return idx + 1;
}
public boolean go() {
Scanner scanner = new Scanner(System.in);
int correct_idx;
String correct_Q;
int correct_asw;
correct_idx = (int) (Math.random() * 17);
correct_Q = v.get(correct_idx).eng;
System.out.println("================================================");
System.out.println(correct_Q + "?");
correct_asw = makeQ(correct_idx);
int input;
try {
input = scanner.nextInt();
} catch (InputMismatchException e) {
return false;
}
if (input != 1 && input != 2 && input != 3 && input != 4)
return false;
if (input == correct_asw)
System.out.println("Excellent !!");
else
System.out.println("No. !!");
return true;
}
public static void main(String[] args) {
WordQuiz quiz = new WordQuiz();
boolean go = true;
System.out.println("영어 어휘 테스트를 시작합니다. 1~4 외 다른 입력시 종료합니다.");
while (go) {
go = quiz.go();
}
System.out.println("================================================");
System.out.println("프로그램을 종료합니다.");
}
}
재밌는 문제였네요!
'프로그래밍 언어 > javastudy' 카테고리의 다른 글
명품 Java Essential 7단원 Bonus 1 (0) | 2021.07.17 |
---|---|
명품 Java Essential 7단원 실습문제 1~7 (0) | 2021.07.17 |
명품 Java Essential 6단원 Bonus 1 ~ 3 (0) | 2021.07.16 |
명품 Java Essential 6단원 실습문제 1~6 (0) | 2021.07.15 |
명품 자바 에센셜 6단원/ 영문자 알파벳 히스토그램 (0) | 2021.07.14 |