C/명품 C언어 프로젝트(안기수 저)

명품 C언어 프로젝트 11.3장 같은 문자 찾는 게임

꾸준함. 2017. 11. 18. 00:58

[응용 11.3.1]

/*

같은 문자를 찾는 게임 프로그램

*/

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

#include <time.h>

#include <Windows.h>

 

int intro_game(void);

void draw_check02(int r, int c);

void gotoxy(int x, int y);

void number_display(int n);

void display_rule(int n, char question[][10]);

void make_question(int n, char question[][10]);

void game_control(char question[][10], int n, int *count);

void clear_text(void);

 

int main(void)

{

        int n, count = 0;

        char question[10][10] = { 0 };

        char answer[10][10] = { 0 };

        long pst, seconds, minutes;

        clock_t start, end;

 

        srand((unsigned)time(NULL));

        n = intro_game();

        system("cls");

        draw_check02(n, n);

        number_display(n);

        display_rule(n, question);

        number_display(n);

        start = clock();

        do

        {

               game_control(question, n, &count);

        } while (count < n*n / 2);

        gotoxy(2, 18);

        printf("모두 맞았습니다. 종료합니다. \n");

        end = clock();

        pst = (end - start) / CLK_TCK;

        minutes = pst / 60;

        seconds = pst - minutes * 60;

        gotoxy(2, 19);

        printf("경과시간: %ld %ld\n", minutes, seconds);

        return 0;

}

 

void gotoxy(int x, int y)

{

        COORD Pos = { x - 1, y - 1 };

        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);

}

 

/*

확장된 바둑판 그리기 함수 draw_check02

*/

void draw_check02(int c, int r)

{

        int i, j;

        unsigned char a = 0xa6;

        unsigned char b[12];

        for (i = 1; i < 12; i++)

               b[i] = 0xa0 + i;

        printf("%c%c", a, b[3]);

        for (i = 0; i < c - 1; i++)

        {

               printf("%c%c", a, b[1]);

               printf("%c%c", a, b[8]);

        }

        printf("%c%c", a, b[1]);

        printf("%c%c", a, b[4]);

        printf("\n");

        for (i = 0; i < r - 1; i++)

        {

               printf("%c%c", a, b[2]);

               for (j = 0; j < c; j++)

               {

                       printf("  ");

                       printf("%c%c", a, b[2]);

               }

               printf("\n");

               printf("%c%c", a, b[7]);

               for (j = 0; j < c - 1; j++)

               {

                       printf("%c%c", a, b[1]);

                       printf("%c%c", a, b[11]);

               }

               printf("%c%c", a, b[1]);

               printf("%c%c", a, b[9]);

               printf("\n");

        }

        printf("%c%c", a, b[2]);

        for (j = 0; j < c; j++)

        {

               printf("  ");

               printf("%c%c", a, b[2]);

        }

        printf("\n");

        printf("%c%c", a, b[6]);

        for (i = 0; i < c - 1; i++)

        {

               printf("%c%c", a, b[1]);

               printf("%c%c", a, b[10]);

        }

        printf("%c%c", a, b[1]);

        printf("%c%c", a, b[5]);

        printf("\n");

}

 

/*

게임 설명과 격자판의 크기를 입력받는 함수 intro_game

*/

int intro_game(void)

{

        int n;

        system("cls");

        printf("문자 퍼즐 맞추기\n\n");

        printf("격자모양의 판에 숨겨진 두 개의 문자를 찾는 \n");

        printf("게임입니다. \n\n");

        printf("행의 숫자(4 또는 6)를 입력하고 Enter> ");

        scanf("%d", &n);

        return n;

}

 

/*

게임의 규칙을 출력하는 함수 display_rule

*/

void display_rule(int n, char question[][10])

{

        gotoxy(2, 14);

        printf("위와 같은 격자모양의 숫자 뒤에는 \n");

        gotoxy(2, 15);

        printf("같은 모양의 문자가 두개씩 숨어 있습니다. \n");

        gotoxy(2, 16);

        printf("아무키나 누르면 정답화면이 잠시 나타납니다. \n");

        getch();

        clear_text();

        make_question(n, question);

        gotoxy(2, 14);

        printf("정답화면은 위와 같습니다. \n");

        gotoxy(2, 15);

        printf("5초 뒤에 문제 풀이를 시작합니다.\n");

        Sleep(5000);

        clear_text();

}

 

