4.4 KiB
4.4 KiB
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++)
一、游戏规则:
将一副扑克牌(假设牌面只有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();
}
}