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

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

꾸준함. 2017. 7. 30. 16:24

[1번 문제]

/*

상하좌우의 화살표 키를 이용하여 임의의 크기를 갖는 정사각형을 연속적으로 이동시키는 프로그램을 작성한다

*/

#include <stdio.h>

#include <stdlib.h>

#include <Windows.h>

#include <conio.h>

 

void draw_square_xy(int size, int x, int y);

void gotoxy(int x, int y);

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

 

int main(void)

{

        int move = 1, x=1, y = 1, size, key;

        printf("사각형을 상하좌우로 움직이는 animation\n");

        printf("실행 중에 아무키나 누르면 종료\n");

        printf("사각형의 크기를 입력하고 Enter(최대 20)");

        scanf("%d", &size);

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

        getch();

        do

        {

               system("cls");

               draw_square_xy(size, x, y);

               key = getch();

               do

               {

                       move_arrow_key(key, &x, &y, 80 - (size * 2), 24 - size); //80, 24가 최대

                       draw_square_xy(size, x, y);

                       Sleep(50);

                       system("cls");

               } while (!kbhit());

        } while (key != 27); //ESC 누르기 전까지

        getch();

        return 0;

}

 

void draw_square_xy(int size, int x, int y)

{

        int i, j;

        unsigned char a = 0xa6;

        unsigned char b[7];

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

               b[i] = 0xa0 + i;

 

        gotoxy(x, y);

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

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

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

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

 

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

        {

               gotoxy(x, y + i + 1);

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

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

                       printf("  ");

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

        }

 

        gotoxy(x, y + i);

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

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

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

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

}

 

void gotoxy(int x, int y)

{

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

        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);

}

 

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 - 1;

               if (*x1 < 1)

                       *x1 = 1;

               break;

        case 77:

               *x1 = *x1 + 1;

               if (*x1 > x_b)

                       *x1 = x_b;

               break;

        case 80:

               *y1 = *y1 + 1;

               if (*y1 > y_b)

                       *y1 = y_b;

               break;

        default:

               return;

        }

}


[2번 문제]

/*

화면 중앙에 임의의 크기를 갖는 정사각형을 위치시키고, 숫자 키패드를 이용하여 상하좌우의 화살표 키 외에

그림과 같이 대각선 방향으로도 정사각형을 이동시키는 프로그램을 작성한다

*/

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

#include <Windows.h>

 

void draw_square_xy(int size, int x, int y);

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

void gotoxy(int x, int y);

 

int main(void)

{

        int move = 1, x = 1, y = 1, size, key;

        printf("사각형이 상하좌우, 대각선으로 움직이는 animation\n");

        printf("실행 중에 아무키나 누르면 종료\n\n");

        printf("사이즈 입력: ");

        scanf("%d", &size);

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

        getch();

 

        do

        {

               system("cls");

               draw_square_xy(size, x, y);

               key = getch();

               do

               {

                       move_arrow_key(key, &x, &y, 80 - (size * 2), 24 - size);

                       draw_square_xy(size, x, y);

                       Sleep(50);

                       system("cls");

               } while (!kbhit());

        } while (key != 27);

        getch();

        return 0;

}

 

void draw_square_xy(int size, int x, int y)

{

        int i, j;

        unsigned char a = 0xa6;

        unsigned char b[7];

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

               b[i] = 0xa0 + i;

 

        gotoxy(x, y);

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

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

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

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

 

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

        {

               gotoxy(x, y + i + 1);

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

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

                       printf("  ");

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

        }

 

        gotoxy(x, y + i);

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

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

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

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

}

 

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

{

        switch (key)

        {

        case 49: //대각선 왼쪽 아래

               if (*y1 < y_b && *x1 > 1)

               {

                       (*x1) -= 2;

                       (*y1)+=1;

               }

               break;

        case 50: //밑으로

               *y1 = *y1 + 1;

               if (*y1 > y_b)

                       *y1 = y_b;

               break;

        case 51: //대각선 오른쪽 아래

               if (*y1 < y_b && *x1 < x_b)

               {

                       (*x1) += 2;

                       (*y1)+=1;

               }

               break;

        case 52: //왼쪽으로

               *x1 -= 2;

               if (*x1 < 1)

                       *x1 = 1;

               break;

        case 54: //오른쪽으로

               *x1 += 2;

               if (*x1 > x_b)

                       *x1 = x_b;

               break;

        case 55: //대각선 왼쪽 위로

               if (*y1 > 1 && *x1 > 1)

               {

                       (*x1) -= 2;

                       (*y1)--;

               }

               break;

        case 56: //위로

               *y1 = *y1 - 1;

               if (*y1 < 1)

                       *y1 = 1;

               break;

        case 57: //대각선 오른쪽 위로

               if (*y1 > 1 && *x1 < x_b)

               {

                       (*x1) += 2;

                       (*y1)--;

               }

               break;

        default:

               return;

        }

}

 

void gotoxy(int x, int y)

{

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

        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);

}


[3번 문제]

/*

다음 그림과 같이 상자 안에서 공이 상자의 벽에 부딪치면서 연속적으로 회전하는

애니메이션을 구현한다. 화살표는 공의 이동방향을 나타낸다

*/

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#include <Windows.h>

#include <conio.h>

 

void gotoxy(int x, int y);

void animation(int *x, int *y, int *move);

void ball(char *chr1, int x, int y);

 

int main(void)

