Language/Java
HashMap을 이용한 수도 퀴즈 게임
원2
2021. 4. 29. 15:52
728x90
반응형
package com.iotest;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;
public class MyCapital {
private static Scanner sc = new Scanner(System.in);
// HashMap은 key값을 사용한다, 랜덤추출 값을 갖는다.
private HashMap<String, String> map = new HashMap<String, String>(); // map을 만들고
File dir = new File("src\\com\\iotest"); // 파일을 읽어오고
File file = new File(dir, "capital.txt"); // 파일을 생성
public MyCapital() { // 생성자 : 파일을 읽어서 map에 저장하는걸 만듬 그래야 문제를 풀 수 있다
map.clear(); // 쓰레기 값을 초기화
try {
if (!file.exists()) { // 파일이 없다면
file.createNewFile();// 파일을 생성
return;
}
Scanner scanner = new Scanner(file); // 파일 읽기 위의 파일과 다르다, 입력을 받아올거임
while (scanner.hasNext()) {
String key = scanner.next();
String value = scanner.next();
map.put(key, value); // 맵에 들어가는 것
}
System.out.println(map);
scanner.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public void input() { // 입력 : 문제를 좀 더 출제 해 보자.
System.out.println("[System] 현재" + map.size() + "문제 있음");
while (true) {
System.out.println("[System] 나라와 수도를 한 칸 띄워서 입력하세요...(메인으로 가기 x)>>");
System.out.println("[System] 정상적으로 종료시에만 입력 값이 저장됩니다...");
String country = MyCapital.sc.next();
if (country.equalsIgnoreCase("x")) // 만약 country가 x면 종료.
break;
if (map.containsKey(country)) { // key 값의 존재여부를 확인 존재한다면
System.out.println("[System] 이미 입력한 나라입니다..."); // 이걸출력
continue; // 반복문을 종료하지 않고 계속 진행
}
String sudo = MyCapital.sc.next();
map.put(country, sudo);
System.out.println(map); // 여기까지는 단순히 콘솔에 저장된 것. 진짜 저장은 save로
}
}
public void quiz() { // 퀴즈 랜덤하게 문제(나라) 출제
// key 값만 추출해서 배열에 넣기
Set<String> set = map.keySet(); // key 값만 추출하는 메서드 중복을 허용하지 않고 순서가 없음
Object[] arr = set.toArray(); // 배열에 순서가 있어야 하므로
while (true) {
int r = (int) (Math.random() * arr.length); // 난수발생 0~1 사이의 난수
// Math.random()은 더블형이라 int 로 받기 위해서 또한 arr.length 만큼의 길이를 얻기위해
String mon = (String) arr[r]; // 문제(나라) arr은 int 형 String으로 형변환
String dap = map.get(mon); // 정답(수도)
// 문제 출제
System.out.println(mon + "의 수도는?ㅋ (메인으로 가기 : X) >>>");
String result = MyCapital.sc.next(); // 답 입력하는 부분
if (result.equalsIgnoreCase("x")) // equalsIgnoreCase 대소문자를 구분하지 않는다.X x 가능
break;
if (result.equals(dap)) {
System.out.println("정답ㅋ");
} else {
System.out.println("틀렸는데요?");
}
}
}
public void save() { // 종료하면서 입력한 나라와 수도를 파일로 내보내기(저장)
try {
FileWriter fw = new FileWriter(file);
Set<String> set = map.keySet(); // 나라만 추출
Iterator<String> it = set.iterator();
while (it.hasNext()) {
String key = it.next(); // 나라
String value = map.get(key); // 수도
fw.write(key + " ");
fw.write(value + "\n");
}
fw.close();
System.out.println("종료");
System.exit(0);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void showMenu() {
System.out.println("**수도 맞추기 게임 시작**");
System.out.println("원하는 메뉴의 숫자를 입력하세요");
System.out.println("[1].입력 [2].퀴즈 [3].종료 >>");
}
public static void main(String[] args) {
MyCapital app = new MyCapital();
while (true) {
MyCapital.showMenu();
int num = MyCapital.sc.nextInt();
switch (num) {
case 1:
app.input();
break;
case 2:
app.quiz();
break;
case 3:
app.save();
System.exit(0);
default:
System.out.println("입력 오류");
}
}
}
}
728x90
반응형