첫 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();
}
}
}
}
}
}
메인 함수