168 lines
4.5 KiB
Markdown
168 lines
4.5 KiB
Markdown
---
|
||
title: 小猫钓鱼
|
||
date: 2022-03-09 00:16:12.409
|
||
updated: 2022-09-05 19:38:40.838
|
||
url: https://hhdxw.top/archives/74
|
||
categories:
|
||
- C&C++
|
||
tags:
|
||
- 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.输出游戏的获胜者,获胜者手中扑克牌,及桌子上的扑克牌。
|
||
|
||
## 三、实现代码如下:
|
||
|
||
```c
|
||
#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](https://yovinchen-1308133012.cos.ap-beijing.myqcloud.com/image-20220309100532330.png) |