C语言编写猜数字小游戏

该游戏可以由程序随机产生一个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;
}