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
相关产品推荐
相关产品推荐

