[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언어 프로젝트 안기수 저
'C > 명품 C언어 프로젝트(안기수 저)' 카테고리의 다른 글
명품 C언어 프로젝트 8.8장 슬롯 머신 응용문제 (7) | 2017.09.12 |
---|---|
명품 C언어 프로젝트 8.8장 슬롯 머신 (0) | 2017.09.11 |
C언어 간단한 우주선 착륙시키기 게임 (4) | 2017.09.06 |
명품 C언어 프로젝트 8.6장 블록쌓기 프로그램 응용 (8) | 2017.09.05 |
명품 C언어 프로젝트 8.5장 말타고 화살쏘기 프로그램 응용 (0) | 2017.09.03 |