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

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

꾸준함. 2017. 11. 20. 23:33

[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("행의 숫자를 입력하고 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, user3, row1, row2, row3, col1, col2, col3;

        int sel;

        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 (n % 2)

        {

               printf("세번째 숫자를 입력 원하면 1 입력(아니면 0): ");

               scanf("%d", &sel);

               if (sel)

               {

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

                       scanf("%d", &user3);

                       row3 = user3 / n;

                       col3 = user3 % n;

               }

        }

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

        {

               if (question[row1][col1] == question[row3][col3])

               {

                       *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(3 + 4 * col3, 2 + 2 * row3);

                       printf("%2c", question[row3][col3]);

                       gotoxy(2, 18);

                       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 * col3, 2 + 2 * row3);

                       printf("%2c", question[row3][col3]);

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

                       printf("%2d", user1);

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

                       printf("%2d", user2);

                       gotoxy(3 + 4 * col3, 2 + 2 * row3);

                       printf("%2d", user3);

                       gotoxy(2, 18);

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

                       getch();

                       clear_text();

               }

        }

        else 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, 18);

               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, 18);

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

               getch();

               clear_text();

        }

}

 

/*

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

*/

void clear_text(void)

{

        for (int i = 14; i < 19; 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

                       {

                              if (n % 2 && i == n - 1 && j== n - 1)

                              {

                                      int random = rand() % n;

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

                              }

                              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]);

               }

        }

}


[2번]

/*

응용 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;

        gotoxy(28, 4);

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

        for (int i = 0; i < (n*n/2); i++)

        {

               if (i < (n*n / 4))

                       gotoxy(28 + (4 * i), 5);

               else

                       gotoxy(28 + (4 * (i-(n*n/4))), 6);

               printf("%c", (char)('A' + i));

        }

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

        {

               *count = *count + 1;

               gotoxy(28, 4);

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

               if((int)question[row1][col1] - 65<(n*n/4))

                       gotoxy(30 + 4 * ((int)question[row1][col1] - 65), 5);

               else

                       gotoxy(30 + 4 * ((int)question[row1][col1] - 65 - (n*n / 4)), 6);

               printf("O");

               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]);

               }

        }

}


[3번]

/*

응용 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++)

        {

               int sel = rand() % 3;

               if (sel == 0)

                       chr1[i] = 65 + i;

               else if (sel == 1)

                       chr1[i] = 48 + i;

               else

                       chr1[i] = 33 + 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]);

               }

        }

}


[5번]

/*

응용 11.3.1에서 정답화면은 약 5초간 사용자에게 표시됩니다.

게임의 난이도(, , )를 입력 받도록 하여 정답 화면이 보여지는 시간을 제어할 수 있도록 수정하시오

*/

#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])

{

        int level;

        gotoxy(2, 14);

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

        gotoxy(2, 15);

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

        gotoxy(2, 16);

        printf("난이도를 정하시오(:0, :1, :2) >");

        scanf("%d", &level);

        gotoxy(2, 17);

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

        getch();

        clear_text();

        make_question(n, question);

        gotoxy(2, 14);

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

        gotoxy(2, 15);

        if (level == 0)

        {

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

               Sleep(3000);

        }

        else if (level == 1)

        {

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

               Sleep(5000);

        }

        else

        {

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

               Sleep(7000);

        }

        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]);

               }

        }

}

[6번]

/*

격자판에 표시된 숫자나 문자 중에서 특정한 숫자나 문자가 몇개인가를 제한 시간 내에 맞히는 게임 프로그램을 작성하시오

*/

#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 alphabet_display(char **arr, int n);

int create_alphabet(char **arr, int n);

void display_rule(int n);

 

int main(void)

{

        int n, answer = -1;

        char **arr;

        long pst, seconds, minutes;

        clock_t start, end;

 

        srand((unsigned)time(NULL));

        n = intro_game();

        system("cls");

        arr = (char**)malloc(sizeof(char*)*n);

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

               arr[i] = (char*)malloc(sizeof(char)*n);

        display_rule(n);

        int result=create_alphabet(arr, n);

        start = clock();

        draw_check02(n, n);

        alphabet_display(arr, n);

        do

        {

               end = clock();

               gotoxy(2, 14);

               printf("'b'의 갯수는? ");

               if (kbhit())

               {

                       scanf("%d", &answer);

               }

               pst = (end - start) / CLK_TCK;

        } while (answer == -1 && pst < 2*n);

        gotoxy(2, 18);

        if (answer == -1)

               printf("시간 초과!");

        else

        {

               if (answer == result)

               {

                       printf("맞았습니다\n");

                       minutes = pst / 60;

                       seconds = pst - minutes * 60;

                       gotoxy(2, 19);

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

               }

               else

               {

                       printf("틀렸습니다. 답은 %d입니다", result);

               }

        }

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

               free(arr[i]);

        free(arr);

        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("행의 숫자를 입력하고 Enter> ");

        scanf("%d", &n);

        return n;

}

 

/*

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

*/

void display_rule(int n)

{

        system("cls");

        printf("격자모양에는 'b' 'd'가 있습니다.\n");

        printf("%d초안에 'b'의 갯수를 맞추시오\n", 2*n);

        printf("아무키나 누르면 게임이 시작됩니다. \n");

        getch();

        system("cls");

}

 

/*

문자를 생성하는 함수

*/

int create_alphabet(char **arr, int n)

{

        int count = 0;

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

        {

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

               {

                       int random = rand() % 2;

                       if (random)

                       {

                              arr[i][j] = 'b';

                              count++;

                       }

                       else

                              arr[i][j] = 'd';

               }

        }

        return count;

}

 

/*

숫자를 출력하는 함수 number_display

*/

void alphabet_display(char **arr, int n)

{

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

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

               {

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

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

               }

}

 


개발환경:Visual Studio 2017


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


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

반응형