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

C语言读取文件数据用冒泡排序实现2048游戏排行榜如何开发?

2048游戏排行榜实现方案

你的现有实现思路复杂度偏高,直接在文件IO流中做排序逻辑非常难落地,推荐采用「内存中处理所有数据再统一写回文件」的逻辑,实现成本低且不易出错。

推荐实现步骤

  • 定义单条排行记录的结构体,存储用户名、分数、移动次数三个核心字段
  • 读取现有排行榜文件的所有内容,解析后存入结构体数组
  • 将本次新对局的记录追加到结构体数组中
  • 对结构体数组按分数降序排序,分数相同可按移动次数升序排序
  • 截断结构体数组只保留前10条数据
  • 把前10条数据按格式覆盖写入原排行榜文件即可

现有代码已知问题

  1. 变量名错误:prt = fopen(...)和定义的ptr不匹配,strstr的第一个参数linha应为line,都会直接导致编译报错
  2. feof的使用逻辑错误:feof是在读取操作失败后才会标记文件结束,直接用while(!feof(ptr))会导致多读取一次无效内容
  3. 异常分支未终止逻辑:判断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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 11:24:01