美文网首页
一道简单的“小猫钓鱼”游戏算法

一道简单的“小猫钓鱼”游戏算法

作者: 进击的NULL | 来源:发表于2018-12-25 17:22 被阅读0次

“小猫钓鱼”纸牌游戏规则描述

将一副扑克牌平均分成两份,每人拿一份。小哼先拿出手中的第一张扑克牌放在桌上,然后小哈也拿出手中的第一张扑克牌,并放在小哼刚打出的扑克牌的上面,就像这样两人交替出牌。出牌时,如果某人打出的牌与桌上某张牌的牌面相同,即可将两张相同的牌及其中间所夹的牌全部取走,并依次放到自己手中牌的末尾。当任意一人手中的牌全部出完时,游戏结束,对手获胜。(——这不就是作者小时候喜欢玩的“接火车”游戏么)

几个注意的地方

  • 两个队列、一个栈分别用来模拟两个人手中的牌以及桌子上的牌
  • 一个标记数组book[10],因为假设扑克牌只有0-9之间的数字,巧妙的利用数组下标
  • 这里没有考虑:游戏能否结束。这个不是本算法的侧重点
  • 为了更清晰的表达思路,A、B出牌部分的代码没有重构

代码

package others;
import java.util.Queue;
import java.util.Stack;
import java.util.concurrent.LinkedBlockingQueue;

/**
 * 小猫钓鱼纸牌游戏
 *游戏的规则是这样的:将一副扑克牌平均分成两份,每人拿一份。小哼先拿出手中的
 *第一张扑克牌放在桌上,然后小哈也拿出手中的第一张扑克牌,并放在小哼刚打出的扑克牌
 *的上面,就像这样两人交替出牌。出牌时,如果某人打出的牌与桌上某张牌的牌面相同,即可
 *将两张相同的牌及其中间所夹的牌全部取走,并依次放到自己手中牌的末尾。当任意一人
 *手中的牌全部出完时,游戏结束,对手获胜。
 * @author XZP
 *
 */
public class CatFish {

    public static void main(String[] args) {
        Queue<Integer> queueA = new LinkedBlockingQueue<>();
        Queue<Integer> queueB = new LinkedBlockingQueue<>();
        // 测试数据
        queueA.add(2);
        queueA.add(4);
        queueA.add(1);
        queueA.add(2);
        queueA.add(5);
        queueA.add(6);
        queueB.add(3);
        queueB.add(1);
        queueB.add(3);
        queueB.add(5);
        queueB.add(6);
        queueB.add(4);
        judgeWhoWin(queueA, queueB);
    }
    public static void judgeWhoWin(Queue<Integer> QA, Queue<Integer> QB) {
        Stack<Integer> desk = new Stack<>(); // 模拟桌子
        int tempA, tempB, tempTop;
        int[] book = new int[10]; // 用于标记桌子上是否有该牌面的标记数组
        while (!QA.isEmpty() && !QB.isEmpty()) {
            // 首先A开始出牌
            tempA = QA.poll();
            // 桌子上有同tempA牌面相同的
            if (book[tempA] > 0) { // 有就取走放队尾并将标志位-1
                book[tempA]--;
                QA.add(tempA);
                tempTop = desk.pop();
                while (tempTop != tempA) {
                    book[tempTop]--;
                    QA.add(tempTop);
                    tempTop = desk.pop();
                }
                QA.add(tempTop);
            } else { // 没有就直接入栈,并将标记位+1
                desk.push(tempA);
                book[tempA]++;
            }
            // 轮到B出牌
            tempB = QB.poll();
            // 桌子上有同tempB牌面相同的
                        if (book[tempB] > 0) { // 有就取走放队尾并将标志位-1
                            book[tempB]--;
                            QB.add(tempB);
                            tempTop = desk.pop();
                            while (tempTop != tempB) {
                                book[tempTop]--;
                                QB.add(tempTop);
                                tempTop = desk.pop();
                            }
                            QB.add(tempTop);
                        } else { // 没有就直接入栈,并将标记位+1
                            desk.push(tempB);
                            book[tempB]++;
                        }
        }
        if (QA.isEmpty()) {
            System.out.println("A player won! B手中的牌是:");
            System.out.println(QB);
        } else if (QB.isEmpty()) {
            System.out.println("B player won! A手中的牌是:");
            System.out.println(QA);
        } else {
            System.out.println("no player won!");
        }
    }
}

相关文章

  • 一道简单的“小猫钓鱼”游戏算法

    “小猫钓鱼”纸牌游戏规则描述 将一副扑克牌平均分成两份,每人拿一份。小哼先拿出手中的第一张扑克牌放在桌上,然后小哈...

  • 小猫钓鱼的游戏算法

    目前是模拟是两个人对战的。使用栈和队列模拟。 #define kCardSize 52 typedef stru...

  • 重拾算法Day07-小猫钓鱼

    小猫钓鱼游戏

  • 纸牌游戏-小猫钓鱼

    规则: 星期天小哼和小哈约在一起玩桌游,他们正在玩一个非常古怪的扑克游戏——“小猫钓鱼”。游戏的规则是这样的:将一...

  • 爱哭的我

    数学今天讲的的课本上的练习题,有一道题是小猫和小猫妈妈钓鱼,小猫不钓鱼,在那里玩一条都没有钓到。还有猴子吃...

  • 用心做事才能有收获

    很多人都听过小猫钓鱼的故事,两只小猫去钓鱼,一只小猫钓到了很多鱼,另一只小猫两手空空,为什么会这样?答案很简单,钓...

  • C++小猫钓鱼游戏

    #include#includeusing namespace std; struct queue { int d...

  • 做事要三心二意还是一心一意

    今天,再次读了读小猫钓鱼的故事,这是孩提时代经常被教育的故事。 小猫钓鱼告诉我们一个很简单的道理,做事要一心一意,...

  • 13/60  张望的小猫

    小时候我们都听说过《小猫钓鱼》的故事,故事内容讲的是:猫妈妈带着小猫到小河边钓鱼,小猫三心二意,钓鱼的时...

  • 《フィッシング》的游戏特点

    《フィッシング》这款钓鱼游戏模仿了真实的钓鱼体验。钓鱼通常在复杂的游戏中只是一个简单的附属小游戏,而在手机游...

网友评论

      本文标题:一道简单的“小猫钓鱼”游戏算法

      本文链接:https://www.haomeiwen.com/subject/auaflqtx.html