ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 행맨 게임 (Hangman Game)
    자바 Java/자바로 알고리즘 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); //인덱스 값을 주면 그 위치의 데이터값(단어)를 리턴
    		
    	}
    
    }
Designed by Tistory.