HANGMAN : C Lang.

m_ngyeong·2024년 11월 10일
0

C language example

목록 보기
1/2

HANGMAN(행맨)

🔫 문제 :

• 빈칸으로 구성된 문자열이 주어지고 사용자는 문자열에 들어갈 글자들을 하나씩 추측해서 맞추는 게임.
• 사용자가 문자열에 들어 있는 글자를 정확하게 입력했으면 화면에 그 글자를 출력.
• 단이 5개, 숙어 5개 중 렌덤으로 출제.
• 오답 횟수 제한.

예시)

문자열을 입력하시오: ___ _ ____
글자를 추측하시오: A
문자열을 입력하시오: ___ A ____
글자를 추측하시오: E
문자열을 입력하시오: _E_ A __E_
...

🔫 풀이:

main()

#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;
}

generateRandomWordsAndIdioms()

// 랜덤으로 단어 또는 숙어를 선택하여 반환하는 함수
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];
}

transformToUnderscore()

// 단어/숙어를 '_ '로 변환하여 숨기는 함수
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'; // 문자열 끝에 널 문자 추가
}

runHangmanGame()

// 게임 실행하는 함수
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; // 게임 종료
        }
    }
}
profile
사용자 경험 향상과 지속적인 성장을 추구하는 프론트엔드 개발자 ʚȉɞ

0개의 댓글