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

