ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C언어로 만든 간단한 행맨 게임
    C언어 기초/C언어 연습 2021. 11. 6. 01:27
    /*
     * 행맨 게임
     * 2021-11-06
    */
    
    
    #include <stdio.h>
    #include <Windows.h>
    #include <stdbool.h>
    #include <time.h>
    #include <string.h>
    
    
    /*
     * Define
     */
    #define HANGMAN 20
    #define ANSWER_WIDTH 70
    #define MAX 1000
    
    /*
     * 함수 선언
     */
    // 커서 이동 함수
    void gotoxy(int x, int y);
    
    // 기본 배경(처형대, 밑줄 등) 출력 함수
    void Background();
    
    // 답 입력받기
    void Answer();
    
    // 행맨 몸 관리 함수
    void Body(int* bodyCount);
    
    // 글자 대조 함수
    int Compare(char take);
    
    // 글자 맞췄을 때 함수
    void Correct(int len_ptr, char take);
    
    
    /*
     * 변수 선언
     */
    char answer[MAX];   // 답 받는 변수
    char player[MAX];   // 맞춘 답 저장 변수
    int count = 0;      // 답 글자 수
    int body = 0;
    int* bodyCount = &body;  // 행맨 몸 count에 쓰일 변수
    int success = 0;   // 성공 횟수
    char already;   // 이미 맞춘 문자인지 확인하기 위한 변수
    
    
    
    
    int main() {
    	// 정답 입력받고 문자 개수만큼 칸 출력
    	Answer();
    	// 기본 필드 출력(처형대, 답 칸)
    	Background();
    
    	gotoxy(0, 1);
    	printf("영문자를 하나씩 입력하여 정답을 맞춰보세요. \n");
    
    	// 게임 시작
    	char take;
    	while(1) {
    		gotoxy(0, 2);
    		scanf_s("%c", &take, 1);
    		rewind(stdin);   // 입력 버퍼 비우기
    		Compare(take);
    		
    
    		// 정답 맞췄을 때
    		if (success == (count - 1)) {
    			gotoxy(0, HANGMAN + 3);
    			printf("정답을 맞췄습니다!\n");
    			printf("3초 뒤 게임을 종료합니다.\n");
    			Sleep(3000);
    			printf("Bye~\n");
    			exit(0);
    		}
    		else if (*bodyCount > 6)
    		{
    			gotoxy(0, HANGMAN + 3);
    			printf("게임 실패! 다음에 다시 도전하세요~");
    			break;
    		}
    	}
    	return 0;
    }
    
    void gotoxy(int x, int y) {
    	COORD Pos;
    	Pos.X = x;
    	Pos.Y = y;
    	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);
    }
    
    void Background() {
    	gotoxy(HANGMAN, 3);
    	printf("\n");
    	printf("    _______________ \n");
    	printf("   ||              |\n");
    	printf("   ||              |\n");
    	printf("   ||              |\n");
    	printf("   ||               \n");
    	printf("   ||               \n");
    	printf("   ||               \n");
    	printf("   ||               \n");
    	printf("   ||               \n");
    	printf("   ||               \n");
    	printf("   ||               \n");
    	printf("   ||               \n");
    	printf("   ||               \n");
    	printf("   ||               \n");
    	printf("   ||               \n");
    	printf("   ||               \n");
    	printf("   ||               \n");
    	printf("   ||               \n");
    	printf("ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ\n");
    
    	int i = 0;
    	while (answer[i] != 0) {
    		if (answer[i] == NULL)
    			count--;
    		count++;
    		i++;
    	}
    
    	gotoxy(ANSWER_WIDTH, 23);
    	for (int k = 0; k < count-1; k++)
    		printf("_");
    	Sleep(500);
    }
    
    void Answer()
    {
    	printf("생각한 단어를 입력하세요: \n");
    	fgets(answer, MAX, stdin);
    	rewind(stdin);
    	system("cls");
    }
    
    int Compare(char take)
    {
    	// 맞췄을 때
    	char* ptr = strchr(answer, take);
    
    	already = strchr(player, take);
    	if (ptr != NULL) {
    		if (already == NULL) {
    			success += 1;
    			Correct(strlen(ptr), take);
    			return 1;
    		}
    		else
    		{
    			printf("이미 맞춘 문자입니다\n");
    			return 1;
    		}
    	}
    	else
    	{
    		// 틀렸을 때
    		printf("틀렸습니다!");
    		*bodyCount += 1;
    		gotoxy(ANSWER_WIDTH + (*bodyCount), 5);
    		printf("%c", take);   // 틀린 문자 출력
    		// Body 함수 호출
    		Body(bodyCount);
    		return 0;
    	}
    }
    
    
    void Body(int* bodyCount) {
    	// case만들어서 bodyCount이용 -> 몸 늘리기
    	switch (*bodyCount) {
    	case 1:
    		gotoxy(HANGMAN - 1, 8);
    		printf("O");
    		break;
    	case 2:
    		gotoxy(HANGMAN - 1, 9);
    		printf("I");
    		break;
    	case 3:
    		gotoxy(HANGMAN - 2, 10);
    		printf("\ ");
    		break;
    	case 4:
    		gotoxy(HANGMAN, 10);
    		printf("/");
    		break;
    	case 5:
    		gotoxy(HANGMAN - 2, 11);
    		printf("/");
    		break;
    	case 6:
    		gotoxy(HANGMAN, 11);
    		printf("\");
    		break;
    	default:
    		break;
    	}
    }
    
    void Correct(int len_ptr, char take)
    {
    	int location_a = count - len_ptr;   // 전체 문자열 길이 - ptr길이
    	printf("맞췄습니다!");
    	gotoxy(ANSWER_WIDTH + location_a, HANGMAN + 3);
    	player[location_a] = take;
    	printf("%c", take);
    }

    c언어를 공부한 것을 활용해보고자 행맨게임을 만들어 보았습니다.

    콘솔창에서 실행되기 때문에 부족한 부분이 많습니다. 후에 다른 언어들도 공부한 후, 더 완성도 높은

    프로그램을 만들어보겠습니다.

Designed by Tistory.