用数据结构C语言--来教你摸清纸牌游戏拉火车套路

纸牌游戏–拉火车游戏规则很简单。每人手里有一定数目的纸牌,每人盲放一张,直到有人发出一张和只前出过的一样的牌,就可以把区间的牌收走,最后谁的手里没有拍了 就输了。
根据数据结构的很基础知识,我们现在用队列,和栈的知识来实现拉火车吧。

#include<stdio.h> 
#include<string.h>
//设计一个及其简单的数组队列和栈
struct Stack
{
    int _data[100];
    int top;
};
 struct Queue
 {
     int _data[100];
     int head;
     int tail;
 };

 int main()
 {
     struct Queue q1, q2;
     struct Stack s;
     //定义一个扑克数组存放扑克牌样式种类从1,2,3---k13 种,桌子上那种牌有,对应坐标++,闲置0坐标
     //这里是一种优化,提高效率,具体见 哈希表用法
     int puke[14];
     memset(puke, 0, sizeof(int) * 14);
     //初始化队列和链表
     q1.head = q1.tail = 0;
     q2.head = q2.tail = 0;
     s.top = 0;
     //接受两组成员手中的扑克值假设我们现在是6张牌
     for (int i = 0; i < 6; i++)
     {
         scanf("%d", &q1._data[i]);
         q1.tail++;
     }
     for (int i = 0; i < 6; i++)
     {
         scanf("%d", &q2._data[i]);
         q2.tail++;
     }
     //游戏结束条件,每个人手里都有牌、及队列不为空
     while (q1.head < q1.tail && q2.head < q2.tail)
     {
         //假设q1先出牌
         int t = q1._data[q1.head];
         if(puke[t] == 0)
         {
             //桌上没有牌面为t的牌,q1牌-1及队头出值,桌子上多牌,及s+1,puke对应位置+1
             q1.head++;
             s._data[s.top++] = t;
             puke[t] = 1;
         }
         else 
         {
             //有相同的牌,所出牌从对头拿出,放到对尾。
             q1.head++;
             q1._data[q1.tail] = t;
             while (s._data[--s.top - 1] != t)
             {
                 puke[s._data[s.top]] = 0;
                 q1._data[q1.tail++] = s._data[s.top];
             }
         }
         t = q2._data[q2.head];
         if (puke[t] == 0)
         {
             //桌上没有牌面为t的牌,q1牌-1及队头出值,桌子上多牌,及s+1,puke对应位置+1
             q2.head++;
             s._data[s.top++] = t;
             puke[t] = 1;
         }
         else
         {
             //有相同的牌,所出牌从对头拿出,放到对尾。
             q2.head++;
             q2._data[q2.tail] = t;
             while (s._data[--s.top - 1] != t)
             {
                 puke[s._data[s.top]] = 0;
                 q2._data[q2.tail++] = s._data[s.top];
             }
         }
     }
     if (q1.head == q1.tail)
     {
         printf("q2win\n");
     }
     else 
     {
         printf("q1win\n");
     }
     return 0;
}

测试用例q1:2,4,1,2,5,6
q2:3,1,3,5,6,4
结果q2赢

猜你喜欢

转载自blog.csdn.net/weixin_40921797/article/details/81448199