纸牌游戏——兄弟俩的“博弈”(栈和队列的应用)

小风和小雷是一起玩到大的双胞胎兄弟,星期天,小风和小雷在一起玩桌游,他们正在玩一个非常古怪的扑克游戏——“小猫钓鱼”。游戏规则是这样的:将一副扑克牌平均分成两份,每人拿一份。小风先拿出手中的第一张扑克牌放在桌子上,然后小雷也拿出手中的第一张扑克牌,并放在小风刚打出的扑克牌的上面,就像这样两人交替出牌。出牌时,如果某人打出的牌与桌上的某张牌的牌面相同,即可将两张相同的牌及其中间所夹的牌全部取走,并依次放到自己手中牌的末尾。当任意一个手中的牌全部出完时,游戏结束,对手获胜。
在这里插入图片描述
代码如下

#include <stdio.h>
#include <malloc.h>
struct Stack//创建一个栈
{
  int top;
  int base;
  int *elem;
};
struct Queue//创建一个队列
{
    int head;
    int tail;
    int *elem;
};
void initStack(Stack &stack)//初始化栈
{
    stack.top=0;
    stack.base=0;
    stack.elem=(int *)malloc(sizeof(int)*1000);
}
void pushStack(Stack &stack,int elem)//入栈
{
    stack.top++;
    stack.elem[stack.top]=elem;

}
void popStack(Stack &stack)//出栈
{
    stack.top--;
}
void showStack(Stack &stack)//打印栈内元素
{
    while(stack.top!=stack.base)
    {
        printf("%d ",stack.elem[stack.top]);
        stack.top--;
    }
    printf("\n");
}
void initQueue(Queue &queue)//初始化队列
{
    queue.head=0;
    queue.tail=0;
    queue.elem=(int *)malloc(sizeof(int)*1000);
}
void pushQueue(Queue &queue,int elem)//入队
{
    queue.elem[queue.tail]=elem;
    queue.tail++;
}
void popQueue(Queue &queue)//出队列
{
    queue.head++;
}
void showQueue(Queue &queue)//输出队列元素
{
    while(queue.head!=queue.tail)
    {
        printf("%d ",queue.elem[queue.head]);
        queue.head++;
    }
    printf("\n");
}
int main()
{
    Stack table;//创建一个桌子栈
    Queue xiaoFeng,xiaoLei;//创建两个队列
    int elem1,elem2;
    initQueue(xiaoFeng);
    initQueue(xiaoLei);
    initStack(table);
    int book[9]={0};//使用桶排序的思想,记录是否有相同的牌出现
    printf("请输入小风的牌:\n");
    for(int i=0;i<6;i++)
    {
        scanf("%d",&elem1);
        pushQueue(xiaoFeng,elem1);
    }
    printf("请输入小雷的牌:\n");
    for(int i=0;i<6;i++)
    {
        scanf("%d",&elem2);
        pushQueue(xiaoLei,elem2);
    }
    while(xiaoLei.head<xiaoLei.tail&&xiaoFeng.head<xiaoFeng.tail)//两人手内都有牌的情况
    {
        int t = xiaoFeng.elem[xiaoFeng.head];//把小风的第一张牌放在桌子上
        if(book[t]==0)//如果桌子上没有小风的第一张牌
        {
            popQueue(xiaoFeng);//小风去掉第一张
            pushStack(table,t);//桌子上放上小风的第一张牌
            book[t]=1;//把标志位置位
        }
        else//如果有小风的牌
        {
            popQueue(xiaoFeng);//先放在桌子上
            pushQueue(xiaoFeng,t);//然后把在拿走
            while(table.elem[table.top]!=t)//这个循环是把t之后的牌都拿走
            {
                book[table.elem[table.top]]=0;
                pushQueue(xiaoFeng,table.elem[table.top]);
                popStack(table);
            }
            book[table.elem[table.top]]=0;//最后把和t相等的牌拿走
            pushQueue(xiaoFeng,table.elem[table.top]);
            popStack(table);
        }
        if(xiaoFeng.head==xiaoFeng.tail)//如果小风的牌没了,就不用比了,直接小雷胜出了
        {
            break;
        }
        t=xiaoLei.elem[xiaoLei.head];//下面的代码和上面的类似
        if(book[t]==0)
        {
            popQueue(xiaoLei);
            pushStack(table,t);
            book[t]=1;
        }
        else
        {
            popQueue(xiaoLei);
            pushQueue(xiaoLei,t);
            while(table.elem[table.top]!=t)
            {
                book[table.elem[table.top]]=0;
                pushQueue(xiaoLei,table.elem[table.top]);
                popStack(table);
            }
            book[table.elem[table.top]]=0;
            pushQueue(xiaoLei,table.elem[table.top]);
            popStack(table);
        }

    }
    if(xiaoLei.head==xiaoLei.tail)//下面是分情况输出
    {
        printf("小风win\n");
        printf("哥哥还是比弟弟稍微厉害那么一点点的\n");
        printf("小风当前手中的牌是 ");
        showQueue(xiaoFeng);
        if(table.top!=table.base)
        {
            printf("桌子上的牌是 ");
            showStack(table);
        }
        else
        {
            printf("桌子上已经没有牌了");
        }
    }
    else
    {
        printf("小雷win\n");
        printf("出师不利,这局重开..\n");
        printf("小雷当前手中的牌是 ");
        showQueue(xiaoLei);
        if(table.top!=table.base)
        {
            printf("桌子上的牌是 ");
            showStack(table);
        }
        else
        {
            printf("桌子上已经没有牌了");
        }
    }
    return 0;
}

运行结果:

请输入小风的牌:
3 1 3 5 6 4
请输入小雷的牌:
2 4 1 2 5 6
小风win
哥哥还是比弟弟稍微厉害那么一点点的
小风当前手中的牌是 3 4 5 3 6 4 1 6 1 2 2
桌子上的牌是 5

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值