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

명품 C언어 프로젝트 8.7장 보물찾기 프로그램 응용

꾸준함. 2017. 9. 8. 23:12

[2번 문제]

/*

여러개의 다양한 보물을 설정하여 각각의 보물을 찾는데

경과한 시간에 대해 가산점을 부여하도록 프로그램을 수정하시오

*/

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

#include <Windows.h>

#include <time.h>

 

void display_rule(void);

void basic_map(void);

void display_map(int matrix[][11], int tx[], int ty[]);

void make_treasure(int tx[], int ty[]);

void move_arrow_key(char key, int *x1, int *y1, int x_b, int y_b);

void game_control(int tx[], int ty[]);

void print_score(void);

void gotoxy(int x, int y);

 

int score = 0; //가산점

 

int main(void)

{

        int tx[2], ty[2];

        int matrix[11][11] = { 0 };

        clock_t start, end;

        double pst;

        srand((unsigned)time(NULL));

        make_treasure(tx, ty);

        display_rule();

        start = clock();

        system("cls");

        game_control(tx, ty);

        end = clock();

        pst = (double)(end - start) / CLK_TCK; //시간 재기

        gotoxy(1, 17);

        printf("경과시간:%.1f", pst);

        gotoxy(1, 18);

        printf("모두 찾았습니다. 게임을 종료합니다. \n");

        getch();

        return 0;

}

 

void gotoxy(int x, int y)

{

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

        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);

}

 

/*

함수 mvoe_arrow_key

*/

void move_arrow_key(char key, int *x1, int *y1, int x_b, int y_b)

{

        switch (key)

        {

        case 72:

               *y1 = *y1 - 1; //위쪽 방향의 화살표 키 입력

               if (*y1 < 1)

                       *y1 = 1;

               break;

        case 75:

               *x1 = *x1 - 2; //왼쪽 방향의 화살표 키 입력

               if (*x1 < 1)

                       *x1 = 1;

               break;

        case 77:

               *x1 = *x1 + 2; //오른쪽 방향의 화살표 키 입력

               if (*x1 > x_b)

                       *x1 = x_b;

               break;

        case 80:

               *y1 = *y1 + 1; //아래쪽 방향의 화살표 키 입력

               if (*y1 > y_b)

                       *y1 = y_b;

               break;

        default:

               return;

        }

}

 

/*

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

*/

void display_rule(void)

{

        gotoxy(1, 1);

        printf("보물찾기");

        gotoxy(1, 3);

        printf("아래의 바둑판 모양의 격자에는 보물이 \n");

        gotoxy(1, 4);

        printf("숨겨져 있습니다.\n");

        gotoxy(1, 5);

        printf("화살표(↑↓←→) 키를 움직여서 찾습니다.\n");

        gotoxy(1, 7);

        printf("점수 계산법");

        gotoxy(1, 8);

        printf("각 보물당: 100-(보물을 찾는데 걸린 시간)");

        gotoxy(1, 9);

        printf("빨리 찾을 수록 점수가 높다");

        gotoxy(1, 10);

        basic_map();

        printf("아무키나 누르면 시작합니다.\n");

        getch();

}

 

/*

기본 지도를 출력하는 함수 basic_map

*/

void basic_map(void)

{

        int i, j;

        for (i = 0; i<10; i++)

        {

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

                       printf("");

               printf("\n");

        }

}

 

/*

보물의 위치를 결정하는 함수 make_treasure

*/

void make_treasure(int tx[], int ty[])

{

        int i;

        for (i = 0; i < 2; i++)

        {

               do

               {

                       tx[i] = rand() % 11; //보물의 x 좌표

                       ty[i] = rand() % 11; //보물의 y 좌표

               } while ((tx[i] <= 1) || (ty[i] <= 1));

        }

}

 

/*

현재의 지도 상태를 출력하는 함수 display_map

*/

void display_map(int matrix[][11], int tx[], int ty[])

