纸牌游戏-小猫钓鱼

规则:将一副扑克(10个)平均分成两份,每人拿一份。A先将手中第一张扑克放在桌子上,B也拿出手上第一张扑克,并放在A刚放在桌子上的牌的上面,两人交替出牌。如果某人打出的牌与桌面上的某张牌相同,即将两张相同的牌全部取走并放在自己手牌的末尾。当一方手中牌全部出完时游戏结束,对手获胜。
【纸牌游戏-小猫钓鱼】思路:

  1. A和B出牌收牌的过程符合队列的先进先出,可以使用两个队列模拟A和B手中的牌;
  2. 桌子上的牌符合栈的后进后出,可以使用一个栈模拟桌子上的牌;
  3. 设立int book[10]记录每个数字在桌子上是否出现过;
  4. 游戏结束条件,某一方队列为空(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; }

    推荐阅读