#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
// 게임 규칙을 정의하는 구조체
typedef struct {
int a;
int b;
int rule_number;
long long answer;
} GameQuestion;
void clear_screen() {
// 윈도우
#ifdef _WIN32
system("cls");
// 유닉스/리눅스
#else
system("clear");
#endif
}
// 함수 선언
long long rule1(int a, int b);
long long rule2(int a, int b);
long long rule3(int a, int b);
long long rule4(int a, int b);
long long rule5(int a, int b);
int sum_of_digits(int num);
long long generate_rule5(int a, int b);
void shuffle(int *array, int n);
int is_duplicate_pair(int a1, int b1, int a2, int b2);
int main() {
srand(time(NULL)); // 랜덤 시드 설정
// 규칙 배열 섞기
int rules[5] = {1, 2, 3, 4, 5};
shuffle(rules, 5);
// 문제 배열 생성
GameQuestion questions[5];
for (int i = 0; i < 5; i++) {
// a와 b를 랜덤하게 생성 (1 ~ 100, a != b)
questions[i].a = rand() % 100 + 1;
do {
questions[i].b = rand() % 100 + 1;
} while (questions[i].b == questions[i].a);
questions[i].rule_number = rules[i];
// 규칙에 따른 정답 계산
switch (questions[i].rule_number) {
case 1:
questions[i].answer = rule1(questions[i].a, questions[i].b);
break;
case 2:
questions[i].answer = rule2(questions[i].a, questions[i].b);
break;
case 3:
questions[i].answer = rule3(questions[i].a, questions[i].b);
break;
case 4:
questions[i].answer = rule4(questions[i].a, questions[i].b);
break;
case 5:
questions[i].answer = rule5(questions[i].a, questions[i].b);
break;
}
}
// 문제 출력 및 사용자 입력
for (int i = 0; i < 5; i++) {
int attempts = 0;
int success = 0;
char input[100];
printf("문제 %d - %d @ %d = ?\n", i + 1, questions[i].a, questions[i].b);
while (attempts < 5) {
attempts++;
printf("%d번째 시도 - 예시 정답을 원하시면 두 개의 숫자를 띄어쓰기로 구분하여 써주세요.\n", attempts);
printf("정답을 맞추시려면 '정답'이라고 입력하세요.\n");
// 입력 받기
fgets(input, sizeof(input), stdin);
input[strcspn(input, "\n")] = 0; // 개행 문자 제거
// 입력 처리
if (strcmp(input, "정답") == 0) {
printf("정답을 말해주세요\n");
fgets(input, sizeof(input), stdin);
input[strcspn(input, "\n")] = 0; // 개행 문자 제거
long long user_answer = atoll(input);
if (user_answer == questions[i].answer) {
printf("%d번째 시도 - 정답입니다!\n", attempts);
printf("3초 후 프롬프트가 초기화됩니다.\n");
sleep(3);
clear_screen();
success = 1;
break;
} else {
printf("%d번째 시도 - 오답입니다.\n", attempts);
}
} else {
int input_a, input_b;
if (sscanf(input, "%d %d", &input_a, &input_b) == 2) {
if (is_duplicate_pair(input_a, input_b, questions[i].a, questions[i].b)) {
printf("같은 숫자는 쓸 수 없습니다. 다시 입력해주세요.\n");
--attempts;
continue;
}
long long example_answer;
switch (questions[i].rule_number) {
case 1:
example_answer = rule1(input_a, input_b);
break;
case 2:
example_answer = rule2(input_a, input_b);
break;
case 3:
example_answer = rule3(input_a, input_b);
break;
case 4:
example_answer = rule4(input_a, input_b);
break;
case 5:
example_answer = rule5(input_a, input_b);
break;
}
printf("%d번째 시도 - 예시 정답: %lld\n", attempts, example_answer);
} else {
printf("다시 입력하길 바랍니다.\n");
--attempts;
}
}
}
if (!success) {
printf("실패했습니다. 정답은 %lld입니다.\n", questions[i].answer);
printf("3초 후 프롬프트가 초기화됩니다.\n");
sleep(3);
clear_screen();
}
}
printf("게임이 종료되었습니다.\n");
return 0;
}
long long rule1(int a, int b) {
return (a > b) ? (2 * a + b) : (2 * b + a);
}
long long rule2(int a, int b) {
return (a + b) * 100 + abs(a - b);
}
long long rule3(int a, int b) {
return (a > b) ? (a % b) : (b % a);
}
long long rule4(int a, int b) {
return sum_of_digits(a) * sum_of_digits(b);
}
long long rule5(int a, int b) {
return generate_rule5(a, b);
}
int sum_of_digits(int num) {
int sum = 0;
while (num > 0) {
sum += num % 10;
num /= 10;
}
return sum;
}
long long generate_rule5(int a, int b) {
int count+ = {0};
for (int temp = a; temp > 0; temp /= 10) count[temp % 10]++;
for (int temp = b; temp > 0; temp /= 10) count[temp % 10]++;
char result[100] = "";
for (int i = 9; i >= 0; i--) {
if (count[i] > 0) {
char temp+;
sprintf(temp, "%d%d", i, count[i]);
strcat(result, temp);
}
}
return atoll(result);
}
void shuffle(int *array, int n) {
for (int i = n - 1; i > 0; i--) {
int j = rand() % (i + 1);
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
// 중복 검사 함수
int is_duplicate_pair(int a1, int b1, int a2, int b2) {
return (a1 == a2 && b1 == b2) || (a1 == b2 && b1 == a2);
}
댓글 0