{

        int i, j;

        basic_map();

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

               for (j = 1; j <= 10; j++)

                       if (matrix[i][j] == 1)

                       {

                              gotoxy(2 * i - 1, j);

                              printf("");

                       }

                       else if (matrix[i][j] == 2)

                       {

                              gotoxy(2 * i - 1, j);

                              printf("");

                       }

                       else if (matrix[i][j] == 3)

                       {

                              gotoxy(2 * i - 1, j);

                              printf("");

                       }

}

 

/*

보물찾기 게임을 제어하는 함수 game_control

*/

void game_control(int tx[], int ty[])

{

        char key; //화살표

        double pst1, pst2; //시간 재기용

        clock_t start, end;

        int i, j, count = 0;

        int first = 0, find2=0, find3=0; //먼저 찾은 보물 표시용, 한번 찾았으면 시간계산안하도록

        int x = 1, y = 1;

        int matrix[11][11] = { 0 };

        start = clock();

        do

        {

               gotoxy(x, y);

               printf("");

               matrix[(x + 1) / 2][y] = 1; //밟았다고 표시

 

               for (i = 0; i < 2; i++)

                       if ((x + 1) / 2 == tx[i] && (y == ty[i]) && i == 0)

                              matrix[(x + 1) / 2][y] = 2; //보물 위치 표시

                       else if ((x + 1) / 2 == tx[i] && (y == ty[i]) && i == 1)

                              matrix[(x + 1) / 2][y] = 3;

 

               gotoxy(1, 1);

               display_map(matrix, tx, ty); //지도를 바꾼다

 

               count = 0;

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

                       for (j = 1; j <= 10; j++)

                              if (matrix[i][j] == 2)

                              {

                                      count++;

                                      if (!find2)

                                      {

                                              end = clock();

                                              gotoxy(1, 13);

                                              pst1 = (double)(end - start) / CLK_TCK; //시간 재기

                                              if (first == 0) //처음 찾은거면

                                              {

                                                     printf("★ 찾는데 걸린시간:%.1f", pst1);

                                                     score += 100 - (int)pst1;

                                              }

                                              else

                                              {

                                                     printf("★ 찾는데 걸린시간:%.1f", pst1 + pst2);

                                                     score += 100 - (int)pst2 - (int)pst1;

                                              }

                                              matrix[i][j] == 1; //count가 안늘어나게 1로 바꾼다

                                              first = 2;

                                              start = clock();

                                      }

                                      find2++;

                              }

                              else if (matrix[i][j] == 3)

                              {

                                      count++;

                                      if (!find3)

                                      {

                                              end = clock();

                                              gotoxy(1, 14);

                                              pst2 = (double)(end - start) / CLK_TCK; //시간 재기

                                              if (first == 0) //처음 찾은거면

                                              {

                                                     printf("♥ 찾는데 걸린시간:%.1f", pst2);

                                                     score += 100 - (int)pst2;

                                              }

                                              else

                                              {

                                                     printf("♥ 찾는데 걸린시간:%.1f", pst1 + pst2);

                                                     score += 100 - (int)pst1 - (int)pst2;

                                              }

                                              matrix[i][j] == 1; //count가 안늘어나게 1로 바꾼다

                                              first = 3;

                                              start = clock();

                                      }

                                      find3++;

                              }

 

               gotoxy(1, 12);

               printf("찾은 보물의 개수:%d", count);

               print_score();

               key = getch();

               move_arrow_key(key, &x, &y, 19, 10);

        } while (count<2);

}

 

void print_score(void)

{

        gotoxy(1, 16);

        printf("점수: %d", score);

}



[3번 문제]

/*

키를 추가하여 대각선 방향으로도 움직이도록 프로그램을 수정하시오

화살표 대신 숫자패드를 이용하여 움직인다

*/

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

#include <Windows.h>

#include <time.h>

 

void display_rule(void);

void basic_map(void);

void display_map(int matrix[][11], int tx[], int ty[]);

void make_treasure(int tx[], int ty[]);

void move_arrow_key(char key, int *x1, int *y1, int x_b, int y_b);

void game_control(int tx[], int ty[]);

