You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言:公牛母牛游戏名人堂带玩家名称排序求助

解决Bulls and Cows游戏名人堂的关联排序问题

嘿,Luke!我看到你在给公牛母牛游戏做名人堂功能时卡壳了——现在只能单独排序猜数的次数,没法把玩家名字和对应的成绩绑定在一起同步排序,对吧?这确实是个常见的新手问题,核心原因是你现在把名字和成绩存在了独立的变量/数组里,排序时自然就脱节了。咱们来一步步搞定它:

核心思路:把玩家信息打包成一个整体

与其用单独的user_name和array分别存名字和成绩,不如用结构体把这两个信息绑定在一起。这样排序的时候,名字和成绩会作为一个单元一起移动,就不会出现错位的情况了。

具体实现步骤

1. 定义存储玩家记录的结构体

在你的代码里先定义一个结构体,用来封装玩家名称和对应的猜数次数:

// 定义玩家记录结构体
typedef struct {
    char name[50];  // 存储玩家输入的名称
    int guessCount; // 存储该玩家的猜数次数(用来排序的核心指标)
} PlayerRecord;

之后你就可以用PlayerRecord类型的数组来存储所有玩家的名人堂记录啦。

2. 修改冒泡排序逻辑,针对结构体数组排序

原来的排序只处理了int数组,现在改成对结构体数组排序,比较的是结构体里的guessCount字段,交换的时候直接交换整个结构体对象:

// 假设records是PlayerRecord类型的数组,ch是数组的元素个数
for (int b = 0; b < ch - 1; b++) { 
    for (int c = 0; c < ch - b - 1; c++) { 
        // 按猜数次数升序排序(次数越少,成绩越好)
        if (records[c].guessCount > records[c + 1].guessCount) { 
            // 交换整个结构体,保证名字和成绩同步移动
            PlayerRecord temp = records[c]; 
            records[c] = records[c + 1]; 
            records[c + 1] = temp; 
        } 
    } 
}

3. 更新输出与文件写入逻辑

现在遍历结构体数组时,就能同时获取到玩家名称和对应的猜数次数,输出和写入文件时也能保持关联:

// 打印到控制台
printf("名人堂排序结果(猜数次数越少越好):\n"); 
for (int b = 0; b < ch; b++) {
    printf("玩家: %s | 猜数次数: %d\n", records[b].name, records[b].guessCount);
}

// 写入文件
FILE* file = fopen("hall_of_fame.txt", "w"); // 记得正确打开文件哦
if (file != NULL) {
    fprintf(file, "名人堂记录:\n");
    for (int b = 0; b < ch; b++) {
        fprintf(file, "%s %d\n", records[b].name, records[b].guessCount);
    }
    fclose(file);
}

额外优化小技巧

如果遇到两个玩家猜数次数相同的情况,你可以再加个排序规则,比如按玩家名称的字典序排列,只需要修改排序的判断条件:

if (records[c].guessCount > records[c + 1].guessCount || 
    (records[c].guessCount == records[c + 1].guessCount && strcmp(records[c].name, records[c + 1].name) > 0)) {
    // 交换逻辑不变
}

这样次数相同的玩家会按名字从A到Z排序,名人堂的规则会更严谨~

内容的提问来源于stack exchange,提问作者Luke Catania

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:22:42