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("입력 오류");

			}
		}

	}

}

capital.txt 라는 파일이 자동 생성된다.
기본구동
1. 입력을 했을 때
정답과 오답을 했을 때
x를 눌려서 메인으로 빠져나온후 3번을 눌려서 종료

 

728x90
반응형