{

        char chr1[3] = "";

        int x, y, move;

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

        getch();

        system("cls");

        srand((unsigned)time(NULL));

        x = 40;

        y = 12; //가운데서 시작

        move = rand() % 4 + 1; //방향은 랜덤

        do

        {

               animation(&x, &y, &move);

               ball(chr1, x, y);

        } while (!kbhit());

        return 0;

}

 

void gotoxy(int x, int y)

{

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

        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);

}

 

void ball(char *chr1, int x, int y)

{

        gotoxy(x, y);

        printf("%s", chr1);

        Sleep(50);

        gotoxy(x, y);

        printf("  "); //다시 지우고

}

 

void animation(int *x, int *y, int *move)

{

        switch (*move)

        {

        case 1: //왼쪽 위 대각선

               *x -= 2;

               *y -= 1;

               if (*x < 1)

               {

                       *x = 1;

                       *move = 2;  //방향전환

               }

               if (*y < 1)

               {

                       *y = 1;

                       *move = 4;

               }

               break;

        case 2: //오른쪽 위 대각선

               *x += 2;

               *y -= 1;

               if (*x > 80)

               {

                       *x = 80;

                       *move = 1;

               }

               if (*y < 1)

               {

                       *y = 1;

                       *move = 3;

               }

               break;

        case 3: //오른쪽 아래 대각선

               *x += 2;

               *y += 1;

               if (*x > 80)

               {

                       *x = 80;

                       *move = 4;

               }

               if (*y > 24)

               {

                       *y = 24;

                       *move = 2;

               }

               break;

        case 4: //왼쪽 아래 대각선

               *x -= 2;

               *y += 1;

               if (*x < 1)

               {

                       *x = 1;

                       *move = 3;

               }

               if (*y > 24)

               {

                       *y = 24;

                       *move = 1;

               }

               break;

        }

}


[4번 문제]

/*

각도와 힘의 세기를 입력받아 공을 던지는 애니메이션을 구현한다.

던진 공은 포물선을 그리며 날아가도록 한다

*/

#include <stdio.h>

#include <Windows.h>

#include <conio.h>

#include <math.h>

 

#define g 9.8

#define PI 3.141592

 

void gotoxy(int x, int y);

void animation(char *chr1, int x, int y);

 

int main(void)

{

        char chr1[3] = "";

        float t, v0, a, X=0, Y = 0, radian;

        printf("속력:");

        scanf("%f", &v0);

        printf("각도:");

        scanf("%f", &a);

        radian = a*PI / 180;

        system("cls");

 

        for (t = 0; X<80 && Y<24 ;t += 0.01) //범위 80, 24

        {

               if (Y<0)

                       break;

 

               X = v0*cos(radian)*t;

               Y = v0*sin(radian)*t - 0.5*g*t*t;

 

               animation(chr1, X, Y);

 

               gotoxy(1, 25);

               printf("X=%f\t Y=%f\n", X, Y);

        }

        return 0;

}

 

void gotoxy(int x, int y)

{

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

        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);

}

 

void animation(char *chr1, int x, int y)

{

        gotoxy(x, 24-y); //왼쪽 밑에서 던지는 것처럼 보이기 위해

        printf("%s", chr1);

        Sleep(50);

        printf("\b\b  ", chr1);

}

 


[5번 문제]

/*

문제 4를 응용하여 목표물을 맞히는 프로그램을 작성하시오

*/

#include <stdio.h>

#include <Windows.h>

#include <conio.h>

#include <math.h>

 

#define g 9.8

#define PI 3.141592

 

void gotoxy(int x, int y);

void animation(char *chr1, int x, int y);

 

int main(void)

{

        char chr1[3] = "";

        float t, v0, a, radian;

        int X = 0, Y = 0; //목표물을 맞추기 위해서는 정수일 때가 편하다

        printf("속력:");

        scanf("%f", &v0);

        printf("각도:");

        scanf("%f", &a);

        radian = a*PI / 180;

        int targetX = 40;

        int targetY = 12;

        system("cls");

 

        gotoxy(targetX, targetY);

        printf("");

        for (t = 0; X<80 && Y<24;t += 0.01) //범위 80, 24

        {

               if (Y<0)

                       break;

 

               X = v0*cos(radian)*t;

               Y = v0*sin(radian)*t - 0.5*g*t*t;

              

               if (X >= targetX - 1 && X <= targetX + 1 && Y == targetY)

               {

                       system("cls");

                       gotoxy(1, 25);

                       printf("목표물을 맞추셨습니다\n");

                       return 0;

               }

 

               animation(chr1, X, Y);

 

               gotoxy(1, 25);

               printf("X=%d\t Y=%d\n", X, Y);

        }

        gotoxy(1, 26);

        printf("목표물을 맞추지 못했습니다");

        return 0;

}

 

void gotoxy(int x, int y)

{

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

        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);

}

 

void animation(char *chr1, int x, int y)

{

        gotoxy(x, 24 - y); //왼쪽 밑에서 던지는 것처럼 보이기 위해

        printf("%s", chr1);

        Sleep(50);

        printf("\b\b  ", chr1);

}

 


개발환경:Visual Studio 2017


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


[참고] 명품 C언어 프로젝트 안기수 저, http://cafe.naver.com/cafec/3405


*4번 문제는 링크를 참고하여 작성했습니다.

*5번 문제는 4번 문제를 토대로 작성했습니다.


*원카드 게임은 개발중이긴 한데 생각보다 어려워서 꽤나 시간이 오래걸릴 것 같습니다...

반응형