첫 C 프로젝트로 짰었던 행맨 (hangman) 게임이다. 

간단하게 게임을 설명하자면 A가 B몰래 영어 단어를 하나 입력하면 

그 단어의 알파벳 수 만큼 빈칸이 나오는데 

B는 그것을 참고하여 알파벳을 막 던져보며 무슨 단어인지 추론해나가는 게임이다.

 

알파벳을 틀리게 추론 할 때 마다 행맨의 몸이 머리부터 그려지고,

모든 몸이 다 그려지면 게임 실패이다.

 

행맨은   ⓞ

         ┌☆┐

         ┌┴┐

 이렇게 생겼으며 행맨이 보이는 바와 같이 생명도 7개이다.

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h> //exit함수
#include <windows.h> //system("cls"), 글자색 변경 함수
#include <string.h> //문자열세는 함수
#include <conio.h>  //getch 함수

사용 헤더파일

#define XMIDDLE 56 
#define YMIDDLE 15 //정가운데 좌표 정의
int hangman(void); //행맨 게임
void drawhang(int life); //hangman 그림 
int updown(void); //updown 게임
void CursorView(char show); //커서 숨기기위한 함수 
void gotoxy(int x, int y); //좌표
void Frame(void); //겉 프레임 

사용 함수, 변수

void drawhang(int life) {
	switch (life) {
	case 0:gotoxy(22, 9); printf("┐");
	case 1:gotoxy(18, 9); printf("┌");
	case 2:gotoxy(20, 9); printf("┴");
	case 3:gotoxy(22, 8); printf("┐");
	case 4:gotoxy(18, 8); printf("┌");
	case 5:gotoxy(20, 8); printf("☆");
	case 6:gotoxy(20, 7); printf("ⓞ");
	default:
		gotoxy(2, 2); printf("남은 생명 : %d", life);
	}
}

행맨을 그리는 함수

int hangman(void) {
	while (1) {
		char answer[100];  //답배열 
		char wrong[25] = "\0";  //오답배열
		char input; //입력
		char write[100] = { 0, }; //입력 배열
		int life = 7; //행맨 몸 부분부분 7개
		int find = 0;  //정답에 포함되는 알파벳인지 아닌지 확인
		int checked = 0;  //이미 입력했던 알파벳인지 아닌지 확인하는 변수
		int flag = 0; //check
		system("cls");
		system("title hangman game!");
		gotoxy(46, 17);
		printf("몰래 단어 입력 ! => ");
		scanf("%s", answer);
		int len = strlen(answer);  // 정답 단어의 길이

		for (int i = 0; i < len; i++) {
			write[i] = '_';  //입력배열을 '_'로 초기화
		}

		while (life > 0) {
			if (flag == 1) {
				break;
			}
			flag = 0;
			fflush(stdin);
			system("cls");
			drawhang(life);
			find = 0; // 실행할때마다 찾았는지 초기화
			gotoxy(47, 8);
			printf("정답 : ");
			for (int i = 0; i < len; i++) {
				printf("%c ", write[i]);
			}
			gotoxy(47, 10);
			printf("오답 => ");
			for (int i = 0; i < 7 - life; i++) {
				printf("%c , ", wrong[i]);
			}
			gotoxy(47, 14);
			printf("알파벳 입력 => ");
			scanf(" %c", &input);

			for (int i = 0; i < len; i++) {
				if (write[i] == input) {   // 입력한 알파벳이 이미 입력되어있으면
					printf("\n\n\n\n\t\t\t\t\t   [이미 말한 알파벳 입니다!]");
					checked = 1;		// 1 :  이미 입력한 알파벳이라는 뜻.  // 0 : 처음 입력.
					Sleep(700);
					break;
				}
				else if (answer[i] == input) { // 입력배열에 포함되지 않고(중복x), 정답배열엔 포함되었을 경우(정답)
					find = 1;  //알파벳 맞췄을때. 찾았다. find=1;
					write[i] = answer[i];  //빈칸을 알맞은 알파벳으로 바꾸기
				}
			}

			if (find == 1) { // 정답배열에 포함을 확인함.
				printf("\n\n\n\t\t\t\t\t        [딩동댕 ☆★]");
				Sleep(700);
			}
			else if (find == 0 && checked == 0) {   // 정답도 아니고, 입력배열도 아니다(중복x). // 오답배열과는 비교 해야함.
				for (int i = 0; i <= 7 - life; i++) {  // 오답배열의 내용과 입력 알파벳을 비교. 중복 확인. 
					if (wrong[i] == input) {  //오답배열에 같은 알파벳이 이미 있으면 => 이미 틀렸던 경우
						printf("\n\n\n\n\t\t\t\t\t   [이미 말한 알파벳 입니다!]");
						Sleep(700);
						find = 1;
						break;
					}
				}
				if (find == 0) {  //정답이 아니면서, 오답배열에도 기록되어있지 않은 경우. => 처음 틀린 경우
					printf("\n\n\n\n\t\t\t\t\t     [다시 생각해보세요!]");
					Sleep(700); // sleep
					wrong[7 - life] = input; //오답 배열에 잘못 입력한 알파벳 나열
					life--;
				}//오답
			}

			if (!strcmp(write, answer)) {  //모든 알파벳을 맞추면
				system("cls");
				gotoxy(46, 7);
				printf("  ㅇ     |     ㅇ");
				gotoxy(46, 8);
				printf(" ㅇ   -------   ㅇ ");
				gotoxy(46, 9);
				printf("ㅇ      /\      ㅇ");
				gotoxy(46, 10);
				printf("     _________");
				gotoxy(46, 11);
				printf("         |");
				gotoxy(46, 12);
				printf("       _____");
				gotoxy(46, 13);
				printf("           |");
				gotoxy(36, 15);
				printf("행맨이 완성되기 전에 답을 맞추셨습니다!");
				gotoxy(41, 17);
				printf("☆★ 축 하 드 립 니 다 ★☆");
				gotoxy(40, 20);
				puts("  다시하려면 y 종료하려면 n");
				while (1) {
					fflush(stdin);
					if (GetAsyncKeyState(0x59) & 0x0001) {
						getch();
						system("cls");
						flag = 1;
						break;
					}
					if (GetAsyncKeyState(0x4e) & 0x0001) {
						getch();
						return 0;
					}
					Sleep(500);
					if (GetAsyncKeyState(0x59) & 0x0001) {
						getch();
						system("cls");
						flag = 1;
						break;
					}
					if (GetAsyncKeyState(0x4e) & 0x0001) {
						getch();
						return 0;
					}
				}
			}

			if (life == 0) {     //결국 못알아내고 행맨이 다 그려지면
				system("cls");
				gotoxy(43, 10);
				printf("_______     _____   |___");
				gotoxy(43, 11);
				printf("|______     |____   |");
				gotoxy(43, 12);
				printf("|______       _______");
				gotoxy(43, 13);
				printf("   |                 |");
				gotoxy(43, 14);
				printf("___|____             |    ㅇ    ㅇ");
				gotoxy(40, 18);
				printf("    정답은 %s였습니다...", answer);
				gotoxy(38, 20);
				printf("    다시하려면 y 종료하려면 n");
				Sleep(1000);
				while (1) {
					fflush(stdin);
					if (GetAsyncKeyState(0x59) & 0x0001) {
						getch();
						system("cls");
						flag = 1;
						break;
					}
					if (GetAsyncKeyState(0x4e) & 0x0001) {
						getch();
						return 0;
					}
					Sleep(500);
					if (GetAsyncKeyState(0x59) & 0x0001) {
						getch();
						system("cls");
						flag = 1;
						break;
					}
					if (GetAsyncKeyState(0x4e) & 0x0001) {
						getch();
						return 0;
					}
				}
			}  //답을 맞추기 전에 생명 7개가 다 끝났을때
			find = 0;
			checked = 0;
		}  //생명 있는 동안 반복	
	} //게임 다시하고 싶을때를 대비하여 반복문 안에 둔다
}

