문제

  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. 영단어 목록을 String 타입 배열 `words`에 저장
  2. Random()을 사용해서 임의의 영단어 하나를 String 타입 변수 `correctWord`에 저장
  3. length()로 문자열의 길이를 구해서 길이만큼 언더바 출력
  4. 반복문
    • `inputLetter`가 2글자 이상 입력인 경우 try-catch문으로 예외 처리
      • try -> Scanner로 char 타입 문자 입력받아서 char 타입 변수 `inputLetter`에 저장
      • catch -> 잘못된 입력 안내 후 continue
    • 조건문
      • Charactor.isLetter()로 알파벳 입력인지 확인 후 알파벳이 아니면 continue
      • `inputLetterLog`에 이미 존재하는 문자인지 반복하면서 확인 후, 이미 존재하면 continue
      • else -> char 타입 배열 `inputLetterLog`에 저장 
    • `correctWord`와 `inputLetter`을 charAt으로 반복하면서 확인
      • 동일한 문자가 있는 위치는 해당 문자 출력 / 그 외의 문자는 언더바 출력
      • 동일한 문자가 없으면 count++
    • count가 9인 경우 Game Over 출력 후 break

변경 사항

1. Scanner 객체는 char 타입으로 입력 ❌

`scanner.next().charAt(0)`으로 코드를 작성하면 문자열로 입력받아도 결과적으로 한 글자만 입력받은 것처럼 사용할 수 있다.

하지만 문제 자체가 한 글자가 아닌 경우 다시 입력받도록 하는 시스템이기 때문에, 문자열로 입력받고 조건문을 추가해야겠다.

 

2. inputLetterLog에 이미 존재하는 문자인지 확인 후 continue 대신 flag 사용

문자를 맞히기 위한 반복문 안에서 inputLetter와 inputLetterLog를 순서대로 비교하는 반복문을 중첩으로 사용했다.

중첩된 반복문 안에서 continue를 사용하면 inputLetterLog의 다음 인덱스로 넘어가는 로직이 되기 때문에, 내 의도대로 다음 입력을 받기 위한 continue가 될 수 없다. 

따라서 inputLetterLog와 inputLetter의 데이터 중복 여부를 알 수 있는 flag를 만들고, 이 flag값을 조건으로 줘서 입력값을 inputLetterLog에 저장하도록 수정하자.

 

3. 시도 횟수를 나타내는 count 변수를 반복을 진행하면서 증가시키는 대신 감소시키기

처음 초기화할 때 가능한 시도 횟수를 지정해주는 게, 추후 시도 횟수를 변경하는 상황에서 수정이 편리할 것 같다.

 

4. underBarCnt , letterCnt 변수 추가

`correctWord`의 어떤 위치에도 `inputLetter`값이 없는 상황을 판단하기 위해

`correctWord`와 `inputLetter`을 charAt으로 반복하는 과정에서, 언더바를 출력할 때 변수 `underBarCnt`를 증가시킨다.

그리고 `correctWord`의 문자열 길이와 `underBarCnt`가 같으면 시도 횟수를 증가시킨다.

 

정답을 맞힌 경우 시스템을 종료하기 위해

`correctWord`와 `inputLetter`을 charAt으로 반복하는 과정에서, 문자를 출력할 때 변수 `letterCnt`를 증가시킨다.

 

5. count 변수명을 tryCount로 변경

underBarCnt와의 혼동 방지

 

6. 정답을 맞힌 경우 시스템을 종료하는 코드 추가

모든 인덱스의 문자를 맞혀도 계속 진행되는 논리적 오류 발생

추가한 `letterCnt` 변수의 값이 정답 문자열의 길이와 같으면 종료하는 코드를 추가하자

 


최종 실행 과정

1. 영단어 목록을 String 타입 배열 `words`에 저장

2. Random()을 사용해서 임의의 영단어 하나를 String 타입 변수 `correctWord`에 저장

Random random = new Random();
String correctWord = words[random.nextInt(15)];

 

 

3. length()로 문자열의 길이를 구해서 길이만큼 언더바 출력

for (int i = 0; i < correctWord.length(); i++) {
        System.out.print("_");
}

 

4. 반복문 

  •  조건문
    • `inputLetter`가 2글자 이상 입력인 경우 continue
    • Charactor.isLetter()로 알파벳 입력인지 확인 후 알파벳이 아니면 continue
    • `inputLetterLog`에 이미 존재하는 문자인지 반복하면서 확인 후, 이미 존재하면 디폴트가 false였던 `isDuplicate` 변수를 true로 변경
    • `isDuplicate`가 false인 상황에서만 `inputLetterLog`에 입력값 저장 
String inputLetter = scanner.next();

// 입력값이 한 글자가 아니면 다시 입력
if (inputLetter.length() != 1) {
	continue;
}

// 입력값이 알파벳이 아니면 다시 입력
if (!Character.isLetter(inputLetter.charAt(0))) {
	continue;
}

boolean isDuplicate = false;

// 입력값이 inputLetterLog에 있는지 확인
for (String string : inputLetterLog) {
	if (string.equals(inputLetter)) {
		isDuplicate = true;
	}
}

// 이전에 입력하지 않은 값만 저장
if(!isDuplicate){
	inputLetterLog.add(inputLetter);
}
  • `correctWord`와 `inputLetter`을 charAt으로 반복하면서 확인
    • 동일한 문자가 있는 위치는 해당 문자 출력
    • 그 외의 문자는 언더바 출력 후 underBarCnt++
    • `correctWord`의 길이와 `underBarCnt`가 같으면(어떤 위치에도 입력한 문자가 없으면) tryCount--
for(int i=0; i<correctWord.length();i++){
	if(correctWord.charAt(i)==inputLetter.charAt(0)){
		System.out.print(inputLetter);
		letterCnt++;
	}
	else{
		System.out.print("_");
		underBarCnt++;
		if(correctWord.length()==underBarCnt){
			tryCount--;
		}
	}
}
  • `tryCount`가 0인 경우 "Game Over" 출력 후 break
// tryCount가 0인 경우 Game Over
if(tryCount==0){
	System.out.println("\nGame over!");
	break;
}
  • `letterCnt`가 `correctWord`의 길이와 값이 같은 경우 "You are win"과 `correctWord` 출력 후 break
// correctWord의 모든 인덱스를 맞힌 경우 시스템 종료
if(correctWord.length()==letterCnt){
	System.out.println("\n" + correctWord);
    System.out.println("You are win!");
    break;
}

결과

 

 

☝️ if문 조건식의 반환값이 boolean인 경우
값이 true면 `!true`가 돼서 실행 X 
값이 false면 `!false`, 즉 `true`가 돼서 실행 O

☝️ Character.isLetter(char)
값이 문자면 true
문자가 아니면 false 반환