자바 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); //인덱스 값을 주면 그 위치의 데이터값(단어)를 리턴
}
}