C语言读取文件数据用冒泡排序实现2048游戏排行榜如何开发?
2048游戏排行榜实现方案
你的现有实现思路复杂度偏高,直接在文件IO流中做排序逻辑非常难落地,推荐采用「内存中处理所有数据再统一写回文件」的逻辑,实现成本低且不易出错。
推荐实现步骤
- 定义单条排行记录的结构体,存储用户名、分数、移动次数三个核心字段
- 读取现有排行榜文件的所有内容,解析后存入结构体数组
- 将本次新对局的记录追加到结构体数组中
- 对结构体数组按分数降序排序,分数相同可按移动次数升序排序
- 截断结构体数组只保留前10条数据
- 把前10条数据按格式覆盖写入原排行榜文件即可
现有代码已知问题
- 变量名错误:
prt = fopen(...)和定义的ptr不匹配,strstr的第一个参数linha应为line,都会直接导致编译报错 feof的使用逻辑错误:feof是在读取操作失败后才会标记文件结束,直接用while(!feof(ptr))会导致多读取一次无效内容- 异常分支未终止逻辑:判断
ptr == NULL打印错误后没有退出,后续仍会执行fclose(ptr)导致程序崩溃
可运行示例代码
#include <stdio.h> #include <string.h> #include <stdlib.h> // 定义排行记录结构体 typedef struct { char name[50]; int score; int movements; } RankItem; // 排序比较函数:按分数降序,分数相同按步数升序 int cmpRank(const void* a, const void* b) { const RankItem* itemA = (const RankItem*)a; const RankItem* itemB = (const RankItem*)b; if (itemA->score != itemB->score) { return itemB->score - itemA->score; } return itemA->movements - itemB->movements; } void updateRank(char* name, int score, int movements) { RankItem ranks[11] = {0}; // 最多存11条:旧的10条+新的1条 int count = 0; // 读取现有排行榜数据 FILE* ptr = fopen("Placar.txt", "r"); if (ptr != NULL) { char line[150]; while (fgets(line, 150, ptr) != NULL && count < 10) { // 解析每行数据 if (sscanf(line, "%*d: Name: %49s - Score: %d - Movements: %d", ranks[count].name, &ranks[count].score, &ranks[count].movements) == 3) { count++; } } fclose(ptr); } // 加入新记录 strncpy(ranks[count].name, name, 49); ranks[count].score = score; ranks[count].movements = movements; count++; // 排序 qsort(ranks, count, sizeof(RankItem), cmpRank); // 只保留前10条,覆盖写回文件 ptr = fopen("Placar.txt", "w"); if (ptr == NULL) { printf("Error! 无法打开排行榜文件\n"); return; } for (int i = 0; i < count && i < 10; i++) { fprintf(ptr, "%d: Name: %s - Score: %d - Movements: %d\n", i+1, ranks[i].name, ranks[i].score, ranks[i].movements); } fclose(ptr); }
你可以直接调用updateRank函数传入本次对局的用户名、分数、移动次数即可完成排行榜更新,不需要额外处理排序和截断逻辑。
内容的提问来源于stack exchange,提问作者bartche
相关产品推荐
相关产品推荐

