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

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

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

几个注意的地方

  • 两个队列、一个栈分别用来模拟两个人手中的牌以及桌子上的牌
  • 一个标记数组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!");
		}
	}
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值