运用简单队列、栈实现简单纸牌游戏

发布时间:2024-08-08 18:01

案例分析

我们知道栈和队列能实现很多算法。

但是作为初学者,想要实现那些复杂、高深的算法其实挺难的。

那我们能不用用简单队列和栈做一些简单的程序呢?

我们做一个简单的纸牌游戏。

现在假设有玩家A和玩家B玩纸牌游戏。

假定每人手上6张牌。

玩家A和玩家B轮流出牌。

当某一位玩家出的牌与桌面上的牌相同时,就可以把这两张牌以及中间夹带的N张牌一起拿走放到自己手牌的末尾。

当玩家手上没有牌时,就输。

很显然,桌子上的牌我们可以用栈操作;手上的牌可以用队列实现。

模块分析

我们知道要运用两个工具,但是如何实现他呢?

//用结构体定义队列
struct queue
{
    int data[1000];
    int head;
    int tail;
};

//用结构体定义栈
struct stack
{
    int data[10];
    int top;
};

基本操作完成,接下来呢?

//有了结构体,当然需要定义结构体变量
struct queue q1,q2;
struct stack s;

下一步就是初始化

//初始化队列头尾、栈顶
q1.head=1;
q1.tail=1;
q2.head=1;
q2.tail=1;
s.top=0;

//我们需要一个标记数组,用来判断出的牌跟桌子上的牌是否相同
int book[10]={0};

初始化结束,下面就摸牌!我们用输入的方式实现!

for(int i=1;i<=6;i++)
{
    scanf("%d",q1.data[q1.tail]);
    q1.tail++;
}
for(int i=1;i<=6;i++)
{
    scanf("%d",q2.data[q2.tail]);
    q2.tail++;
}

接下来就到游戏环节啦!

while(q1.head

玩家B的方式与玩家A的方式一样,这里就不写重复了。

下面就是判断游戏的胜负。

if(q1.head==q1.tail)
{
    printf("玩家B赢\n");
    printf("玩家B手上的牌为:\n");
    for(int i=q1.head;i<=q1.tail-1;i++)
        printf("%d ",q1.data[i]);
    if(s.top>0)
    {
        printf("桌子上的牌为:\n");
        for(int i=1;i<=s.top;i++)
            printf("%d ",s.data[i]);
    }
    else
        printf("桌子上没牌\n");
}

玩家A赢的方式与玩家B赢的方式一样,因为懒所以也不写了。

完整代码

#define _CRT_SECURE_NO_WARNINGS
#include 

//定义一个结构体队列用来模拟玩家手中的牌
struct queue
{
	int data[1000];
	int head;
	int tail;
};

//定义一个结构体栈用来模拟桌子上的牌
struct stack
{
	int data[10];
	int top;
};

int main()
{
	//定义结构体变量
	struct queue q1, q2;
	struct stack s;

	//定义一个标记数组,用来判断与桌上的牌是否相同
	int book[10] = { 0 };

	//初始化队列和栈
	q1.head = 1;
	q1.tail = 1;
	q2.head = 1;
	q2.tail = 1;
	s.top = 0;

	//用scanf函数模拟发牌
	for (int i = 1; i <= 6; i++)
	{
		scanf("%d", &q1.data[q1.tail]);
		q1.tail++;
	}
	for (int i = 1; i <= 6; i++)
	{
		scanf("%d", &q2.data[q2.tail]);
		q2.tail++;
	}

	//模拟玩家放牌
	int t = 0;//定义一个放牌的临时变量
	while (q1.head < q1.tail && q2.head < q2.tail)
	{
		//模拟玩家1放牌
		t = q1.data[q1.head];

		//当桌子上没有这张牌时
		if (book[t] == 0)
		{
			//出队
			q1.head++;
			//将牌放入栈中(即桌子上)
			s.top++;
			s.data[s.top] = t;
			book[t] = 1;
		}

		//当桌子上有这张牌时
		else
		{
			//出队
			q1.head++;

			//将桌子上的牌放入队尾
			q1.data[q1.tail] = t;
			q1.tail++;

			//按照规则一直拿牌
			while (s.data[s.top] != t)
			{
				//取消标记
				book[s.data[s.top]] = 0;

				q1.data[q1.tail] = s.data[s.top];
				q1.tail++;
				s.top--;
			}
			book[s.data[s.top]] = 0;
			q1.data[q1.tail] = s.data[s.top];
			q1.tail++;
			s.top--;
		}
		if (q1.head == q1.tail)
			break;
		//模拟玩家2放牌
		t = q2.data[q2.head];

		//当桌子上没有这张牌时
		if (book[t] == 0)
		{
			//出队
			q2.head++;
			//将牌放入栈中(即桌子上)
			s.top++;
			s.data[s.top] = t;
			book[t] = 1;
		}

		//当桌子上有这张牌时
		else
		{
			//出队
			q2.head++;

			//将桌子上的牌放入队尾
			q2.data[q2.tail] = t;
			q2.tail++;

			//按照规则一直拿牌
			while (s.data[s.top] != t)
			{
				//取消标记
				book[s.data[s.top]] = 0;

				q2.data[q2.tail] = s.data[s.top];
				q2.tail++;
				s.top--;
			}
			book[s.data[s.top]] = 0;
			q2.data[q2.tail] = s.data[s.top];
			q2.tail++;
			s.top--;
		}
	}

	//判断游戏胜负
	if (q2.head == q2.tail)
	{
		printf("玩家A赢\n");
		printf("玩家A手上的牌为\n");
		for (int i = q1.head; i <= q1.tail - 1; i++)
			printf("%d ", q1.data[i]);
		printf("\n");
		if (s.top > 0)
		{
			printf("桌子上的牌为\n");
			for (int i = 1; i <= s.top; i++)
				printf("%d ", s.data[i]);
		}
		else
			printf("桌子上没牌\n");
	}
	else
	{
		printf("玩家B赢\n");
		printf("玩家B手上的牌为\n");
		for (int i = q2.head; i <= q2.tail - 1; i++)
			printf("%d ", q2.data[i]);
		printf("\n");
		if (s.top > 0)
		{
			printf("桌子上的牌为\n");
			for (int i = 1; i <= s.top; i++)
				printf("%d ", s.data[i]);
		}
		else
			printf("桌子上没牌\n");
	}
	return 0;
}

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号