梭哈游戏算法实现

算法描述:

所有五张牌(都是同一花色)的组合,按以下秩序,由大至小排行分为不同牌型:
四条:有四张同一点数的牌。 例: 4 4 4 4 9
满堂红:三张同一点数的牌,加一对其他点数的牌。 例: 8 8 8 K K
顺子:五张顺连的牌。 例: 6 5 4 3 2
三条:有三张同一点数的牌。 例: 7 7 7 K 2
一对:两张相同点数的牌。 例: 9 9 A J 4
无对:不能排成以上组合的牌,以点数决定大小。例: A 10 9 5 4
若牌型一样则利用数字决定胜负。
数字的顺序(大至小)为: A,K,Q,J,10,9,8。

 

解题思路
1、统计13种牌每种牌出现的张数,存在一个数组里,利用统计出的结果,再判断牌型。
例如:{4 4 4 4 9},统计的结果为[0,0,4,0,0,0,0,1,0,0,0,0,0],数组的第一个元素表示2的个数,第二个
表示3的个数,以此类推,最后一个表示A的个数。
{6 5 4 3 2}统计的结果为[1,1,1,1,1,0,0,0,0,0,0,0,0]
2、如果牌型不同,则根据牌型判断大小。
3、如果牌型相同,则计算数组权值判断大小。

 

代码实现

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 
 * @author create by ma
 * @date 2014年4月9日下午7:55:35
 * 
 */
public class Card implements Comparable<Card> {

	/**
	 * 四条四条(Four of a Kind为8)
	 */
	public static final int FourofaKind = 8;

	/**
	 * 满堂红(Fullhouse)为7
	 */
	public static final int Fullhouse = 7;

	/**
	 * 顺子(Straight)为5
	 */
	public static final int Straight = 5;

	/**
	 * 三条(Three of a kind)为4
	 */
	public static final int Threeofakind = 4;

	/**
	 * 两对(One Pair)为3
	 */
	public static final int TwoPair = 3;

	/**
	 * 一对(One Pair)为2
	 */
	public static final int OnePair = 2;

	/**
	 * 一对(One Pair)为2; 无对(Zilch)为1
	 */
	public static final int Zilch = 1;

	/**
	 * number为点数
	 */
	private int number = 0;

	// 无参构造方法
	public Card() {

	}

	// 构造函数: num为点数,String型,可以是1-10,J、Q、K、A;
	public Card(String num) {
		Map<String, Integer> nums = new HashMap<String, Integer>();
		for (int i = 2; i <= 10; i++) {
			nums.put(String.valueOf(i), i - 2);
		}
		nums.put("J", 9);
		nums.put("Q", 10);
		nums.put("K", 11);
		nums.put("A", 12);
		this.number = nums.get(num);
	}

	// 比较两手牌大小,并返回比较结果(>0,为第一手牌大;<0,为第二手牌大;=0,为两手牌一样大
	public static int compare(Card[] cards1, Card[] cards2) {
		if (whichType(cards1) - whichType(cards2) == 0) {
			
			// 如果牌型一样,则计算权值
			int cardsResult1 = 0;
			int cardsResult2 = 0;

			int[] nums1 = new int[13];
			int[] nums2 = new int[13];
			Arrays.fill(nums1, 0);
			Arrays.fill(nums2, 0);

			for (int i = 0; i < cards1.length; i++) {
				nums1[cards1[i].number]++;
				nums2[cards2[i].number]++;
			}
			for (int i = 0; i < nums1.length; i++) {
				cardsResult1 += nums1[i] * Math.pow(5, i);
				cardsResult2 += nums2[i] * Math.pow(5, i);
			}
			return cardsResult1 - cardsResult2;
		} else {
			// 如果牌型不一样,则计算牌型权值
			return whichType(cards1) - whichType(cards2);
		}

	}

	// 判断传入的牌是何种类型,并返回上面定义的该类型对应的整数值
	public static int whichType(Card[] cards) {
		if (cards.length != 5)
			return 0;

		int[] nums = new int[13];
		Arrays.fill(nums, 0);

		for (int i = 0; i < cards.length; i++) {
			nums[cards[i].number]++;
		}

		List<Integer> nn = new ArrayList<Integer>();

		for (int i = 0; i < nums.length; i++) {
			if (nums[i] != 0)
				nn.add(nums[i]);
		}

		if (nn.size() == 2) {
			if (nn.contains(4))
				return FourofaKind;
			else
				return Fullhouse;
		} else if (nn.size() == 3) {
			if (nn.contains(3))
				return Threeofakind;
			else
				return TwoPair;
		} else if (nn.size() == 4) {
			return OnePair;
		} else if (nn.size() == 5) {
			int aa = 0;
			for (int i = 1; i < nums.length; i++) {
				if (nums[i - 1] == 1 && nums[i] == 1)
					aa++;
			}
			if (aa == 4)
				return Straight;
			else
				return Zilch;
		}
		return 0;
	}

	public int getNumber() {
		return this.number;
	}

	public void setNumber(String number) {
		Map<String, Integer> nums = new HashMap<String, Integer>();
		for (int i = 1; i < 11; i++) {
			nums.put(String.valueOf(i), i);
		}
		nums.put("J", 11);
		nums.put("Q", 12);
		nums.put("K", 13);
		nums.put("A", 14);

		this.number = nums.get(nums);
		// TODO: 需要完成
	}

	/*
	 * 与另外一张牌比较大小
	 */
	public int compareTo(Card o) {

		return this.getNumber() - o.getNumber();// TODO: 需要完成
	}

}

 

一.扑克牌游戏 一副扑克牌去除大小王,剩余52张,A--K,红心,方块,黑桃,梅花四种花色。然后把这一副牌发给两个人,每人分得五张,比较这两人手中牌的大小。 大小的判定规则暂定如下: 牌型比较:同花顺>铁支>葫芦>同花>顺子>三条>二对>对子>散牌。 数字比较:A>K>Q>J>10>9>8 花式比较:黑桃>红桃>草花>方片 牌型说明: 同花顺:拥有五张连续性同花色的顺子。以A为首的同花顺最大。 铁支:四张相同数字的牌,外加一单张。比数字大小,「A」铁支最大 葫芦:由「三条」加一个「对子」所组成的牌,若别家也有此牌型,则比三条数字大小 同花:不构成顺子的五张同花色的牌。先比数字最大的单张,如相同再比第二支、依此类推 顺子:五张连续数字的牌组。 以A为首的顺子最大,如果大家都是顺子,比最大的一张牌,如果大小还一样就比这张牌的花式 三条:牌型由三张相同的牌组成,以A为首的三条最大 二对:牌型中五张牌由两组两张同数字的牌所组成。若遇相同则先比这副牌中最大的一对,如又相同再比第二对,如果还是一样,比大对子中的最大花式 对子:牌型由两张相同的牌加上三张单张所组成。如果大家都是对子,比对子的大小,如果对子也一样,比这个对子中的最大花色 散牌:单一型态的五张散牌所组成,不成对(二对),不成三条,不成顺(同花顺),不成同花,不成葫芦,不成铁支。先比最大一张牌的大小,如果大小一样,比这张牌的花色。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值