자바 Java/자바로 알고리즘

행맨 게임 (Hangman Game)

하나비 HANABI 2022. 1. 6. 10:06
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.Random;
import java.util.Scanner;
import java.util.Vector;

public class Hangman {
	private final int HIDDENCHAR = 3; // 감출 문자의 갯수
	private StringBuffer hiddenWord; // 감춰진 단어를 가공하여 저장
	private String newWord; // 선정된 단어
	private Scanner scanner;
	private int failCount; // 틀린 횟수 카운트
	
	public Hangman() { scanner = new Scanner(System.in); }
	
	public void run() {	
		System.out.println("게임 시작"); 
		Words words = new Words("words.txt"); // Words객체 생성
		
		while(true) {
			newWord = words.getRandomWord();
			if(newWord == null) break; //단어가 비어있으면 강제종료
			makeHidden();
			go();
		}
	}
	
	// 글자를 감추기
	private void makeHidden() { 
		hiddenWord = new StringBuffer(newWord);
		Random r = new Random();
		
		for (int k = 0; k < HIDDENCHAR; k++) {
			int index = r.nextInt(newWord.length()); // 범위를 정해 임의의 int값을 가져옴
			char c = newWord.charAt(index); // index 위치에 해당하는 문자를 가져옴
			
			for (int i = 0; i < newWord.length(); i++) {
				if (hiddenWord.charAt(i) == c) { hiddenWord.setCharAt(i, '_');}
			}
		}
	}
	
	// 게임진행 - 문자를 입력하고 알아맞추기
	private void go() {
		failCount = 0;
		char key;
		do {
			if(failCount == 5) {
				System.out.println("게임실패");
				break;
			}
			System.out.println(hiddenWord); System.out.println(">>");
			String text = scanner.next();
			key = text.charAt(0);
		} while (!complete(key));
		System.out.println(newWord); 
	}
	
	private boolean complete(char key) {
		boolean hit = false; // 맞으면 true 틀리면 false
		
		for (int i = 0; i < newWord.length(); i++) {
			if((hiddenWord.charAt(i) == '_') && (newWord.charAt(i) == key)) { // 정답일때
				hiddenWord.setCharAt(i, key); // i에 key값을 세팅
				hit = true;
			}
		}
		if(!hit) 
			failCount++;
		for (int i = 0; i < newWord.length(); i++) {
			if(hiddenWord.charAt(i) == '_')
				return false;
		}
		return true;
	}
	
	public static void main(String[] args) {
		Hangman hangman = new Hangman();
		hangman.run();
	}
}

class Words { 
	
	//파일에 있는 단어들을 벡터로 옮기기
	//벡터는 신축성있는 배열. 벡터를 생성
	Vector<String> wordVector = new Vector<String>(); 
	
	//생성자 메소드에서 words.txt파일에서 임의로 단어하나를 끄집 내도록
	public Words(String fileName) { 
		try {
			Scanner scanner = new Scanner(new FileReader(fileName)); // 파일에서 데이터를 읽어오는 통로
			while(scanner.hasNext()) { // 파일에서 읽어온 데이터를 처음부터 끝까지 하나씩 읽음
				String word = scanner.nextLine(); // 라인 하나에 한 단어이므로 한 라인씩 읽음
				wordVector.add(word); // 벡터에 모든 단어 저장
			} // 다음 데이터가 없으면(단어를 모두 다 읽으면) 반복문 종료
			scanner.close(); // 스캐너 사용 종료
		} catch (FileNotFoundException e) {
			System.out.println("파일이 존재하지 않습니다.");
			System.exit(0);
		}
	}
	
	// 벡터로 가져온 단어들을 랜덤으로 하나 뽑기 메소드
	public String getRandomWord() {
		
		final int WORDMAX = wordVector.size(); // 총 단어의 개수
		int index = (int) (Math.random()*WORDMAX); 
		return wordVector.get(index); //인덱스 값을 주면 그 위치의 데이터값(단어)를 리턴
		
	}

}