/*

같은 문자를 찾는 게임을 제어하는 함수 game_control

*/

void game_control(char question[][10], int n, int *count)

{

        int user1, user2, row1, row2, col1, col2;

        gotoxy(2, 14);

        printf("첫번째 숫자를 입력하고 Enter> ");

        scanf("%d", &user1);

        row1 = user1 / n;

        col1 = user1%n;

        printf("두번째 숫자를 입력하고 Enter> ");

        scanf("%d", &user2);

        row2 = user2 / n;

        col2 = user2%n;

        if (question[row1][col1] == question[row2][col2])

        {

               *count = *count + 1;

               gotoxy(28, 4);

               printf("맞은 개수:%2d( %2d)", *count, n * 2);

               gotoxy(3 + 4 * col1, 2 + 2 * row1);

               printf("%2c", question[row1][col1]);

               gotoxy(3 + 4 * col2, 2 + 2 * row2);

               printf("%2c", question[row2][col2]);

               gotoxy(2, 16);

               printf("맞았습니다. 아무키나 누르면 다시 시작합니다. ");

               getch();

               clear_text();

        }

        else

        {

               gotoxy(3 + 4 * col1, 2 + 2 * row1);

               printf("%2c", question[row1][col1]);

               gotoxy(3 + 4 * col2, 2 + 2 * row2);

               printf("%2c", question[row2][col2]);

               Sleep(3000);

               gotoxy(3 + 4 * col1, 2 + 2 * row1);

               printf("%2d", user1);

               gotoxy(3 + 4 * col2, 2 + 2 * row2);

               printf("%2d", user2);

               gotoxy(2, 16);

               printf("틀렸습니다. 아무키나 누르면 시작합니다. ");

               getch();

               clear_text();

        }

}

 

/*

화면의 내용을 지우는 함수 clear_text

*/

void clear_text(void)

{

        for (int i = 14; i < 17; i++)

        {

               gotoxy(2, i);

               for (int j = 0; j < 50; j++)

                       printf(" ");

        }

}

 

/*

숫자를 출력하는 함수 number_display

*/

void number_display(int n)

{

        int count = 0;

        for (int i = 0; i<n; i++)

               for (int j = 0; j < n; j++)

               {

                       gotoxy(3 + 4 * j, 2 + 2 * i);

                       printf("%2d", count);

                       count++;

               }

}

 

/*

문제를 생성하는 make_question

*/

void make_question(int n, char question[][10])

{

        int number, ran, count1 = 0, count2 = 0;

        char chr1[26], chr2[26], temp;

        srand((unsigned)time(NULL));

        number = n*n / 2;

        for (int i = 0; i < 26; i++)

        {

               chr1[i] = 65 + i;

               chr2[i] = i;

        }

        for (int i = 0; i < number; i++)

        {

               ran = rand() % number;

               temp = chr1[i];

               chr1[i] = chr1[ran];

               chr1[ran] = temp;

        }

        for (int i = 0; i < number; i++)

        {

               ran = rand() % number;

               temp = chr2[i];

               chr2[i] = chr2[ran];

               chr2[ran] = temp;

        }

        for (int i = 0; i < n; i++)

        {

               for (int j = 0; j < n; j++)

               {

                       if (count1 < number)

                       {

                              question[i][j] = chr1[count1];

                              count1++;

                       }

                       //한 쌍이 필요하므로

                       else

                       {

                              question[i][j] = chr1[chr2[count2]];

                              count2++;

                       }

               }

        }

        for (int i = 0; i < n; i++)

        {

               for (int j = 0; j < n; j++)

               {

                       gotoxy(3 + 4 * j, 2 + 2 * i);

                       printf("%2c", question[i][j]);

               }

        }

}


개발환경:Visual Studio 2017


지적, 조언, 질문 환영입니다! 댓글 남겨주세요~


[참고] 명품 C언어 프로젝트 안기수 저

반응형