--- 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 using namespace std; //声明全局容器栈以及队列 stack Zhuo; queue Heng; queue 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)