규칙
- 컴퓨터가 랜덤으로 영어단어를 선택합니다.
- 영어단어의 자리수를 알려줍니다.
[ "airplane", "apple", "arm", "bakery", "banana", "bank", "bean", "belt", "bicycle", "biography", "blackboard", "boat", "bowl", "broccoli", "bus", "car", "carrot", "chair", "cherry", "cinema", "class", "classroom", "cloud", "coat", "cucumber", "desk", "dictionary", "dress", "ear", "eye", "fog", "foot", "fork", "fruits", "hail", "hand", "head", "helicopter", "hospital", "ice", "jacket", "kettle", "knife", "leg", "lettuce", "library", "magazine", "mango", "melon", "motorcycle", "mouth", "newspaper", "nose", "notebook", "novel", "onion", "orange", "peach", "pharmacy", "pineapple", "plate", "pot", "potato", "rain", "shirt", "shoe", "shop", "sink", "skateboard", "ski", "skirt", "sky", "snow", "sock", "spinach", "spoon", "stationary", "stomach", "strawberry", "student", "sun", "supermarket", "sweater", "teacher", "thunderstorm", "tomato", "trousers", "truck", "vegetables", "vehicles", "watermelon", "wind" ]
영어 단어 표본은 위에 있는 단어를 사용하였다.
3. A 부터 Z 까지의 알파벳 중에서 하나를 입력합니다.
4. 입력값이 A-Z 사이의 알파벳이 아니라면 다시 입력을 받습니다
- 입력값이 한 글자가 아니라면 다시 입력을 받습니다
- 이미 입력했던 알파벳이라면 다시 입력을 받습니다.
- 입력값이 정답에 포함된 알파벳일 경우 해당 알파벳이 들어간 자리를 전부 보여주고, 다시 입력을 받습니다.
- 입력값이 정답에 포함되지 않은 알파벳일 경우 기회가 하나 차감되고, 다시 입력을 받습니다.
5. 사용자가 9번 틀리면 게임오버됩니다.
6. 게임오버 되기 전에 영어단어의 모든 자리를 알아내면 플레이어의 승리입니다.
import java.util.*;
public class Main {
public static void main(String[] args) {
// 단어 리스트 생성
List list = new ArrayList<>(Arrays.asList(
"airplane", "apple", "arm", "bakery", "banana", "bank", "bean", "belt", "bicycle", "biography",
"blackboard", "boat", "bowl", "broccoli", "bus", "car", "carrot", "chair", "cherry", "cinema",
"class", "classroom", "cloud", "coat", "cucumber", "desk", "dictionary", "dress", "ear", "eye", "fog",
"foot", "fork", "fruits", "hail", "hand", "head", "helicopter", "hospital", "ice", "jacket", "kettle",
"knife", "leg", "lettuce", "library", "magazine", "mango", "melon", "motorcycle", "mouth", "newspaper",
"nose", "notebook", "novel", "onion", "orange", "peach", "pharmacy", "pineapple", "plate", "pot",
"potato", "rain", "shirt", "shoe", "shop", "sink", "skateboard", "ski", "skirt", "sky", "snow", "sock",
"spinach", "spoon", "stationary", "stomach", "strawberry", "student", "sun", "supermarket", "sweater",
"teacher", "thunderstorm", "tomato", "trousers", "truck", "vegetables", "vehicles", "watermelon", "wind"
));
// 랜덤 객체 생성 및 단어 선택
Random random = new Random();
String answer = getRandomElement(list, random); // 무작위 단어 선택
int wordLength = answer.length();
System.out.println(wordLength + "자리");
// 입력 받기 위한 Scanner 객체 생성
Scanner scanner = new Scanner(System.in);
// 이미 입력한 알파벳을 관리하기 위한 집합
Set chars = new HashSet<>();
// 정답 맞춘 알파벳을 저장하기 위한 리스트
List correctGuesses = new ArrayList<>();
// 시도 횟수를 카운트하기 위한 변수
int count = 0;
// 게임 진행
while (count < 9) { // 최대 9번 시도 가능
System.out.println("a부터 z까지의 알파벳 중에서 하나를 입력하세요.");
String input = scanner.nextLine().toLowerCase(); // 사용자 입력 받기
// 입력 검증
if (!input.matches("[a-z]")) { // 알파벳이 아닌 경우
System.out.println("올바른 알파벳을 입력하세요.");
continue; // 다시 입력 받기
}
char guess = input.charAt(0); // 입력 문자 추출
if (chars.contains(guess)) { // 이미 입력한 알파벳인 경우
System.out.println("이미 입력한 알파벳입니다. 다른 알파벳을 입력하세요.");
continue; // 다시 입력 받기
}
if (input.length() != 1) { // 한 글자가 아닌 경우
System.out.println("한 글자만 입력하세요.");
continue; // 다시 입력 받기
}
boolean found = false; // 정답에 포함된 알파벳 여부 플래그
StringBuilder display = new StringBuilder(); // 정답 표시용 문자열
// 정답 확인 및 출력
for (int i = 0; i < wordLength; i++) {
if (answer.charAt(i) == guess) { // 정답에 알파벳이 포함된 경우
found = true;
display.append(guess); // 정답 위치에 알파벳 추가
correctGuesses.add(guess); // 정답 맞춘 알파벳 리스트에 추가
} else if (correctGuesses.contains(answer.charAt(i))) {
display.append(answer.charAt(i)); // 이미 맞춘 알파벳인 경우
} else {
display.append("_"); // 아직 맞추지 않은 부분은 언더바 처리
}
}
if (found) {
System.out.println("정답에 포함된 알파벳 위치: " + display); // 정답 위치 출력
} else {
System.out.println("정답에 포함되지 않았습니다. 다시 시도하세요.");
chars.add(guess); // 입력한 알파벳 집합에 추가
count++; // 시도 횟수 증가
}
// 모든 알파벳을 맞춘 경우 게임 종료
if (correctGuesses.size() == wordLength) {
break;
}
}
// 게임 종료 후 정답 및 맞춘 알파벳 출력
System.out.println("게임 종료! 정답은 " + answer + "입니다.");
System.out.println("맞춘 알파벳: " + correctGuesses);
// Scanner 객체 닫기
scanner.close();
}
// 리스트에서 랜덤하게 원소 선택하는 메소드
private static String getRandomElement(List list, Random random) {
return list.get(random.nextInt(list.size()));
}
}
코드 해석
- 단어 리스트 생성: 게임에 사용할 단어들을 리스트에 저장합니다.
- 랜덤 단어 선택: getRandomElement 메소드를 사용하여 리스트에서 무작위로 하나의 단어를 선택합니다.
- 게임 시작: 사용자에게 단어의 길이를 알려주고, 사용자 입력을 받기 위해 Scanner 객체를 생성합니다.
- 입력 및 검증: 사용자가 입력한 문자가 올바른 알파벳인지, 이미 입력한 알파벳인지, 한 글자인지 등을 검증합니다.
- 정답 확인 및 출력: 사용자가 입력한 알파벳이 정답에 포함되어 있는지 확인하고, 포함된 위치를 화면에 출력합니다. 이미 맞춘 알파벳은 정답 위치에 바로 출력되고, 아직 맞추지 않은 부분은 언더바로 표시됩니다.
- 게임 종료 조건: 사용자가 모든 알파벳을 맞추거나 9번의 시도가 초과될 때 게임을 종료합니다.
- 정답 및 맞춘 알파벳 출력: 게임이 종료되면 정답과 사용자가 맞춘 알파벳 리스트를 출력합니다.
- Scanner 객체 닫기: 사용이 끝난 Scanner 객체를 닫아 메모리 누수를 방지합니다.
'(Java)코테연습' 카테고리의 다른 글
숫자 문자열과 영단어 (0) | 2024.07.16 |
---|---|
시저암호 (1) | 2024.07.15 |
문자열끼리 크기 비교하는 경우 (0) | 2024.07.12 |
각각의 배열에서 3개의 정수 합이 0이 되어야 하는경우 (0) | 2024.07.12 |
이상한 문자 만들기 (split, toUpperCase, toLowerCase 사용) (0) | 2024.07.11 |