Note/大学笔记/C++/小猫钓鱼.md
2024-01-12 16:35:29 +08:00

4.4 KiB
Raw Blame History

title date updated url categories tags
小猫钓鱼 2022-03-09 00:16:12.409 2022-09-05 19:38:40.838 https://hhdxw.top/archives/74
C&C++
C&C++

小猫钓鱼——栈、队列的应用C++

一、游戏规则:

将一副扑克牌假设牌面只有1~9平均分成两份每人拿一份。小哼先拿出手中的第一张扑克牌放在桌子上然后小哈也拿出手中的第一张扑克牌放在小哼刚打出的扑克牌的上面就这样两人交替出牌。出牌时如果某人打出的扑克牌与桌面上某张扑克牌的牌面相同即将两张相同的扑克牌及中间所夹的牌全部取走依次放在自己手中牌的末尾。当任意一人手中的牌全部出完时游戏结束对手获胜。

假如游戏开始时小哼手中有6张牌顺序为2、4、1、2、5、6小哈手中也有6张牌顺序为3、1、3、5、6、4最终谁会获胜呢

请编写一个程序来自动判断谁将获胜。

二、游戏分析:

1.手中的牌构成一个队列。

2.出牌和赢牌对应出队和入队两个操作。

3.桌子相当于一个栈,每打出一张牌放到桌子上相当于入栈。

游戏开始:

1.小哼先出牌。小哼亮出一张牌t检查桌面上是否存在相同的牌面。若不存在则此轮没有赢牌否则此轮可以赢牌。

用数组book标记桌面上是否存在相同的牌面。

若桌面上不存在相同的牌面则小哼出牌t出队将t放到桌面上入栈进行标记。

若桌面上存在相同的牌面则先把t放到手中牌的末尾先出队再入队然后从桌面上把压在与t相同牌面之上的扑克牌依次取走放入手中牌的末尾最后从桌面上把压在与t相同牌面的牌也收入手中同时进行标记。

2.游戏如何结束。只要两人中有一人的牌用完了,游戏就结束了。

3.输出游戏的获胜者,获胜者手中扑克牌,及桌子上的扑克牌。

三、实现代码如下:

#include <bits/stdc++.h>
using namespace std; 

//声明全局容器栈以及队列 
stack <int> Zhuo;
queue <int> Heng;
queue <int> Ha;
    
int main()
{
    int q;
//    book记录桌上牌的数量 
    int book[10];
    for(int i = 1;i <= 9;i++)
    book[i] = 0;
    
    cout << "请按顺序输入小哼卡牌的数字" << endl;
    int arr[] {2,4,1,2,5,6};
	for(int i=0;i<6;i++)
    {
//    	两种输入方式用数组方便写的时候检查bug 
//    	cin >> q;
//    	Heng.push(q);
		Heng.push(arr[i]);
    }
    
    cout << "请按顺序输入小哈卡牌的数字" << endl;
    int all[] {3,1,3,5,6,4};
	for(int i=0;i<6;i++)
    {
//    	cin >> q;
//    	Ha.push(q);
		Ha.push(all[i]);
    }
    
    //检查小哼和小哈是否有人手中无牌,输得比赛 
    while(Heng.empty() != true && Ha.empty() != true )
    {
    	//将小哼的队列头元素赋值给q用于检测是否有重复 
    	q = Heng.front();
    	//判断小哼当前打出的牌是否能贏牌
    	if(book[q] == 0)
    	{
    		//小哼输牌
    		Heng.pop();
    	    Zhuo.push(q);
    	    //调整book中牌的种类 
    		book[q] = 1;
    	}
    	else
    	{
    		//将打出的牌直接放到牌尾 
    		Heng.pop();
    		Heng.push(q);
    		//小哼赢牌
    		while(Zhuo.top() != q)
			{
				//调整book中牌的种类 
				book[Zhuo.top()] = 0;
				Heng.push(Zhuo.top());
				Zhuo.pop();
			} 
    	}
    	//如果小哼中的牌如果已经打完,游戏结束
    	if(Heng.empty() == true)
    	break;
    	
    	q = Ha.front();
    	//判断小哈当前打出的牌是否能贏牌
    	if(book[q] == 0)
    	{	
			//小哈输牌 
    		Ha.pop();
    		Zhuo.push(q);
    		book[q] = 1;
    	}
    	else
    	{
    		Ha.pop();
    		Ha.push(q);
    		//小哈赢牌
    		while(Zhuo.top() != q)
			{
				book[Zhuo.top()] = 0;
				Ha.push(Zhuo.top());
				Zhuo.pop();
			} 
    	}
    }
    
    
    if(Heng.empty() == true)
    {
    	cout << "小哈赢了" << endl;
    	while(Ha.empty() != true)
    	{
    		cout << Ha.front() <<" ";
    		Ha.pop();
    	}
    }
    else 
    {
    	cout << "小哼赢了" << endl;
    	while(Heng.empty() != true)
    	{
    		cout << Heng.front() <<"";
    		Heng.pop();
    	}
    }
    cout << endl;
    cout << "桌上的牌是:" ;
    while (Zhuo.size())
	{
		printf("%d", Zhuo.top());
		Zhuo.pop();
	}
}

四、运行截图

image-20220309100532330