void gotoxy(int x, int y);

 

int main(void)

{

        int tx[2], ty[2];

        int matrix[11][11] = { 0 };

        clock_t start, end;

        double pst;

        srand((unsigned)time(NULL));

        make_treasure(tx, ty);

        display_rule();

        start = clock();

        system("cls");

        game_control(tx, ty);

        end = clock();

        pst = (double)(end - start) / CLK_TCK; //시간 재기

        gotoxy(1, 13);

        printf("경과시간:%.1f", pst);

        gotoxy(1, 14);

        printf("모두 찾았습니다. 게임을 종료합니다. \n");

        getch();

        return 0;

}

 

void gotoxy(int x, int y)

{

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

        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);

}

 

/*

함수 move_arrow_key 숫자패드

*/

void move_arrow_key(char key, int *x1, int *y1, int x_b, int y_b)

{

        switch (key)

        {

        case 49:

               *x1 = *x1 - 2;

               *y1 = *y1 + 1;

               if (*y1 > y_b)

                       *y1 = y_b;

               if (*x1 < 1)

                       *x1 = 1;

               break;

        case 50:

               *y1 = *y1 + 1; //아래쪽 방향의 화살표 키 입력

               if (*y1 > y_b)

                       *y1 = y_b;

               break;

        case 51:

               *x1 = *x1 + 2;

               *y1 = *y1 + 1;

               if (*y1 > y_b)

                       *y1 = y_b;

               if (*x1 > x_b)

                       *x1 = x_b;

               break;

        case 52:

               *x1 = *x1 - 2; //왼쪽 방향의 화살표 키 입력

               if (*x1 < 1)

                       *x1 = 1;

               break;

        case 54:

               *x1 = *x1 + 2; //오른쪽 방향의 화살표 키 입력

               if (*x1 > x_b)

                       *x1 = x_b;

               break;

        case 55:

               *x1 = *x1 - 2;

               *y1 = *y1 - 1;

               if (*y1 < 1)

                       *y1 = 1;

               if (*x1 < 1)

                       *x1 = 1;

               break;

        case 56:

               *y1 = *y1 - 1; //위쪽 방향의 화살표 키 입력

               if (*y1 < 1)

                       *y1 = 1;

               break;

        case 57:

               *x1 = *x1 + 2;

               *y1 = *y1 - 1;

               if (*y1 < 1)

                       *y1 = 1;

               if (*x1 > x_b)

                       *x1 = x_b;

               break;

        default:

               return;

        }

}

 

/*

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

*/

void display_rule(void)

{

        gotoxy(1, 1);

        printf("보물찾기");

        gotoxy(1, 3);

        printf("아래의 바둑판 모양의 격자에는 보물이 \n");

        gotoxy(1, 4);

        printf("숨겨져 있습니다.\n");

        gotoxy(1, 5);

        printf("숫자패드(↑↓←→↖↗↙↘) 키를 움직여서 찾습니다.\n");

        gotoxy(1, 7);

        basic_map();

        printf("아무키나 누르면 시작합니다.\n");

        getch();

}

 

/*

기본 지도를 출력하는 함수 basic_map

*/

void basic_map(void)

{

        int i, j;

        for (i = 0; i<10; i++)

        {

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

                       printf("");

               printf("\n");

        }

}

 

/*

보물의 위치를 결정하는 함수 make_treasure

*/

void make_treasure(int tx[], int ty[])

{

        int i;

        for (i = 0; i < 2; i++)

        {

               do

               {

                       tx[i] = rand() % 11; //보물의 x 좌표

                       ty[i] = rand() % 11; //보물의 y 좌표

               } while ((tx[i] <= 1) || (ty[i] <= 1));

        }

}

 

/*

현재의 지도 상태를 출력하는 함수 display_map

*/

void display_map(int matrix[][11], int tx[], int ty[])

{

        int i, j;

        basic_map();

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

               for (j = 1; j <= 10; j++)

                       if (matrix[i][j] == 1)

                       {

                              gotoxy(2 * i - 1, j);

                              printf("");

                       }

                       else if (matrix[i][j] == 2)

                       {

                              gotoxy(2 * i - 1, j);

                              printf("");

                       }

}

 

