利用栈和队列,判断扑克游戏小猫钓鱼(火车头)的winner

小哼和小哈玩小猫钓鱼。

小猫钓鱼规则:将一份扑克牌平均分成两份,每人拿一份。小哼先拿出手中的第一张扑克牌放在桌上,然后小哈也拿出手中的第一张扑克牌,并放在小哼刚打出的扑克牌的上面,就像这样两人交替出牌。出牌时,如果某人打出的牌与桌上某张牌的牌面相同,即将两张相同的牌及其中间所夹的牌全部取走,并依次放到自己手中牌的末尾。当任意一人手中的牌全部出完时,游戏结束,对手获胜。

首先根据规则,很容易将手牌与队列联系在一起(尾插首删),将出牌的牌堆模拟为栈。
两人不管有没有赢牌,都会换对手出牌。而出牌的结果有两种,一种为赢牌,一种为未赢。所以找到合适的判断条件,一个while循环就可以知道结果。
(此例代码判断的是一人六张手牌)

#include <stdlib.h>
#include <stdio.h>
//模拟每个人手中的牌组
struct queue
{
    int data[1000];
    int head;
    int tail;
};
//模拟桌上的打出的牌堆
struct Stack
{
    int top;
    int data[20];
};
int main()
{   
    //小哼先出牌
    struct queue heng,ha;
    struct Stack stack;
    //队列栈初始化,队列从1开始
    heng.head=1;
    heng.tail=1;
    ha.head=1;
    ha.tail=1;
    stack.top=0;    int i;  //循环变量i,接下来进行为队列赋值,也就是模拟手牌
    for(i=0; i<6; i++)
    {
        scanf("%d",&heng.data[heng.tail]);
        heng.tail++;
    }
    for(i=0; i<6; i++)
    {
        scanf("%d",&ha.data[ha.tail]);
        ha.tail++;
    }
    
    //判断游戏是否结束,当有一人的head和tail相等时,可判定游戏结束
    while(heng.head!=heng.tail && ha.head!=ha.tail)
    {
        int t=heng.data[heng.head]; //模拟小哼打出手牌,将手牌值赋给t
        int flag=0;     //flag标志位,判断打出的牌堆中是否有相同的牌
        for(i=0; i<stack.top; i++)  //将牌堆中的每一张牌进行遍历,如过有相同则将flag置为1
        {
            if(t==stack.data[i])
            {
                flag=1;
                break;
            }
        }
        //无相同的牌
        if(flag==0)
        {
            heng.head++;    //将第一张牌出队
            stack.data[stack.top]=t;    //将t入栈
            stack.top++;    //栈顶++
        }
        //有相同的牌
        if(flag==1)
        {
            heng.head++;    //不管怎样,head必然要先++
            stack.data[stack.top]=t;    //先将打出的牌入栈,方便统一管理
            stack.top++;
            while(stack.top>=i) //在判断flag时就已经得与t相同的牌的位置,为i。将top与i之间的牌入队(包括top和i)
            {
                heng.data[heng.tail]=stack.data[--stack.top];
                heng.tail++;
            }
        }
        
        //小哈的两种情况与小哼的处理类似
        t=ha.data[ha.head];
        flag=0;
        for(i=0; i<stack.top; i++)
        {
            if(t==stack.data[i])
            {
                flag=1;
                break;
            }
        }
        if(flag==0)
        {
            ha.head++;
            stack.data[stack.top]=t;
            stack.top++;
        }
        if(flag==1)
        {
            ha.head++;
            stack.data[stack.top]=t;
            stack.top++;
            while(stack.top>=i)
            {
                ha.data[ha.tail]=stack.data[--stack.top];
                ha.tail++;
            }
        }
    }
    //判断谁赢
    if(heng.head==heng.tail)
    {
        printf("小哈获胜!\n");
     }
     else
     printf("小哼获胜!");
     return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值