본문 바로가기

JAVA

Lv3. 단어 맞추기 게임

문제

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

 

1차 코드

import java.util.*;

public class 단어맞추기게임 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        List<String> cards = new ArrayList<>();

        cards.add("PICTURE");
        cards.add("APPLE");
        cards.add("HELLO");
        cards.add("EXPENSIVE");

        Random random = new Random();
        int randNumber = random.nextInt(cards.size());
        String answer = cards.get(randNumber);

        List<String> prompt = new ArrayList<>();
        for (int i = 0; i < answer.length(); i++){
            prompt.add("_");
        }

        List<String> save = new ArrayList<>();

        for (int i = 0; i < 9; i++){

            String alpabet ="";

            while (true) {

                for (String e : prompt){
                    System.out.print(e);
                    System.out.print(" ");
                }
                System.out.println();

                String value = scanner.nextLine();
                value = value.toUpperCase();
                String v = String.valueOf(value.charAt(0));

                System.out.println(value.length() == 1);

                if ((value.length() == 1 && value.charAt(0) >= 'A' && value.charAt(0) <= 'Z') && !save.contains(value)) {
                    alpabet = v;
                    save.add(alpabet);
                    break;
                }

            }

            for (int j = 0; j < answer.length(); j++){
                char c = alpabet.charAt(0);
                if (c == answer.charAt(j)){
                        prompt.set(j, String.valueOf(c));
                    }
                }

            if (!prompt.contains("_")){
                System.out.println("승리!");
                System.exit(0);
            }
        }

        System.out.println("패배");
    }
}

 

  • 입력을 검증하는 부분에서 어떻게 할지 고민하다가 문제를 읽어보니 기회는 사라지지 않고, 재입력을 받는거라고 생각해서 while문에 넣고 돌려서 해결함
  • 처음에 String 타입으로 list에 입력값들을 넣어줬는데 자바는 파이썬과 다르게 String과 Char을 철저히 구분해서 value.charAt(idx)값을 사용하느라 상당히 번거로웠음
    • 다 만들고 보니 생각해보니까 Char값을 타입으로 지정해서 list로 만들면 되지 않았을까 깨달았음 😂
  • 리스트를 초기화 할 때 List<String> words = Arrays.asList("airplane", "apple", "arm") 이런식으로 초기에 값을 넣어서 선언할 수 있다고 하는데, 크기가 고정되기 때문에 그냥 초기화를 안하고 add로 넣어주었음

 

2차 코드

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Scanner;

public class HangmanGame {

    public static void main(String[] args) {
        List<String> cards = new ArrayList<>();
        cards.add("PICTURE");
        cards.add("APPLE");
        cards.add("HELLO");
        cards.add("EXPENSIVE");

        Random random = new Random();
        int randNumber = random.nextInt(cards.size());
        String answer = cards.get(randNumber);

        // prompt를 char 리스트로 바꿔서 한글자씩 "_"를 저장
        List<Character> prompt = new ArrayList<>();
        for (int i = 0; i < answer.length(); i++) {
            prompt.add('_'); 
        }

        List<Character> save = new ArrayList<>();  // 이미 입력된 알파벳을 저장

        Scanner scanner = new Scanner(System.in);
        for (int i = 0; i < 9; i++) {  // 최대 9번까지 시도
            while (true) {
                // 현재 상태의 단어 출력
                for (char c : prompt) {
                    System.out.print(c + " ");
                }
                System.out.println();

                // 사용자 입력
                String value = scanner.nextLine().toUpperCase();  // 대문자 입력 받기
                if (value.length() == 1 && value.charAt(0) >= 'A' && value.charAt(0) <= 'Z' && !save.contains(value.charAt(0))) {
                    save.add(value.charAt(0));  // 입력한 알파벳 저장
                    break;
                } else {
                    System.out.println("유효하지 않은 입력입니다. 다시 시도하세요.");
                }
            }

            // prompt 업데이트
            char alpabet = save.get(save.size() - 1);  // 마지막으로 입력된 알파벳
            for (int j = 0; j < answer.length(); j++) {
                if (alpabet == answer.charAt(j)) {
                    prompt.set(j, alpabet);  // 맞는 알파벳을 prompt에 업데이트
                }
            }

            // 승리 조건 체크
            if (!prompt.contains('_')) {
                System.out.println("승리!");
                break;
            }
        }

        // 게임 종료 후 최종 상태 출력
        for (char c : prompt) {
            System.out.print(c + " ");
        }
        System.out.println();
    }
}
  • LIst를 Character로 바꿔주니 한~결 깔금해졌다!

'JAVA' 카테고리의 다른 글

보너스 문제: 가위 바위 보  (0) 2024.12.17
Lv2. 스파르타 자판기  (3) 2024.12.14
Lv1. 랜덤 닉네임 생성기  (0) 2024.12.14
JAVA와 Spring 특징  (0) 2024.12.11
반복문 연습하기  (0) 2024.12.11