/*

보물찾기 게임을 제어하는 함수 game_control

*/

void game_control(int tx[], int ty[])

{

        char key;

        int i, j, count = 0;

        int x = 1, y = 1;

        int matrix[11][11] = { 0 };

        do

        {

               gotoxy(x, y);

               printf("");

               matrix[(x + 1) / 2][y] = 1; //밟았다고 표시

 

               for (i = 0; i<2; i++)

                       if ((x + 1) / 2 == tx[i] && (y == ty[i]))

                              matrix[(x + 1) / 2][y] = 2; //보물 위치 표시

 

               gotoxy(1, 1);

               display_map(matrix, tx, ty); //지도를 바꾼다

 

               count = 0;

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

                       for (j = 1; j <= 10; j++)

                              if (matrix[i][j] == 2)

                                      count = count + 1;

               gotoxy(1, 12);

               printf("찾은 보물()의 개수:%d", count);

               key = getch();

               move_arrow_key(key, &x, &y, 19, 10);

        } while (count<2);

}

 


[4번 문제]

/*

지도에 보이지 않게 지뢰를 넣어 지뢰를 지나갈 경우에 처음시작 위치로

돌아가게 하도록 프로그램을 수정하시오

*/

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

#include <Windows.h>

#include <time.h>

 

void display_rule(void);

void basic_map(void);

void display_map(int matrix[][11], int tx[], int ty[]);

void make_treasure(int tx[], int ty[]);

void move_arrow_key(char key, int *x1, int *y1, int x_b, int y_b);

void game_control(int tx[], int ty[]);

void gotoxy(int x, int y);

 

int main(void)

{

        int tx[3], ty[3];

        int matrix[11][11] = { 0 };

        clock_t start, end;

        double pst;

        srand((unsigned)time(NULL));

        make_treasure(tx, ty);

        display_rule();

        start = clock();

        system("cls");

        game_control(tx, ty);

        end = clock();

        pst = (double)(end - start) / CLK_TCK; //시간 재기

        gotoxy(1, 13);

        printf("경과시간:%.1f", pst);

        gotoxy(1, 14);

        printf("모두 찾았습니다. 게임을 종료합니다. \n");

        getch();

        return 0;

}

 

void gotoxy(int x, int y)

{

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

        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);

}

 

/*

함수 move_arrow_key 숫자패드

*/

void move_arrow_key(char key, int *x1, int *y1, int x_b, int y_b)

{

        switch (key)

        {

        case 49:

               *x1 = *x1 - 2;

               *y1 = *y1 + 1;

               if (*y1 > y_b)

                       *y1 = y_b;

               if (*x1 < 1)

                       *x1 = 1;

               break;

        case 50:

               *y1 = *y1 + 1; //아래쪽 방향의 화살표 키 입력

               if (*y1 > y_b)

                       *y1 = y_b;

               break;

        case 51:

               *x1 = *x1 + 2;

               *y1 = *y1 + 1;

               if (*y1 > y_b)

                       *y1 = y_b;

               if (*x1 > x_b)

                       *x1 = x_b;

               break;

        case 52:

               *x1 = *x1 - 2; //왼쪽 방향의 화살표 키 입력

               if (*x1 < 1)

                       *x1 = 1;

               break;

        case 54:

               *x1 = *x1 + 2; //오른쪽 방향의 화살표 키 입력

               if (*x1 > x_b)

                       *x1 = x_b;

               break;

        case 55:

               *x1 = *x1 - 2;

               *y1 = *y1 - 1;

               if (*y1 < 1)

                       *y1 = 1;

               if (*x1 < 1)

                       *x1 = 1;

               break;

        case 56:

               *y1 = *y1 - 1; //위쪽 방향의 화살표 키 입력

               if (*y1 < 1)

                       *y1 = 1;

               break;

        case 57:

               *x1 = *x1 + 2;

               *y1 = *y1 - 1;

               if (*y1 < 1)

                       *y1 = 1;

               if (*x1 > x_b)

                       *x1 = x_b;

               break;

        default:

               return;

        }

}

 

