该游戏可以由程序随机产生一个N位数字,或由用户输入一个N位数字,作为待猜测数字(各位数字不重复出现)。玩游戏者开始猜测后,可以有M次机会输入数字来匹配上面的待猜测数字。用户每输入一次,系统给出本次猜测结果:A表示位置正确且数字正确,B表示数字正确而位置不正确。比如:2A1B,表示2位位置正确且数字正确,1位数字正确但是位置不正确。
某次猜中后,游戏结束。若M次机会用完,游戏也结束。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// 生成 n 位不重复的随机数
void generateRandomNumber(int* nums, int n) {
int i, j, t;
srand(time(NULL));
for (i = 0; i < n; i++) {
// 保证不重复
do {
t = rand() % 10;
for (j = 0; j < i; j++) {
if (nums[j] == t) {
break;
}
}
} while (j < i);
nums[i] = t;
}
}
// 判断两个数是否匹配,并返回 A 和 B 的数量
void judge(int* ans, int* guess, int n, int* a, int* b) {
int i, j;
*a = *b = 0;
for (i = 0; i < n; i++) {
if (ans[i] == guess[i]) {
(*a)++;
} else {
for (j = 0; j < n; j++) {
if (ans[i] == guess[j]) {
(*b)++;
break;
}
}
}
}
}
int main() {
const int MAX_CHANCES = 10; // 最多猜测次数
int nums[10], ans[10], guess[10];
int n, m, i, j, a, b;
char input[20];
// 输入随机数位数
printf("请输入随机数的位数:");
fgets(input, sizeof(input), stdin);
n = atoi(input);
// 随机生成待猜测数字
generateRandomNumber(ans, n);
printf("已经生成了一个%d位的随机数,请开始猜测。", n);
// 开始猜测
for (m = 1; m <= MAX_CHANCES; m++) {
printf("\n第%d次猜测:", m);
fgets(input, sizeof(input), stdin);
for (i = 0; i < n; i++) {
guess[i] = input[i] - '0';
}
judge(ans, guess, n, &a, &b);
if (a == n) { // 猜中了
printf("恭喜你,猜对了!\n");
break;
} else {
printf("%dA%dB。\n", a, b);
}
}
if (m > MAX_CHANCES) { // 次数用完了
printf("很遗憾,没有猜中。正确答案是:");
for (i = 0; i < n; i++) {
printf("%d", ans[i]);
}
}
return 0;
}