[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번 문제를 토대로 작성했습니다.
*원카드 게임은 개발중이긴 한데 생각보다 어려워서 꽤나 시간이 오래걸릴 것 같습니다...
'C > 명품 C언어 프로젝트(안기수 저)' 카테고리의 다른 글
명품 C언어 프로젝트 5.4장 연습문제 (0) | 2017.08.12 |
---|---|
명품 C언어 프로젝트 5.3장 연습문제 (2) | 2017.08.05 |
명품 C언어 프로젝트 5.1장 연습문제 (0) | 2017.07.26 |
명품 C언어 프로젝트 4.6장 연습문제 (4) | 2017.07.18 |
명품 C언어 프로젝트 4.5장 연습문제 (0) | 2017.07.14 |