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

C语言编写War卡牌游戏shufflepile函数编译报错问题求解

错误根源

  • 你定义的shufflepile函数仅接收1个link类型的参数,但你在函数内部调用自身时传入了a(link数组,对应类型为struct node**)和n两个参数,既不匹配参数类型要求,也多传了参数,这是报错的直接原因。
  • 课程示例中的shuffle(a,n)是专门用于洗牌数组的独立函数,你没有实现该函数就直接把调用改成shufflepile,导致了函数调用冲突。

修改建议

1. 补充依赖头文件

在代码开头增加随机数相关的头文件:

#include <time.h>

2. 实现数组版洗牌函数

在shufflepile函数前增加数组洗牌的实现,这里用通用的Fisher-Yates洗牌算法:

// 洗牌link数组的专用函数
void shuffle(link a[], int n) {
    for (int i = n - 1; i > 0; i--) {
        int j = rand() % (i + 1);
        link temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }
}

3. 修正shufflepile函数的调用逻辑

把shufflepile内部原来的shufflepile(a, n);替换为调用数组洗牌函数:

link shufflepile(link pile) {
    int i, n;
    struct node *p;
    link a[DECKSIZE];

    for (p = pile, n = 0; p != NULL; p = p->next, n++)
        a[n] = p;

    shuffle(a, n); // 替换为数组洗牌函数调用

    for (i = 0; i < n - 1; i++)
        a[i]->next = a[i + 1];
    a[n-1]->next = NULL;

    return a[0];
}

4. 修复重复定义的全局变量

你在链表结构体定义部分已经声明过link Atop, Abot; link Btop, Bbot;,deal函数前面又重复定义了一次,直接删掉deal函数前的重复声明即可。

5. 初始化随机数种子并调用洗牌逻辑

在main函数开头初始化随机数种子,生成牌堆后先洗牌再发牌:

int main(void) {
    srand((unsigned int)time(NULL)); // 全局只需要初始化一次随机种子
    link deck;
    deck = makepile(DECKSIZE);
    deck = shufflepile(deck); // 新增洗牌调用
    deal(deck);
    printf("PLAYER A\n");
    showpile(Atop);
    printf("\nPLAYER B\n");
    showpile(Btop);
    return 0;
}

修改完成后编译运行即可正常实现洗牌逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 07:06:01