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