IT공부/JAVA

[JAVA] String 클래스 메소드를 이용한 단어 맞추기 게임

재삐 2023. 12. 28. 22:37
반응형

[그림출처 : https://blog.naver.com/reborn02/222479681776]

 

JAVA 단어 맞추기 행맨 콘솔 구현 입니다.

 

규칙1. 사용자는 남은 시도 횟수 안에 정답 단어를 맞추면 게임에서 이기게 되고 그렇지 않으면 진다.

규칙2. 단어를 맞출 수 있는 회수는 단어의 문자수 + 3

 

 

1. Main 클래스의 모습입니다.

 

2. HangMan 클래스의 구조

 

3. HangMan의 객체가 생성 될 때 생성자로 문제로 낼 단어들을 호출 합니다.

 

4. 초기화 된 단어 중 랜덤으로 뽑을 Random 클래스와

    단어를 맞춰야하니 Scanner 클래스를 생성 해 줍니다.

 

5. 랜덤으로 발생한 수를 idx에 넣고

words[idx]를 이용하여 인덱스를 랜덤으로 접근해

문제를 낼 단어를 랜덤으로 뽑아 word에 저장합니다.

 

6. makeUnderLine(랜덤으로 뽑은 단어의 길이) 메소드를 이용하여 _ 를 찍고

    hints에 char 타입의 underLine 반환값을 넣어줍니다.

 

7. 규칙2에 따라 시도횟수를 만들어 준다.

while (attmeps > 0) {
  // 단어를 다 맞추면 성공! 시키고 return; 으로 run()메소드를 종료 시켜버리고
  // 못맞추면 attemps--; 으로 attemps의 값을 1씩 감소
}
  // while 문이 끝나기전에 성공 못하면 패배!!

 

 

8. String 메소드 charAt()를 이용하여 문자 하나만 입력 받기

toLowerCase() 메소드를 이용하여 대문자 입력시 소문자로 변환

 

9. 단어의 길이만큼 for로 돌면서

word의 단어 위치 만큼 탐색하며 입력한 값 correct가 일치하면

hints[맞춘 해당 한글자 입력]해서 다시 while문의 처음으로 돌아가 힌트로 보여준다.

 

10. 구현 영상

 

11. 전체 소스코드

// Main.java
public class Main {
    public static void main(String[] args) {
        HangMan hm = new HangMan(); // HangMan 객체생성
        hm.run(); //HangMan의 run()메소드 실행
    }
}
// HangMan.java
import java.util.Random;
import java.util.Scanner;

public class HangMan {
    String[] words; // 단어장
    char[] hints; // 힌트
    int attemps; // 시도 횟수

    // 생성자 words 단어 초기화
    HangMan() { // 생성자 : 객체 생성시 words의 초기값 할당
        words = new String[]{"program", "freedom", "believe", "thought", "company",
                "love", "student", "teacher", "chair", "culture"};
    }

    public void run() {
        Random random = new Random(); // random 이라는 Random 참조자료형 생성
        int idx = random.nextInt(words.length); // words의 방 크기만큼 현재 10이라
                                                // 0~9까지 랜덤 번호를 idx에 저장
        String word = words[idx]; // 배열 words 중 랜덤의 문자열 word에 저장

        hints = makeUnderLine(word.length()); // underLine[word.length()]의 주소값을 hints에 저장

        attemps = word.length() + 3; // 시도횟수 = 단어길이 + 3

        Scanner scanner = new Scanner(System.in); // scanner 라는 Scanner 참조자료형 생성

        while (attemps > 0) { // 시도횟수가 0일 때 while문을 빠져나옴
//            System.out.println("현재 단어 : " + Arrays.toString(hints));
            System.out.println("현재 단어 : " + String.valueOf(hints)); // 문자열 + char값을 문자열로 바꿈
            System.out.println("남은 시도 횟수 : " + attemps);
            System.out.print("글자를 입력하세요 : ");
            String str = "";
            str = scanner.nextLine().toLowerCase(); // 입력값을 str에 저장 + 대문자는 소문자로 변환됨
            char correct = str.charAt(0); // 입력한 str의 첫번째 문자를 correct에 저장

            for (int i = 0; i < word.length(); i++) {
                if (word.charAt(i) == correct) { // 정답의 i번째 문자열과 입력한 문자열을 비교
                    hints[i] = correct; // 정답의 i번째 문자열을 입력한 문자열로 바꿈
                    if (word.equals(String.valueOf(hints))) { // 문자열이 일치하면 승리 처리
                        System.out.println("당신의 승리!! 정답 : " + word);
                        return; // run()을 종료해버림
                    }
                }
            }
            attemps--; // 한번 입력할 때 마다 attemps 1씩 깍음
        }
        System.out.println("당신의 패배!! 정답 : " + word); // attemps이 0이되어 while이 빠져나오면 출력
    }

    private char[] makeUnderLine(int length) { // 인자값만큼 underLine[i]를 생성한 주소를 반환
        char[] underLine = new char[length];
        for (int i = 0; i < length; i++) {
            underLine[i] = '_';
        }
        return underLine;
    }
}
반응형