행맨 게임 돌아가는 함수

void CursorView(char show) {
	HANDLE hConsole;
	CONSOLE_CURSOR_INFO ConsoleCursor;
	hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
	ConsoleCursor.bVisible = show;
	ConsoleCursor.dwSize = 1;
	SetConsoleCursorInfo(hConsole, &ConsoleCursor);  //커서숨기기
}

콘솔창 내에서 커서 숨기는 함수

void gotoxy(int x, int y)
{
	COORD Cur;
	Cur.X = x;
	Cur.Y = y;
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Cur);  //좌표
}

좌표 함수

void Frame(void) {
	printf(" +");
	for (int i = 0; i <= 108; i++)
		printf("-");
	puts("+");
	for (int i = 0; i < 29; i++) {
		printf(" |");
		gotoxy(111, i + 1);
		puts("|");
	}
	printf(" +");
	for (int i = 0; i <= 108; i++)
		printf("-");
	printf("+");
}  //프레임

게임 테두리 찍는 함수

int main() {
	while (1) {
		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 11);
		CursorView(0); //커서 숨기기 
		system("mode con cols=113 lines=31");
		system("title Menu");
		system("title Menu");
		Frame();
		gotoxy(47, 7);
		printf("★☆ GAME WORLD ☆★");
		gotoxy(47, 9);
		printf("+-----------------+"); Sleep(400);
		gotoxy(47, 10);
		printf("|  SELECT A GAME  |");  Sleep(400);
		gotoxy(47, 11);
		printf("|                 |"); Sleep(400);
		gotoxy(47, 12);
		printf("| 1 --> Hangman   |");  Sleep(400);
		gotoxy(47, 13);
		printf("+-----------------+"); Sleep(400);
		gotoxy(XMIDDLE - 8, 18);
		printf("  ESC --> EXIT");

		while (1)
		{
			if (GetAsyncKeyState(0x31) & 0x0001)
			{
				getch(); //엔터 필요없이 바로 값을 가져감
				system("cls");
				hangman();
				break;
			}
			if (GetAsyncKeyState(VK_ESCAPE) & 0x0001)
			{
				fflush(stdin);
				getch();
				system("cls");
				Frame();
				gotoxy(XMIDDLE - 8, YMIDDLE - 1);
				printf("진짜 종료할까요??");
				gotoxy(XMIDDLE - 1, YMIDDLE);
				printf("Y/N");
				while (1)
				{
					if (GetAsyncKeyState(0x59) & 0x0001) {  //'y'입력
						getch();
						system("cls");
						gotoxy(XMIDDLE - 8, YMIDDLE - 1);
						printf("bye bye ~ ☆ ★\n\n\n\n\n\n\n");
						exit(0);

					}
					if (GetAsyncKeyState(0x4E) & 0x0001) {  //'n'입력
						getch();
						main();
					}
				}
			}
		}
	}
}

메인 함수

+ Recent posts