规则:将一副扑克(10个)平均分成两份,每人拿一份。A先将手中第一张扑克放在桌子上,B也拿出手上第一张扑克,并放在A刚放在桌子上的牌的上面,两人交替出牌。如果某人打出的牌与桌面上的某张牌相同,即将两张相同的牌全部取走并放在自己手牌的末尾。当一方手中牌全部出完时游戏结束,对手获胜。
【纸牌游戏-小猫钓鱼】思路:
- A和B出牌收牌的过程符合队列的先进先出,可以使用两个队列模拟A和B手中的牌;
- 桌子上的牌符合栈的后进后出,可以使用一个栈模拟桌子上的牌;
- 设立
int book[10]
记录每个数字在桌子上是否出现过; - 游戏结束条件,某一方队列为空(head == tail);
#includetypedef struct queue {
int date[1000];
int head;
int tail;
}Que;
typedef struct stack {
int date[12];
int top;
}Stk;
int main() {
Que qa, qb;
Stk s;
int book[10] = {0};
int i, k;
//初始化
qa.head = qa.tail = 0;
qb.head = qb.tail = 0;
s.top = -1;
//输入数据
for (i = 0;
i < 6;
i++) {
scanf("%d", &qa.date[qa.tail++]);
}
for (i = 0;
i < 6;
i++) {
scanf("%d", &qb.date[qb.tail++]);
} while (qa.head < qa.tail && qb.head < qb.tail) {//双方手牌不为空 开始游戏
s.date[++s.top] = qa.date[qa.head++];
//A出牌
if (book[s.date[s.top]] == 1) {//此牌在桌子上出现过
k = s.date[s.top];
//保存数值
qa.date[qa.tail++] = s.date[s.top--];
//因为桌子上存在这张牌,将此牌入队,从桌子上出栈
while (s.date[s.top] != k) {//将两牌间的牌放入A的队列
book[s.date[s.top]] = 0;
//重置book
qa.date[qa.tail++] = s.date[s.top--];
}
qa.date[qa.tail++] = s.date[s.top--];
//数值相同的牌放入A的队列
book[k] = 0;
//重置book
} else {//没出现过
book[s.date[s.top]] = 1;
//标记数字出现了一次
}
if (qa.head == qa.tail) {
break;
//游戏结束
}s.date[++s.top] = qb.date[qb.head++];
//B出牌
if (book[s.date[s.top]] == 1) {//此牌在桌子上出现过
k = s.date[s.top];
//保存数值
qb.date[qb.tail++] = s.date[s.top--];
//因为桌子上存在这张牌,将此牌入队,从桌子上出栈
while (s.date[s.top] != k) {//将两牌间的牌放入B的队列
book[s.date[s.top]] = 0;
qb.date[qb.tail++] = s.date[s.top--];
}
qb.date[qb.tail++] = s.date[s.top--];
//数值相同的牌放入B的队列
book[k] = 0;
//重置book
} else {//没出现过
book[s.date[s.top]] = 1;
//标记数字出现了一次
}
if (qb.head == qb.tail) {
break;
//游戏结束
}
} if (qa.head == qa.tail) {
printf("B胜利\n");
printf("B的手牌:");
for (i = qb.head;
i < qb.tail;
i++) {
printf("%d ", qb.date[i]);
}
printf("\n桌上的牌:");
for (i = 0;
i <= s.top;
i++) {
printf("%d ", s.date[i]);
}
printf("\n");
} else {
printf("A胜利\n");
printf("A的手牌:");
for (i = qa.head;
i < qa.tail;
i++) {
printf("%d ", qa.date[i]);
}
printf("\n桌上的牌:");
for (i = 0;
i <= s.top;
i++) {
printf("%d ", s.date[i]);
}
printf("\n");
} return 0;
}
推荐阅读
- 啊哈算法—解救小哈(深度优先搜索)
- Linux服务器开发|记录一次腾讯c/c++ linux后台开发岗面试经历(面试题含答案)
- python|wasm转c调用实战
- ubuntu|ubuntu系统下gcc命令的执行与Makefile的简单使用
- ubuntu|Ubuntu系统里使用gcc和Makefile编译c程序
- 嵌入式开发|ubuntu下使用gcc和Makefile执行c程序
- 数据结构|课程设计(飞机订票系统) 超全
- C语言|初级指针详解
- C语言|动态内存管理与柔性数组