Post

내일배움캠프 사전캠프 JAVA 퀘스트 달리기반 3번

🚀 문제

  • 컴퓨터가 랜덤으로 선택한 영어단어를 9번의 기회 안에 한 글자씩 입력하여 맞추는 게임
  1. 컴퓨터가 랜덤으로 영어단어를 선택합니다.
    • 영어단어의 자리수를 알려줍니다.
      ex) PICTURE = 7자리 => _ _ _ _ _ _ _
  2. 사용자는 A 부터 Z 까지의 알파벳 중에서 하나를 입력합니다.
    • 입력값이 A-Z 사이의 알파벳이 아니라면 다시 입력을 받습니다.
      Java 의 Charactor.isLetter() 을 활용
    • 입력값이 한 글자가 아니라면 다시 입력을 받습니다.
    • 이미 입력했던 알파벳이라면 다시 입력을 받습니다.
    • 입력값이 정답에 포함된 알파벳일 경우 해당 알파벳이 들어간 자리를 전부 보여주고, 다시 입력을 받습니다.
      ex) 정답이 eyes 인 경우에 E 를 입력했을 때
      _ _ _ _ -> E _ E _
    • 입력값이 정답에 포함되지 않는 알파벳일 경우 기회가 하나 차감되고, 다시 입력을 받습니다.
  3. 사용자가 9번 틀리면 게임오버됩니다.
  4. 게임오버 되기 전에 영어단어의 모든 자리를 알아내면 플레이어의 승리입니다.

🚀 정답

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
import java.util.*;

public class WordGuessGame {

    // 최대 시도 횟수 (틀릴 수 있는 기회)
    private static final int MAX_TRIES = 9;

    // 단어 목록: 컴퓨터가 이 중 하나를 선택함
    private static final List<String> WORDS = Arrays.asList(
        "airplane", "apple", "arm", "aunt", "back", "bag", "ball", "bank", "bat", "bed", "bicycle", "bird",
        "body", "book", "boy", "bread", "bus", "cake", "camera", "cap", "car", "classroom", "clock", "coat",
        "computer", "cow", "cup", "dad", "daughter", "desk", "doctor", "dog", "door", "ear", "egg", "eye",
        "face", "fan", "farm", "father", "finger", "fish", "floor", "flower", "food", "foot", "fork", "friend",
        "game", "garden", "girl", "glove", "goat", "grandfather", "grandmother", "grape", "hair", "hand",
        "hat", "head", "helicopter", "hospital", "house", "jeep", "jelly", "jet", "joke", "juice", "key",
        "kitchen", "kite", "leg", "library", "lips", "man", "map", "milk", "mirror", "mom", "monkey", "moon",
        "motorcycle", "mouth", "musician", "neck", "nurse", "pencil", "picture", "pig", "pilot", "pizza", "police",
        "pool", "rabbit", "rain", "ring", "robot", "room", "school", "shark", "shirt", "shoe", "sky", "snake",
        "sock", "spoon", "star", "stationary", "strawberry", "student", "sun", "supermarket", "table", "teacher",
        "television", "tiger", "toe", "tooth", "train", "truck", "uncle", "window", "zoo"
    );

    // 메인 메서드: 프로그램의 시작점
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in); // 사용자 입력을 위한 Scanner 객체
        Random random = new Random();             // 랜덤 단어 선택을 위한 Random 객체

        // 정답 단어를 무작위로 선택하고 대문자로 변환
        String answer = WORDS.get(random.nextInt(WORDS.size())).toUpperCase();

        // 이미 맞힌 글자를 저장하는 집합 (중복 제거)
        Set<Character> guessed = new HashSet<>();

        int remainingTries = MAX_TRIES; // 남은 시도 횟수

        System.out.println("🔤 단어 맞추기 게임 시작! 기회는 " + MAX_TRIES + "번입니다.");

        // 게임 루프: 기회가 남아 있는 동안 반복
        while (remainingTries > 0) {
            boolean allRevealed = true; // 모든 글자를 맞췄는지 여부

            // 현재까지 맞힌 단어 형태 출력 (예: P _ _ T _ R E)
            System.out.print("현재 단어: ");
            for (char c : answer.toCharArray()) {
                if (guessed.contains(c)) {
                    System.out.print(c + " ");
                } else {
                    System.out.print("_ ");
                    allRevealed = false;
                }
            }
            System.out.println();

            // 정답을 모두 맞췄으면 게임 종료
            if (allRevealed) {
                System.out.println("🎉 정답입니다! 단어: " + answer);
                break;
            }

            // 사용자에게 글자 입력 받기
            System.out.print("남은 기회: " + remainingTries + " | 글자를 입력하세요: ");
            String input = scanner.nextLine().toUpperCase();

            // 입력 유효성 검사 (한 글자, 알파벳 여부 확인)
            if (input.length() != 1 || !Character.isLetter(input.charAt(0))) {
                System.out.println("⚠️ 한 글자만 입력해주세요.");
                continue;
            }

            char guess = input.charAt(0); // 사용자가 입력한 글자

            // 이미 시도한 글자인지 확인
            if (guessed.contains(guess)) {
                System.out.println("이미 시도한 글자입니다.");
                continue;
            }

            // 새로 시도한 글자 저장
            guessed.add(guess);

            // 정답에 해당 글자가 있는지 확인
            if (!answer.contains(String.valueOf(guess))) {
                remainingTries--; // 틀렸으면 기회 줄이기
                System.out.println("❌ 틀렸습니다.");
            } else {
                System.out.println("⭕ 정답입니다!");
            }
        }

        // 모든 기회를 소진했을 때
        if (remainingTries == 0) {
            System.out.println("😢 기회를 모두 사용했습니다. 정답은: " + answer);
        }

        scanner.close(); // Scanner 자원 정리
    }
}

🚀 해석

메서드/코드설명
Scanner사용자로부터 입력을 받기 위해 사용
Random단어 리스트에서 무작위 단어를 선택할 때 사용
Set<Character> guessed사용자가 이미 입력한 글자를 기억하기 위한 구조 (중복 방지)
for (char c : answer.toCharArray())현재까지 맞힌 단어를 보여주는 루프
if (!Character.isLetter(input.charAt(0)))입력값이 알파벳인지 검사
if (guessed.contains(guess))이미 입력한 글자인지 확인
if (!answer.contains(String.valueOf(guess)))정답 단어에 해당 글자가 있는지 확인
scanner.close()프로그램 종료 전 자원 정리
input.charAt(0)문자열에서 첫 번째 글자(0번째 인덱스)만 추출해서 char 타입으로 변환