纸牌游戏——小猫钓鱼

来源:互联网 发布:nginx rtmp.exe 编辑:程序博客网 时间:2024/04/29 02:18

星期天小哼和小哈约在一起玩桌游,他们正在玩一个非常古怪的扑克游戏——“小猫钓鱼”。游戏的规则是这样的:将一副扑克牌平均分成两份,每人拿一份。小哼先拿出手中的第一张扑克牌放在桌上,然后小哈也拿出手中的第一张扑克牌,并放在小哼刚打出的扑克牌的上面,就像这样两人交替出牌。出牌时,如果某人打出的牌与桌上某张牌的牌面相同,即可将两张相同的牌及其中间所夹的牌全部取走,并依次放到自己手中牌的末尾。当任意一人手中的牌全部出完时,游戏结束,对手获胜。(用两个队列和一个栈完成)

[cpp] view plain copy
  1. #include <stdio.h>  
  2. //纸牌游戏——小猫钓鱼  
  3. //星期天小哼和小哈约在一起玩桌游,他们正在玩一个非常古怪的扑克游戏——“小猫钓  
  4. //鱼”。游戏的规则是这样的:将一副扑克牌平均分成两份,每人拿一份。小哼先拿出手中的  
  5. //第一张扑克牌放在桌上,然后小哈也拿出手中的第一张扑克牌,并放在小哼刚打出的扑克牌  
  6. //的上面,就像这样两人交替出牌。出牌时,如果某人打出的牌与桌上某张牌的牌面相同,即  
  7. //可将两张相同的牌及其中间所夹的牌全部取走,并依次放到自己手中牌的末尾。当任意一人  
  8. //手中的牌全部出完时,游戏结束,对手获胜。  
  9. struct queue  
  10. {  
  11.     int data[1000];  
  12.     int head;  
  13.     int tail;  
  14. };  
  15. struct stack  
  16. {  
  17.     int data[10];  
  18.     int top;  
  19. };  
  20. int main()  
  21. {  
  22.     struct queue q1,q2;  
  23.     struct stack s;  
  24.     int book[10];  
  25.     int i,t;  
  26.     //初始化队列  
  27.     q1.head=1; q1.tail=1;  
  28.     q2.head=1; q2.tail=1;  
  29.     //初始化栈  
  30.     s.top=0;  
  31.     //初始化用来标记的数组,用来标记哪些牌已经在桌上  
  32.     for(i=1;i<=9;i++)  
  33.         book[i]=0;  
  34.     //依次向队列插入6个数  
  35.     //小哼手上的6张牌  
  36.     for(i=1;i<=6;i++)  
  37.     {  
  38.         scanf("%d",&q1.data[q1.tail]);  
  39.         q1.tail++;  
  40.     }  
  41.     //小哈手上的6张牌  
  42.     for(i=1;i<=6;i++)  
  43.     {  
  44.         scanf("%d",&q2.data[q2.tail]);  
  45.         q2.tail++;  
  46.     }  
  47.     while(q1.head<q1.tail && q2.head<q2.tail ) //当队列不为空的时候执行循环  
  48.     {  
  49.         t=q1.data[q1.head];//小哼出一张牌  
  50.         //判断小哼当前打出的牌是否能赢牌  
  51.         if(book[t]==0) //表明桌上没有牌面为t的牌  
  52.         {  
  53.             //小哼此轮没有赢牌  
  54.             q1.head++; //小哼已经打出一张牌,所以要把打出的牌出队  
  55.             s.top++;  
  56.             s.data[s.top]=t; //再把打出的牌放到桌上,即入栈  
  57.             book[t]=1; //标记桌上现在已经有牌面为t的牌  
  58.         }  
  59.         else  
  60.         {  
  61.             //小哼此轮可以赢牌  
  62.             q1.head++;//小哼已经打出一张牌,所以要把打出的牌出队  
  63.             q1.data[q1.tail]=t;//紧接着把打出的牌放到手中牌的末尾  
  64.             q1.tail++;  
  65.             while(s.data[s.top]!=t) //把桌上可以赢得的牌依次放到手中牌的末尾  
  66.             {  
  67.                 book[s.data[s.top]]=0;//取消标记  
  68.                 q1.data[q1.tail]=s.data[s.top];//依次放入队尾  
  69.                 q1.tail++;  
  70.                 s.top--; //栈中少了一张牌,所以栈顶要减1  
  71.             }  
  72.         }  
  73.         t=q2.data[q2.head]; //小哈出一张牌  
  74.         //判断小哈当前打出的牌是否能赢牌  
  75.         if(book[t]==0) //表明桌上没有牌面为t的牌  
  76.         {  
  77.             //小哈此轮没有赢牌  
  78.             q2.head++; //小哈已经打出一张牌,所以要把打出的牌出队  
  79.             s.top++;  
  80.             s.data[s.top]=t; //再把打出的牌放到桌上,即入栈  
  81.             book[t]=1; //标记桌上现在已经有牌面为t的牌  
  82.         }  
  83.         else  
  84.         {  
  85.             //小哈此轮可以赢牌  
  86.             q2.head++;//小哈已经打出一张牌,所以要把打出的牌出队  
  87.             q2.data[q2.tail]=t;//紧接着把打出的牌放到手中牌的末尾  
  88.             q2.tail++;  
  89.             while(s.data[s.top]!=t) //把桌上可以赢得的牌依次放到手中牌的末尾  
  90.             {  
  91.                 book[s.data[s.top]]=0;//取消标记  
  92.                 q2.data[q2.tail]=s.data[s.top];//依次放入队尾  
  93.                 q2.tail++;  
  94.                 s.top--;  
  95.             }  
  96.         }  
  97.     }  
  98.     if(q2.head==q2.tail)  
  99.     {  
  100.         printf("小哼win\n");  
  101.         printf("小哼当前手中的牌是");  
  102.         for(i=q1.head;i<=q1.tail-1;i++)  
  103.             printf(" %d",q1.data[i]);  
  104.         if(s.top>0) //如果桌上有牌则依次输出桌上的牌  
  105.         {  
  106.             printf("\n桌上的牌是");  
  107.             for(i=1;i<=s.top;i++)  
  108.                 printf(" %d",s.data[i]);  
  109.         }  
  110.         else  
  111.             printf("\n桌上已经没有牌了");  
  112.     }  
  113.     else  
  114.     {  
  115.         printf("小哈win\n");  
  116.         printf("小哈当前手中的牌是");  
  117.         for(i=q2.head;i<=q2.tail-1;i++)  
  118.             printf(" %d",q2.data[i]);  
  119.         if(s.top>0) //如果桌上有牌则依次输出桌上的牌  
  120.         {  
  121.             printf("\n桌上的牌是");  
  122.             for(i=1;i<=s.top;i++)  
  123.                 printf(" %d",s.data[i]);  
  124.         }  
  125.         else  
  126.             printf("\n桌上已经没有牌了");  
  127.     }  
  128.     getchar();getchar();  
  129.     return 0;  
  130. }  
原创粉丝点击