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

명품 C언어 프로젝트 5.5장 연습문제

꾸준함. 2017. 8. 19. 14:56

[1번 문제]

/*

예제 5.3.1을 응용하여 다음과 같은 두더지 잡기 게임 프로그램을 작성한다.

두더지 대신 아래의 그림과 같이 영문자를 표시하여 제한 시간 내에 정확한 키를 입력했을 경우에만 맞는 것으로 처리합니다

*/

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

#include <string.h>

#include <time.h>

#include <Windows.h>

 

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

}

 

void intro_game(void)

{

        printf("두더지 잡기 게임\n\n");

        printf("아래의 격자모양 안에 영문자가 표시되면\n");

        printf("이를 두더지로 간주하여 해당 문자를\n");

        printf("빠르게 입력해야 점수가 올라갑니다\n\n");

        printf("제한시간 1\n");

        draw_check02(4, 4);

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

        getch();

}

 

void gotoxy(int x, int y)

{

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

        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);

}

 

int main(void)

{

        int score = 0; //점수

        char key; //입력

        srand((unsigned)time(NULL));

        intro_game();

        system("cls");

        int count = 0;

        while (count < 15)

        {

               system("cls");

               draw_check02(4, 4);

               printf("\n\n현재 점수 : %d\n", score);

               int rnd1 = rand() % 4 * 4 + 3; //가로

               int rnd2 = rand() % 4 * 2 + 2; //세로

               gotoxy(rnd1, rnd2);

               char alpha = rand() % 26 + 97;

               printf("%c", alpha); //영소문자

               clock_t start = clock();

               while (1)

               {

                       gotoxy(1, 10);

                       if (kbhit())

                       {

                              key = getch();

                              start = clock();

                              if (key == alpha)

                              {

                                      gotoxy(1, 11);

                                      printf("두더지:(으악)");

                                      Sleep(1000);

                                      score += 10;

                                      break;

                              }

                              else

                              {

                                      gotoxy(1, 11);

                                      printf("두더지:어디 치냐?(메롱)");

                                      Sleep(1000);

                                      score -= 5;

                                      break;

                              }

                       }

                       if ((clock() - start) / CLOCKS_PER_SEC > 1.0f) //1초 지나면

                       {

                              gotoxy(1, 11);

                              printf("두더지:너무 느려~");

                              Sleep(500);

                              score -= 5;

                              break;

                       }

               }

               count++;

        }

        system("cls");

        printf("최종점수: %d\n", score);

        return 0;

}


[2번 문제]

/*

임의의 화살표 키를 연속적으로 눌렀을 경우, 순서대로 어떤 화살표 키를 눌렀는지 추적하는 프로그램을 작성한다

*/

#include <stdio.h>

#include <malloc.h>

#include <stdlib.h>

#include <conio.h>

 

struct linked_list

{

        int key;

        struct linked_list *link;

};

 

void info(void);

void add_node(int key);

void print_linked_list(struct linked_list *now);

struct linked_list *head;

 

int main(void)

{

        info();

        int count = 0;

        int key;

        head = (struct linked_list*)malloc(sizeof(struct linked_list));

        head->link = NULL;

        do

        {

               count++;

               printf("%2d번 화살표 입력> ", count);

               key = getch();

               add_node(key);

               key = getch();

               add_node(key);//화살표는 두번 입력해야한다

               if (key == 75)

                       printf(" ");

               else if (key == 77)

                       printf(" ");

               else if (key == 72)

                       printf(" ");

               else if (key == 80)

                       printf(" ");

               printf("\n");

        } while (key != 27);

 

        printf("\n\n");

        printf("입력한 순서: ");

        print_linked_list(head->link);

        printf("\n");

        return 0;

}

 

void info(void)

{

        printf("화살표를 입력한 순서대로 출력하는 프로그램\n\n");

        printf("확장 아스키 코드이기 때문에 두번 입력이 된다고 판정이납니다\n");

        printf("따라서 프로그램 종료를 원할 때도 ESC를 두번 눌러주셔야합니다\n");

        printf("인지하셨다면 키보드를 눌러주세요\n");

        getch();

}

 

void add_node(int key)

{

        struct linked_list *new_node, *last;

        last = head;

        while (last->link != NULL)

               last = last->link;

        new_node = (struct linked_list*)malloc(sizeof(struct linked_list));

        new_node->key = key;

        new_node->link = last->link;

        last->link = new_node;

}

 

void print_linked_list(struct linked_list *now)

{

        while (now != NULL)

        {

               int ch1 = now->key;

               now = now->link;

               int ch2 = now->key;

               if (ch1 == 224 && ch2 == 75)

                       printf(" ");

               else if (ch1 == 224 && ch2 == 77)

                       printf(" ");

               else if (ch1 == 224 && ch2 == 72)

                       printf(" ");

               else if (ch1 == 224 && ch2 == 80)

                       printf(" ");

               now = now->link;

        }

        printf("\n");

}

 

 


개발환경:Visual Studio 2017


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


[참고] 명품 C언어 프로젝트 안기수 저, http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=162729648&qb=Y+yWuOyWtCDsoJztlZzsi5zqsIQ=&enc=utf8&section=kin&rank=9&search_sort=0&spq=0


*제한시간은 위 링크를 참고했습니다

*우선은 자주 쓰이는 자료구조인 linked list와 stack을 연습하고자 1, 2번 문제만 풀었습니다



반응형