• 빈칸으로 구성된 문자열이 주어지고 사용자는 문자열에 들어갈 글자들을 하나씩 추측해서 맞추는 게임.
• 사용자가 문자열에 들어 있는 글자를 정확하게 입력했으면 화면에 그 글자를 출력.
• 단이 5개, 숙어 5개 중 렌덤으로 출제.
• 오답 횟수 제한.
문자열을 입력하시오: ___ _ ____
글자를 추측하시오: A
문자열을 입력하시오: ___ A ____
글자를 추측하시오: E
문자열을 입력하시오: _E_ A __E_
...
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <ctype.h> // isalpha 함수 사용을 위해 포함
#define MAX_ATTEMPTS 5 // 최대 시도 횟수
const char* generateRandomWordsAndIdioms();
void transformToUnderscore(const char *words_and_idioms, char *transformed_to_underscore);
void runHangmanGame(const char *words_and_idioms, char *transformed_to_underscore);
int main(void){
const char *word_or_idiom = NULL; // 빈 포인터 배열 초기화
char transformed_to_underscore[100];
// 함수 호출
word_or_idiom = generateRandomWordsAndIdioms(); // 단어/숙제 랜덤으로 출제된 문자열 반환받기
transformToUnderscore(word_or_idiom, transformed_to_underscore); // 변환된 문자열 반환받기
// 게임
runHangmanGame(word_or_idiom, transformed_to_underscore);
return 0;
}
// 랜덤으로 단어 또는 숙어를 선택하여 반환하는 함수
const char* generateRandomWordsAndIdioms(){
int random_num;
const char *words_and_idioms[] = {"apple", "book", "cat", "dog", "serendipity", "break the ice", "burn the midnight oil", "hit the nail on the head", "a blessing in disguis", "bite the bullet"};
srand((unsigned int)time(NULL)); // 랜덤 시드 설정
random_num = (rand() % 10) + 1; // 1부터 10 사이의 랜덤 숫자 생성
return words_and_idioms[random_num];
}
// 단어/숙어를 '_ '로 변환하여 숨기는 함수
void transformToUnderscore(const char *word_or_idiom, char *transformed_to_underscore){
int i;
// 단어/숙어를 '_'와 공백으로 변환
for(i = 0; word_or_idiom[i] != '\0'; ++i){
if(isalpha(word_or_idiom[i])){ // words_and_idioms에 글자가 알파벳이면
transformed_to_underscore[i] = '_';
}
else {
transformed_to_underscore[i] = word_or_idiom[i]; // 공백이나 다른 문자는 그대로 유지
}
}
transformed_to_underscore[i] = '\0'; // 문자열 끝에 널 문자 추가
}
// 게임 실행하는 함수
void runHangmanGame(const char *word_or_idiom, char *transformed_to_underscore){
int remaining_attempts = MAX_ATTEMPTS; // 남은 시도 횟수
int i;
char ch;
// 게임 루프
while(remaining_attempts > 0){
printf("문자열을 입력하시오: %s\n", transformed_to_underscore);
printf("글자를 추측하시오: ");
ch = getchar(); // 사용자로부터 문자 입력받음
getchar(); // newline 문자를 처리하기 위해 추가
int correct_guess = 0; // 사용자가 입력한 글자가 맞았는지를 추적하는 플래그 변수로 초기값은 0(틀림)
for(i = 0; word_or_idiom[i] != '\0'; i++){
if(word_or_idiom[i] == ch && transformed_to_underscore[i] != ch){ // 글자 맞춤
transformed_to_underscore[i] = ch;
correct_guess = 1; // 맞춘 경우 correct_guess 플래그 설정
}
}
// 틀린 경우
if (correct_guess == 0) {
remaining_attempts--; // 시도 횟수 감소
printf("오답입니다. 남은 횟수는 %d입니다.\n", remaining_attempts);
}
// 모든 글자를 맞췄는지 확인
int is_complete = 1; // 단어/숙어를 다 맞췄는지 확인하는 플래그
for(i=0; word_or_idiom[i] != '\0'; i++){
if(word_or_idiom[i] != transformed_to_underscore[i]){
is_complete = 0;
break;
}
}
if(is_complete){
printf("정답입니다: %s\n", transformed_to_underscore);
break; // 게임 종료
}
// 남은 시도 횟수가 0이면 게임 종료
if(remaining_attempts == 0){
printf("남은 횟수가 없습니다. 정답은 %s입니다.\n", word_or_idiom);
break; // 게임 종료
}
}
}