算法描述:
所有五张牌(都是同一花色)的组合,按以下秩序,由大至小排行分为不同牌型:
四条:有四张同一点数的牌。 例: 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: 需要完成 } }
相关推荐
梭哈(来自英文showhands)是从扑克牌中借鉴过来的。每人五个骰子,摇出后,依其点数牌形可分为:散牌(五个骰子点数各不一样)、一对(五个骰子中仅有两个骰子点数一样,其余皆不一样)、两对(两个对子加一个...
用java模拟的梭哈游戏,随机产生跟注的玩家,赞不支持IO输入
这是用c语言编写的梭哈游戏,对学习C语言很有帮助,对于结构体,枚举,共用体都有很多的应用。希望想学习的人能看看。
这是用MATLAB写的梭哈游戏,用m文件写的 很简单 很另类
基于VC6.0和MFC图形开发的梭哈游戏,是人工和电脑的游戏。方便无聊人事消磨时间。
java写的控制台的梭哈游戏,里面对于代码有详细的说明, 里面存在的bug如有解决方法请留言我,大家一起交流。
C语言写的梭哈游戏(控制台),只是为了学习C语言才写的。有不足的地方请多指教。本程序在VS2008下可以正常运行,如果是VC6.0的话可能有的地方换行没加/。其它的没问题
易语言梭哈扑克游戏源码,梭哈扑克游戏,开始难度,翻牌难度,得分,发牌,翻牌
这是在学习JAVA时的一个作业.算法不是很好.仅供参考
梭哈游戏 #include "iostream" #include"math.h" using namespace std;
一个梭哈的游戏下载自pudncom-GAME_suoha.rar 用matlab做的,感兴趣的玩一玩吧。
用java写的项目,项目可以直接运行,请放心下载使用。
开发环境为 Visual Studio 2005, 编译于PPC2003和WM5.0平台,可运行于模拟器或PPC真机中,界面还需改善,但牌面算法已经完整,可供参考。
面向对象大型程序设计——纸牌游戏,有图形界面,含可运行代码和文档详解&PPT;
6人梭哈_源代码
梭哈,有叫港式五张牌 服务器+客户端+资源
编译环境 VC6.0 内附完整工程和可执行文件 使用FormView并采用控件透明等技术 包含不同等级的AI难度和AI简单对话功能
用VS2008写的,由于是新手有很多地方写的很臃肿!请轻喷!
Python基于tkinterGUI进行开发的一个骰子梭哈小游戏,游戏规则百度骰子梭哈即可了解,这里在满足游戏规则的情况下增加了双人游戏模式以及多人游戏模式,具体游戏界面下载后自己感受。压缩包里包含源代码及其exe可...