[1번]
/*
같은 문자를 찾는 게임 프로그램
*/
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <Windows.h>
int intro_game(void);
void draw_check02(int r, int c);
void gotoxy(int x, int y);
void number_display(int n);
void display_rule(int n, char question[][10]);
void make_question(int n, char question[][10]);
void game_control(char question[][10], int n, int *count);
void clear_text(void);
int main(void)
{
int n, count = 0;
char question[10][10] = { 0 };
char answer[10][10] = { 0 };
long pst, seconds, minutes;
clock_t start, end;
srand((unsigned)time(NULL));
n = intro_game();
system("cls");
draw_check02(n, n);
number_display(n);
display_rule(n, question);
number_display(n);
start = clock();
do
{
game_control(question, n, &count);
} while (count < n*n / 2);
gotoxy(2, 18);
printf("모두 맞았습니다. 종료합니다. \n");
end = clock();
pst = (end - start) / CLK_TCK;
minutes = pst / 60;
seconds = pst - minutes * 60;
gotoxy(2, 19);
printf("경과시간: %ld분 %ld초\n", minutes, seconds);
return 0;
}
void gotoxy(int x, int y)
{
COORD Pos = { x - 1, y - 1 };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);
}
/*
확장된 바둑판 그리기 함수 draw_check02
*/
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");
}
/*
게임 설명과 격자판의 크기를 입력받는 함수 intro_game
*/
int intro_game(void)
{
int n;
system("cls");
printf("문자 퍼즐 맞추기\n\n");
printf("격자모양의 판에 숨겨진 두 개의 문자를 찾는 \n");
printf("게임입니다. \n\n");
printf("행의 숫자를 입력하고 Enter> ");
scanf("%d", &n);
return n;
}
/*
게임의 규칙을 출력하는 함수 display_rule
*/
void display_rule(int n, char question[][10])
{
gotoxy(2, 14);
printf("위와 같은 격자모양의 숫자 뒤에는 \n");
gotoxy(2, 15);
printf("같은 모양의 문자가 두개씩 숨어 있습니다. \n");
gotoxy(2, 16);
printf("아무키나 누르면 정답화면이 잠시 나타납니다. \n");
getch();
clear_text();
make_question(n, question);
gotoxy(2, 14);
printf("정답화면은 위와 같습니다. \n");
gotoxy(2, 15);
printf("5초 뒤에 문제 풀이를 시작합니다.\n");
Sleep(5000);
clear_text();
}
/*
같은 문자를 찾는 게임을 제어하는 함수 game_control
*/
void game_control(char question[][10], int n, int *count)
{
int user1, user2, user3, row1, row2, row3, col1, col2, col3;
int sel;
gotoxy(2, 14);
printf("첫번째 숫자를 입력하고 Enter> ");
scanf("%d", &user1);
row1 = user1 / n;
col1 = user1%n;
printf("두번째 숫자를 입력하고 Enter> ");
scanf("%d", &user2);
row2 = user2 / n;
col2 = user2%n;
if (n % 2)
{
printf("세번째 숫자를 입력 원하면 1 입력(아니면 0): ");
scanf("%d", &sel);
if (sel)
{
printf("세번째 숫자를 입력하고 Enter> ");
scanf("%d", &user3);
row3 = user3 / n;
col3 = user3 % n;
}
}
if (question[row1][col1] == question[row2][col2] && sel)
{
if (question[row1][col1] == question[row3][col3])
{
*count = *count + 1;
gotoxy(28, 4);
printf("맞은 개수:%2d개(총 %2d개)", *count, n * 2);
gotoxy(3 + 4 * col1, 2 + 2 * row1);
printf("%2c", question[row1][col1]);
gotoxy(3 + 4 * col2, 2 + 2 * row2);
printf("%2c", question[row2][col2]);
gotoxy(3 + 4 * col3, 2 + 2 * row3);
printf("%2c", question[row3][col3]);
gotoxy(2, 18);
printf("맞았습니다. 아무키나 누르면 다시 시작합니다. ");
getch();
clear_text();
}
else
{
gotoxy(3 + 4 * col1, 2 + 2 * row1);
printf("%2c", question[row1][col1]);
gotoxy(3 + 4 * col2, 2 + 2 * row2);
printf("%2c", question[row2][col2]);
Sleep(3000);
gotoxy(3 + 4 * col3, 2 + 2 * row3);
printf("%2c", question[row3][col3]);
gotoxy(3 + 4 * col1, 2 + 2 * row1);
printf("%2d", user1);
gotoxy(3 + 4 * col2, 2 + 2 * row2);
printf("%2d", user2);
gotoxy(3 + 4 * col3, 2 + 2 * row3);
printf("%2d", user3);
gotoxy(2, 18);
printf("틀렸습니다. 아무키나 누르면 시작합니다. ");
getch();
clear_text();
}
}
else if (question[row1][col1] == question[row2][col2])
{
*count = *count + 1;
gotoxy(28, 4);
printf("맞은 개수:%2d개(총 %2d개)", *count, n * 2);
gotoxy(3 + 4 * col1, 2 + 2 * row1);
printf("%2c", question[row1][col1]);
gotoxy(3 + 4 * col2, 2 + 2 * row2);
printf("%2c", question[row2][col2]);
gotoxy(2, 18);
printf("맞았습니다. 아무키나 누르면 다시 시작합니다. ");
getch();
clear_text();
}
else
{
gotoxy(3 + 4 * col1, 2 + 2 * row1);
printf("%2c", question[row1][col1]);
gotoxy(3 + 4 * col2, 2 + 2 * row2);
printf("%2c", question[row2][col2]);
Sleep(3000);
gotoxy(3 + 4 * col1, 2 + 2 * row1);
printf("%2d", user1);
gotoxy(3 + 4 * col2, 2 + 2 * row2);
printf("%2d", user2);
gotoxy(2, 18);
printf("틀렸습니다. 아무키나 누르면 시작합니다. ");
getch();
clear_text();
}
}
/*
화면의 내용을 지우는 함수 clear_text
*/
void clear_text(void)
{
for (int i = 14; i < 19; i++)
{
gotoxy(2, i);
for (int j = 0; j < 50; j++)
printf(" ");
}
}
/*
숫자를 출력하는 함수 number_display
*/
void number_display(int n)
{
int count = 0;
for (int i = 0; i<n; i++)
for (int j = 0; j < n; j++)
{
gotoxy(3 + 4 * j, 2 + 2 * i);
printf("%2d", count);
count++;
}
}
/*
문제를 생성하는 make_question
*/
void make_question(int n, char question[][10])
{
int number, ran, count1 = 0, count2 = 0;
char chr1[26], chr2[26], temp;
srand((unsigned)time(NULL));
number = n*n / 2;
for (int i = 0; i < 26; i++)
{
chr1[i] = 65 + i;
chr2[i] = i;
}
for (int i = 0; i < number; i++)
{
ran = rand() % number;
temp = chr1[i];
chr1[i] = chr1[ran];
chr1[ran] = temp;
}
for (int i = 0; i < number; i++)
{
ran = rand() % number;
temp = chr2[i];
chr2[i] = chr2[ran];
chr2[ran] = temp;
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (count1 < number)
{
question[i][j] = chr1[count1];
count1++;
}
//한 쌍이 필요하므로
else
{
if (n % 2 && i == n - 1 && j== n - 1)
{
int random = rand() % n;
question[i][j] = chr1[chr2[n]];
}
else
{
question[i][j] = chr1[chr2[count2]];
count2++;
}
}
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
gotoxy(3 + 4 * j, 2 + 2 * i);
printf("%2c", question[i][j]);
}
}
}
[2번]
/*
응용 11.3.1은 맞은 개수만 출력하지만 맞은 개수 외에 출제된 단어의 쌍과, 맞은 문자의 쌍을 화면에 출력하도록 수정하시오
*/
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <Windows.h>
int intro_game(void);
void draw_check02(int r, int c);
void gotoxy(int x, int y);
void number_display(int n);
void display_rule(int n, char question[][10]);
void make_question(int n, char question[][10]);
void game_control(char question[][10], int n, int *count);
void clear_text(void);
int main(void)
{
int n, count = 0;
char question[10][10] = { 0 };
char answer[10][10] = { 0 };
long pst, seconds, minutes;
clock_t start, end;
srand((unsigned)time(NULL));
n = intro_game();
system("cls");
draw_check02(n, n);
number_display(n);
display_rule(n, question);
number_display(n);
start = clock();
do
{
game_control(question, n, &count);
} while (count < n*n / 2);
gotoxy(2, 18);
printf("모두 맞았습니다. 종료합니다. \n");
end = clock();
pst = (end - start) / CLK_TCK;
minutes = pst / 60;
seconds = pst - minutes * 60;
gotoxy(2, 19);
printf("경과시간: %ld분 %ld초\n", minutes, seconds);
return 0;
}
void gotoxy(int x, int y)
{
COORD Pos = { x - 1, y - 1 };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);
}
/*
확장된 바둑판 그리기 함수 draw_check02
*/
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");
}
/*
게임 설명과 격자판의 크기를 입력받는 함수 intro_game
*/
int intro_game(void)
{
int n;
system("cls");
printf("문자 퍼즐 맞추기\n\n");
printf("격자모양의 판에 숨겨진 두 개의 문자를 찾는 \n");
printf("게임입니다. \n\n");
printf("행의 숫자(4 또는 6)를 입력하고 Enter> ");
scanf("%d", &n);
return n;
}
/*
게임의 규칙을 출력하는 함수 display_rule
*/
void display_rule(int n, char question[][10])
{
gotoxy(2, 14);
printf("위와 같은 격자모양의 숫자 뒤에는 \n");
gotoxy(2, 15);
printf("같은 모양의 문자가 두개씩 숨어 있습니다. \n");
gotoxy(2, 16);
printf("아무키나 누르면 정답화면이 잠시 나타납니다. \n");
getch();
clear_text();
make_question(n, question);
gotoxy(2, 14);
printf("정답화면은 위와 같습니다. \n");
gotoxy(2, 15);
printf("5초 뒤에 문제 풀이를 시작합니다.\n");
Sleep(5000);
clear_text();
}
/*
같은 문자를 찾는 게임을 제어하는 함수 game_control
*/
void game_control(char question[][10], int n, int *count)
{
int user1, user2, row1, row2, col1, col2;
gotoxy(2, 14);
printf("첫번째 숫자를 입력하고 Enter> ");
scanf("%d", &user1);
row1 = user1 / n;
col1 = user1%n;
printf("두번째 숫자를 입력하고 Enter> ");
scanf("%d", &user2);
row2 = user2 / n;
col2 = user2%n;
gotoxy(28, 4);
printf("맞은 개수:%2d개(총 %2d개)", *count, n * 2);
for (int i = 0; i < (n*n/2); i++)
{
if (i < (n*n / 4))
gotoxy(28 + (4 * i), 5);
else
gotoxy(28 + (4 * (i-(n*n/4))), 6);
printf("%c", (char)('A' + i));
}
if (question[row1][col1] == question[row2][col2])
{
*count = *count + 1;
gotoxy(28, 4);
printf("맞은 개수:%2d개(총 %2d개)", *count, n * 2);
if((int)question[row1][col1] - 65<(n*n/4))
gotoxy(30 + 4 * ((int)question[row1][col1] - 65), 5);
else
gotoxy(30 + 4 * ((int)question[row1][col1] - 65 - (n*n / 4)), 6);
printf("O");
gotoxy(3 + 4 * col1, 2 + 2 * row1);
printf("%2c", question[row1][col1]);
gotoxy(3 + 4 * col2, 2 + 2 * row2);
printf("%2c", question[row2][col2]);
gotoxy(2, 16);
printf("맞았습니다. 아무키나 누르면 다시 시작합니다. ");
getch();
clear_text();
}
else
{
gotoxy(3 + 4 * col1, 2 + 2 * row1);
printf("%2c", question[row1][col1]);
gotoxy(3 + 4 * col2, 2 + 2 * row2);
printf("%2c", question[row2][col2]);
Sleep(3000);
gotoxy(3 + 4 * col1, 2 + 2 * row1);
printf("%2d", user1);
gotoxy(3 + 4 * col2, 2 + 2 * row2);
printf("%2d", user2);
gotoxy(2, 16);
printf("틀렸습니다. 아무키나 누르면 시작합니다. ");
getch();
clear_text();
}
}
/*
화면의 내용을 지우는 함수 clear_text
*/
void clear_text(void)
{
for (int i = 14; i < 17; i++)
{
gotoxy(2, i);
for (int j = 0; j < 50; j++)
printf(" ");
}
}
/*
숫자를 출력하는 함수 number_display
*/
void number_display(int n)
{
int count = 0;
for (int i = 0; i<n; i++)
for (int j = 0; j < n; j++)
{
gotoxy(3 + 4 * j, 2 + 2 * i);
printf("%2d", count);
count++;
}
}
/*
문제를 생성하는 make_question
*/
void make_question(int n, char question[][10])
{
int number, ran, count1 = 0, count2 = 0;
char chr1[26], chr2[26], temp;
srand((unsigned)time(NULL));
number = n*n / 2;
for (int i = 0; i < 26; i++)
{
chr1[i] = 65 + i;
chr2[i] = i;
}
for (int i = 0; i < number; i++)
{
ran = rand() % number;
temp = chr1[i];
chr1[i] = chr1[ran];
chr1[ran] = temp;
}
for (int i = 0; i < number; i++)
{
ran = rand() % number;
temp = chr2[i];
chr2[i] = chr2[ran];
chr2[ran] = temp;
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (count1 < number)
{
question[i][j] = chr1[count1];
count1++;
}
//한 쌍이 필요하므로
else
{
question[i][j] = chr1[chr2[count2]];
count2++;
}
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
gotoxy(3 + 4 * j, 2 + 2 * i);
printf("%2c", question[i][j]);
}
}
}
[3번]
/*
응용 11.3.1의 문제는 영문자를 표시하지만 숫자, 한글 또는 다른 특수 기호 등을 표시할 수 있도록 수정하시오
*/
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <Windows.h>
int intro_game(void);
void draw_check02(int r, int c);
void gotoxy(int x, int y);
void number_display(int n);
void display_rule(int n, char question[][10]);
void make_question(int n, char question[][10]);
void game_control(char question[][10], int n, int *count);
void clear_text(void);
int main(void)
{
int n, count = 0;
char question[10][10] = { 0 };
char answer[10][10] = { 0 };
long pst, seconds, minutes;
clock_t start, end;
srand((unsigned)time(NULL));
n = intro_game();
system("cls");
draw_check02(n, n);
number_display(n);
display_rule(n, question);
number_display(n);
start = clock();
do
{
game_control(question, n, &count);
} while (count < n*n / 2);
gotoxy(2, 18);
printf("모두 맞았습니다. 종료합니다. \n");
end = clock();
pst = (end - start) / CLK_TCK;
minutes = pst / 60;
seconds = pst - minutes * 60;
gotoxy(2, 19);
printf("경과시간: %ld분 %ld초\n", minutes, seconds);
return 0;
}
void gotoxy(int x, int y)
{
COORD Pos = { x - 1, y - 1 };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);
}
/*
확장된 바둑판 그리기 함수 draw_check02
*/
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");
}
/*
게임 설명과 격자판의 크기를 입력받는 함수 intro_game
*/
int intro_game(void)
{
int n;
system("cls");
printf("문자 퍼즐 맞추기\n\n");
printf("격자모양의 판에 숨겨진 두 개의 문자를 찾는 \n");
printf("게임입니다. \n\n");
printf("행의 숫자(4 또는 6)를 입력하고 Enter> ");
scanf("%d", &n);
return n;
}
/*
게임의 규칙을 출력하는 함수 display_rule
*/
void display_rule(int n, char question[][10])
{
gotoxy(2, 14);
printf("위와 같은 격자모양의 숫자 뒤에는 \n");
gotoxy(2, 15);
printf("같은 모양의 문자가 두개씩 숨어 있습니다. \n");
gotoxy(2, 16);
printf("아무키나 누르면 정답화면이 잠시 나타납니다. \n");
getch();
clear_text();
make_question(n, question);
gotoxy(2, 14);
printf("정답화면은 위와 같습니다. \n");
gotoxy(2, 15);
printf("5초 뒤에 문제 풀이를 시작합니다.\n");
Sleep(5000);
clear_text();
}
/*
같은 문자를 찾는 게임을 제어하는 함수 game_control
*/
void game_control(char question[][10], int n, int *count)
{
int user1, user2, row1, row2, col1, col2;
gotoxy(2, 14);
printf("첫번째 숫자를 입력하고 Enter> ");
scanf("%d", &user1);
row1 = user1 / n;
col1 = user1%n;
printf("두번째 숫자를 입력하고 Enter> ");
scanf("%d", &user2);
row2 = user2 / n;
col2 = user2%n;
if (question[row1][col1] == question[row2][col2])
{
*count = *count + 1;
gotoxy(28, 4);
printf("맞은 개수:%2d개(총 %2d개)", *count, n * 2);
gotoxy(3 + 4 * col1, 2 + 2 * row1);
printf("%2c", question[row1][col1]);
gotoxy(3 + 4 * col2, 2 + 2 * row2);
printf("%2c", question[row2][col2]);
gotoxy(2, 16);
printf("맞았습니다. 아무키나 누르면 다시 시작합니다. ");
getch();
clear_text();
}
else
{
gotoxy(3 + 4 * col1, 2 + 2 * row1);
printf("%2c", question[row1][col1]);
gotoxy(3 + 4 * col2, 2 + 2 * row2);
printf("%2c", question[row2][col2]);
Sleep(3000);
gotoxy(3 + 4 * col1, 2 + 2 * row1);
printf("%2d", user1);
gotoxy(3 + 4 * col2, 2 + 2 * row2);
printf("%2d", user2);
gotoxy(2, 16);
printf("틀렸습니다. 아무키나 누르면 시작합니다. ");
getch();
clear_text();
}
}
/*
화면의 내용을 지우는 함수 clear_text
*/
void clear_text(void)
{
for (int i = 14; i < 17; i++)
{
gotoxy(2, i);
for (int j = 0; j < 50; j++)
printf(" ");
}
}
/*
숫자를 출력하는 함수 number_display
*/
void number_display(int n)
{
int count = 0;
for (int i = 0; i<n; i++)
for (int j = 0; j < n; j++)
{
gotoxy(3 + 4 * j, 2 + 2 * i);
printf("%2d", count);
count++;
}
}
/*
문제를 생성하는 make_question
*/
void make_question(int n, char question[][10])
{
int number, ran, count1 = 0, count2 = 0;
char chr1[26], chr2[26], temp;
srand((unsigned)time(NULL));
number = n*n / 2;
for (int i = 0; i < 26; i++)
{
int sel = rand() % 3;
if (sel == 0)
chr1[i] = 65 + i;
else if (sel == 1)
chr1[i] = 48 + i;
else
chr1[i] = 33 + i;
chr2[i] = i;
}
for (int i = 0; i < number; i++)
{
ran = rand() % number;
temp = chr1[i];
chr1[i] = chr1[ran];
chr1[ran] = temp;
}
for (int i = 0; i < number; i++)
{
ran = rand() % number;
temp = chr2[i];
chr2[i] = chr2[ran];
chr2[ran] = temp;
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (count1 < number)
{
question[i][j] = chr1[count1];
count1++;
}
//한 쌍이 필요하므로
else
{
question[i][j] = chr1[chr2[count2]];
count2++;
}
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
gotoxy(3 + 4 * j, 2 + 2 * i);
printf("%2c", question[i][j]);
}
}
}
[5번]
/*
응용 11.3.1에서 정답화면은 약 5초간 사용자에게 표시됩니다.
게임의 난이도(상, 중, 하)를 입력 받도록 하여 정답 화면이 보여지는 시간을 제어할 수 있도록 수정하시오
*/
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <Windows.h>
int intro_game(void);
void draw_check02(int r, int c);
void gotoxy(int x, int y);
void number_display(int n);
void display_rule(int n, char question[][10]);
void make_question(int n, char question[][10]);
void game_control(char question[][10], int n, int *count);
void clear_text(void);
int main(void)
{
int n, count = 0;
char question[10][10] = { 0 };
char answer[10][10] = { 0 };
long pst, seconds, minutes;
clock_t start, end;
srand((unsigned)time(NULL));
n = intro_game();
system("cls");
draw_check02(n, n);
number_display(n);
display_rule(n, question);
number_display(n);
start = clock();
do
{
game_control(question, n, &count);
} while (count < n*n / 2);
gotoxy(2, 18);
printf("모두 맞았습니다. 종료합니다. \n");
end = clock();
pst = (end - start) / CLK_TCK;
minutes = pst / 60;
seconds = pst - minutes * 60;
gotoxy(2, 19);
printf("경과시간: %ld분 %ld초\n", minutes, seconds);
return 0;
}
void gotoxy(int x, int y)
{
COORD Pos = { x - 1, y - 1 };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);
}
/*
확장된 바둑판 그리기 함수 draw_check02
*/
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");
}
/*
게임 설명과 격자판의 크기를 입력받는 함수 intro_game
*/
int intro_game(void)
{
int n;
system("cls");
printf("문자 퍼즐 맞추기\n\n");
printf("격자모양의 판에 숨겨진 두 개의 문자를 찾는 \n");
printf("게임입니다. \n\n");
printf("행의 숫자(4 또는 6)를 입력하고 Enter> ");
scanf("%d", &n);
return n;
}
/*
게임의 규칙을 출력하는 함수 display_rule
*/
void display_rule(int n, char question[][10])
{
int level;
gotoxy(2, 14);
printf("위와 같은 격자모양의 숫자 뒤에는 \n");
gotoxy(2, 15);
printf("같은 모양의 문자가 두개씩 숨어 있습니다. \n");
gotoxy(2, 16);
printf("난이도를 정하시오(상:0, 중:1, 하:2) >");
scanf("%d", &level);
gotoxy(2, 17);
printf("아무키나 누르면 정답화면이 잠시 나타납니다. \n");
getch();
clear_text();
make_question(n, question);
gotoxy(2, 14);
printf("정답화면은 위와 같습니다. \n");
gotoxy(2, 15);
if (level == 0)
{
printf("3초 뒤에 문제 풀이를 시작합니다.\n");;
Sleep(3000);
}
else if (level == 1)
{
printf("5초 뒤에 문제 풀이를 시작합니다.\n");
Sleep(5000);
}
else
{
printf("7초 뒤에 문제 풀이를 시작합니다.\n");
Sleep(7000);
}
clear_text();
}
/*
같은 문자를 찾는 게임을 제어하는 함수 game_control
*/
void game_control(char question[][10], int n, int *count)
{
int user1, user2, row1, row2, col1, col2;
gotoxy(2, 14);
printf("첫번째 숫자를 입력하고 Enter> ");
scanf("%d", &user1);
row1 = user1 / n;
col1 = user1%n;
printf("두번째 숫자를 입력하고 Enter> ");
scanf("%d", &user2);
row2 = user2 / n;
col2 = user2%n;
if (question[row1][col1] == question[row2][col2])
{
*count = *count + 1;
gotoxy(28, 4);
printf("맞은 개수:%2d개(총 %2d개)", *count, n * 2);
gotoxy(3 + 4 * col1, 2 + 2 * row1);
printf("%2c", question[row1][col1]);
gotoxy(3 + 4 * col2, 2 + 2 * row2);
printf("%2c", question[row2][col2]);
gotoxy(2, 16);
printf("맞았습니다. 아무키나 누르면 다시 시작합니다. ");
getch();
clear_text();
}
else
{
gotoxy(3 + 4 * col1, 2 + 2 * row1);
printf("%2c", question[row1][col1]);
gotoxy(3 + 4 * col2, 2 + 2 * row2);
printf("%2c", question[row2][col2]);
Sleep(3000);
gotoxy(3 + 4 * col1, 2 + 2 * row1);
printf("%2d", user1);
gotoxy(3 + 4 * col2, 2 + 2 * row2);
printf("%2d", user2);
gotoxy(2, 16);
printf("틀렸습니다. 아무키나 누르면 시작합니다. ");
getch();
clear_text();
}
}
/*
화면의 내용을 지우는 함수 clear_text
*/
void clear_text(void)
{
for (int i = 14; i <= 17; i++)
{
gotoxy(2, i);
for (int j = 0; j < 50; j++)
printf(" ");
}
}
/*
숫자를 출력하는 함수 number_display
*/
void number_display(int n)
{
int count = 0;
for (int i = 0; i<n; i++)
for (int j = 0; j < n; j++)
{
gotoxy(3 + 4 * j, 2 + 2 * i);
printf("%2d", count);
count++;
}
}
/*
문제를 생성하는 make_question
*/
void make_question(int n, char question[][10])
{
int number, ran, count1 = 0, count2 = 0;
char chr1[26], chr2[26], temp;
srand((unsigned)time(NULL));
number = n*n / 2;
for (int i = 0; i < 26; i++)
{
chr1[i] = 65 + i;
chr2[i] = i;
}
for (int i = 0; i < number; i++)
{
ran = rand() % number;
temp = chr1[i];
chr1[i] = chr1[ran];
chr1[ran] = temp;
}
for (int i = 0; i < number; i++)
{
ran = rand() % number;
temp = chr2[i];
chr2[i] = chr2[ran];
chr2[ran] = temp;
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (count1 < number)
{
question[i][j] = chr1[count1];
count1++;
}
//한 쌍이 필요하므로
else
{
question[i][j] = chr1[chr2[count2]];
count2++;
}
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
gotoxy(3 + 4 * j, 2 + 2 * i);
printf("%2c", question[i][j]);
}
}
}
[6번]
/*
격자판에 표시된 숫자나 문자 중에서 특정한 숫자나 문자가 몇개인가를 제한 시간 내에 맞히는 게임 프로그램을 작성하시오
*/
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <Windows.h>
int intro_game(void);
void draw_check02(int r, int c);
void gotoxy(int x, int y);
void alphabet_display(char **arr, int n);
int create_alphabet(char **arr, int n);
void display_rule(int n);
int main(void)
{
int n, answer = -1;
char **arr;
long pst, seconds, minutes;
clock_t start, end;
srand((unsigned)time(NULL));
n = intro_game();
system("cls");
arr = (char**)malloc(sizeof(char*)*n);
for (int i = 0; i < n; i++)
arr[i] = (char*)malloc(sizeof(char)*n);
display_rule(n);
int result=create_alphabet(arr, n);
start = clock();
draw_check02(n, n);
alphabet_display(arr, n);
do
{
end = clock();
gotoxy(2, 14);
printf("'b'의 갯수는? ");
if (kbhit())
{
scanf("%d", &answer);
}
pst = (end - start) / CLK_TCK;
} while (answer == -1 && pst < 2*n);
gotoxy(2, 18);
if (answer == -1)
printf("시간 초과!");
else
{
if (answer == result)
{
printf("맞았습니다\n");
minutes = pst / 60;
seconds = pst - minutes * 60;
gotoxy(2, 19);
printf("경과시간: %ld분 %ld초\n", minutes, seconds);
}
else
{
printf("틀렸습니다. 답은 %d입니다", result);
}
}
for (int i = 0; i < n; i++)
free(arr[i]);
free(arr);
return 0;
}
void gotoxy(int x, int y)
{
COORD Pos = { x - 1, y - 1 };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);
}
/*
확장된 바둑판 그리기 함수 draw_check02
*/
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");
}
/*
게임 설명과 격자판의 크기를 입력받는 함수 intro_game
*/
int intro_game(void)
{
int n;
system("cls");
printf("특정문자 갯수 맞추기\n\n");
printf("격자모양의 판에 나타난 특정 문자의 개수를 맞추는 \n");
printf("게임입니다. \n\n");
printf("행의 숫자를 입력하고 Enter> ");
scanf("%d", &n);
return n;
}
/*
게임의 규칙을 출력하는 함수 display_rule
*/
void display_rule(int n)
{
system("cls");
printf("격자모양에는 'b'와 'd'가 있습니다.\n");
printf("%d초안에 'b'의 갯수를 맞추시오\n", 2*n);
printf("아무키나 누르면 게임이 시작됩니다. \n");
getch();
system("cls");
}
/*
문자를 생성하는 함수
*/
int create_alphabet(char **arr, int n)
{
int count = 0;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
int random = rand() % 2;
if (random)
{
arr[i][j] = 'b';
count++;
}
else
arr[i][j] = 'd';
}
}
return count;
}
/*
숫자를 출력하는 함수 number_display
*/
void alphabet_display(char **arr, int n)
{
for (int i = 0; i<n; i++)
for (int j = 0; j < n; j++)
{
gotoxy(3 + 4 * j, 2 + 2 * i);
printf("%2c", arr[i][j]);
}
}
개발환경:Visual Studio 2017
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
[참고] 명품 C언어 프로젝트 안기수 저
'C > 명품 C언어 프로젝트(안기수 저)' 카테고리의 다른 글
명품 C언어 프로젝트 11.3장 같은 문자 찾는 게임 (0) | 2017.11.18 |
---|---|
명품 C언어 프로젝트 11.2장 바이오리듬 개선과 확장 (0) | 2017.11.14 |
명품 C언어 프로젝트 11.2장 바이오리듬 (0) | 2017.11.12 |
명품 C언어 프로젝트 11.1장 디지털 주판 (0) | 2017.11.04 |
명품 C언어 프로젝트 10.5장 설문 조사 프로그램 (0) | 2017.10.30 |