/*

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

*/

void display_rule(void)

{

        gotoxy(1, 1);

        printf("보물찾기");

        gotoxy(1, 3);

        printf("아래의 바둑판 모양의 격자에는 보물이 \n");

        gotoxy(1, 4);

        printf("숨겨져 있습니다.\n");

        gotoxy(1, 5);

        printf("숫자패드(↑↓←→↖↗↙↘) 키를 움직여서 찾습니다.\n");

        gotoxy(1, 6);

        printf("지뢰()를 밟으면 초기위치로 돌아갑니다.\n");

        gotoxy(1, 8);

        basic_map();

        printf("아무키나 누르면 시작합니다.\n");

        getch();

}

 

/*

기본 지도를 출력하는 함수 basic_map

*/

void basic_map(void)

{

        int i, j;

        for (i = 0; i< 10; i++)

        {

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

                       printf("");

               printf("\n");

        }

}

 

/*

보물과 지뢰의 위치를 결정하는 함수 make_treasure

*/

void make_treasure(int tx[], int ty[])

{

        int i;

        for (i = 0; i < 3; i++) //두개는 보물, 하나는 지뢰

        {

               do

               {

                       tx[i] = rand() % 11; //보물의 x 좌표

                       ty[i] = rand() % 11; //보물의 y 좌표

               } while ((tx[i] <= 1) || (ty[i] <= 1));

        }

}

 

/*

현재의 지도 상태를 출력하는 함수 display_map

*/

void display_map(int matrix[][11], int tx[], int ty[])

{

        int i, j;

        basic_map();

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

               for (j = 1; j <= 10; j++)

                       if (matrix[i][j] == 1)

                       {

                              gotoxy(2 * i - 1, j);

                              printf("");

                       }

                       else if (matrix[i][j] == 2)

                       {

                              gotoxy(2 * i - 1, j);

                              printf("");

                       }

                       else if (matrix[i][j] == 3)

                       {

                              gotoxy(2 * i - 1, j);

                              printf("");

                       }

}

 

/*

보물찾기 게임을 제어하는 함수 game_control

*/

void game_control(int tx[], int ty[])

{

        char key;

        int i, j, count = 0;

        int x = 1, y = 1;

        int matrix[11][11] = { 0 };

        do

        {

               gotoxy(x, y);

               printf("");

               matrix[(x + 1) / 2][y] = 1; //밟았다고 표시

 

               for (i = 0; i < 2; i++)

                       if ((x + 1) / 2 == tx[i] && (y == ty[i]))

                              matrix[(x + 1) / 2][y] = 2; //보물 위치 표시

 

               if ((x + 1) / 2 == tx[2] && (y == ty[2]))

                       matrix[(x + 1) / 2][y] = 3; //지뢰 표시

 

               gotoxy(1, 1);

               display_map(matrix, tx, ty); //지도를 바꾼다

 

               count = 0;

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

                       for (j = 1; j <= 10; j++)

                              if (matrix[i][j] == 2)

                                      count = count + 1;

                              else if (matrix[i][j] == 3)

                              {

                                      gotoxy(1, 10);

                                      printf("지뢰를 밟았습니다. 초기위치로 돌아갑니다");

                                      Sleep(1000); //지뢰위치 충분히 보여줌

                                      gotoxy(1, 10);

                                      printf("                                        ");

                                      x = 1; y = 1; //초기위치

                                      for (int a = 0; a <= 10; a++)

                                              for (int b = 0; b <= 10; b++)

                                                     matrix[a][b] = 0; //초기화

                              }

 

               gotoxy(1, 12);

               printf("찾은 보물()의 개수:%d", count);

               key = getch();

               move_arrow_key(key, &x, &y, 19, 10);

        } while (count<2);

}

 


개발환경:Visual Studio 2017


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


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


반응형