[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§ion=kin&rank=9&search_sort=0&spq=0
*제한시간은 위 링크를 참고했습니다
*우선은 자주 쓰이는 자료구조인 linked list와 stack을 연습하고자 1, 2번 문제만 풀었습니다
'C > 명품 C언어 프로젝트(안기수 저)' 카테고리의 다른 글
명품 C언어 프로젝트 6.2장 연습문제 (0) | 2017.08.22 |
---|---|
명품 C언어 프로젝트 6.1장 연습문제 (0) | 2017.08.21 |
명품 C언어 프로젝트 5.4장 연습문제 (0) | 2017.08.12 |
명품 C언어 프로젝트 5.3장 연습문제 (2) | 2017.08.05 |
명품 C언어 프로젝트 5.2장 연습문제 (0) | 2017.07.30 |