算法描述:
所有五张牌(都是同一花色)的组合,按以下秩序,由大至小排行分为不同牌型:
四条:有四张同一点数的牌。 例: 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: 需要完成 } }
相关推荐
“很简单 很另类”可能意味着这个游戏的实现方式简洁且独特,可能是通过精巧的算法和数据结构设计来实现梭哈游戏的规则。 【标签】"MATLAB"和"梭哈"进一步确认了游戏的核心技术和游戏类型。MATLAB作为标签,再次...
4. **算法实现** - **排序算法**:手牌的比较需要先对牌进行排序,可以使用Java内置的`Arrays.sort()`方法,或自定义快速排序、归并排序等。 - **牌型判断算法**:编写函数来识别各种牌型,如检查顺子、同花等。这...
【标题】"Java写的控制台梭哈游戏"是一款基于Java编程语言实现的桌面版扑克游戏。这款游戏在控制台上运行,为玩家提供了一种无需图形界面即可体验梭哈(Hold'em)游戏的方式。梭哈是扑克游戏中的一种流行玩法,通常...
通过学习和研究这个源码,开发者不仅可以掌握易语言的基本语法和编程技巧,还能了解到扑克游戏的算法实现,这对于提升编程技能和游戏开发能力都大有裨益。同时,对于想要深入了解易语言和游戏开发的人来说,这是一个...
【基于VC和MFC开发的梭哈游戏】是一款利用Microsoft Visual C++ 6.0(简称VC6.0)和Microsoft Foundation Classes (MFC) 库进行编程的桌面应用程序。MFC是微软提供的一套面向对象的C++类库,它极大地简化了Windows...
在本项目中,"学习JAVA编程,完成作业——编一个控制台梭哈游戏.zip",开发者采用Java语言创建了一个基于控制台的梭哈(Poker)游戏。这是一款非常适合初学者进行实践和学习的项目,它涵盖了Java编程基础、面向对象...
梭哈游戏程序是一种基于策略和概率的五张牌扑克游戏,通常在编程中实现这样的游戏,需要理解游戏规则、设计算法、以及掌握面向对象编程的基本概念。在这个C++实现的梭哈游戏中,我们可以看到以下几个关键知识点: 1...
在本项目中,“VC开发——梭哈游戏”是一款基于Visual C++ 6.0(简称VC6.0)编译环境开发的桌面游戏。VC6.0是Microsoft提供的一款经典集成开发环境,广泛用于C++编程,尽管现在已经有些过时,但它在教学和一些特定...
总之,这个个人制作的梭哈小游戏项目是一个学习和展示C#编程、winform应用开发以及游戏逻辑实现的实例。尽管开发者自谦为新手,但每个开发者都是从这样的起点开始,通过不断实践和改进,逐渐成长为经验丰富的程序员...
总的来说,港式五张牌(梭哈)的源码涵盖了网络编程、图形界面设计、游戏逻辑实现等多个方面的内容,通过深入学习和理解,不仅可以提升编程技能,还能加深对游戏开发流程和技术栈的理解。无论是为了娱乐还是职业发展...
《游戏梭哈源码在Windows Mobile平台上的实现》 本文将深入探讨一款基于C++语言在Visual Studio 2005环境下开发的游戏梭哈(Poker Stud)源码,适用于Windows Mobile平台,包括PPC2003和WM5.0系统。尽管此项目的...
【6人梭哈_源代码】是一个关于扑克游戏——梭哈的编程实现,它涉及到计算机科学、算法设计、数据结构以及软件工程等多个IT领域的知识。梭哈是一种流行于全球的扑克游戏,通常由52张扑克牌进行,而这里特别提到了"6人...
5. **算法设计**:梭哈游戏中涉及的算法可能包括比较手牌的胜负、计算概率等。这些算法的实现需要一定的逻辑思维和数学知识,例如排序算法(快速排序、冒泡排序等)可能被用来对玩家的手牌进行排序。 6. **文件I/O*...
综上所述,这个C++程序实现了梭哈游戏的核心逻辑,包括牌的排序、牌型判断以及胜负比较等功能。通过对这些功能的实现,我们不仅能够了解到C++语言的基础语法和特性,还能深入理解如何设计复杂的游戏逻辑。
在JAVA实现的豪斯游戏中,我们首先需要了解基本的扑克牌规则和牌型,然后用JAVA编程语言来编写程序来自动判断玩家的手牌。 一、扑克牌基础知识: 扑克牌通常由52张牌组成,分为四种花色:红桃(Hearts)、黑桃...
4. **梭哈游戏**:这是一种流行的扑克游戏,编程实现梭哈游戏可以帮助理解游戏规则,以及概率计算和策略分析。MATLAB可用于模拟游戏过程,通过随机数生成和逻辑控制来实现游戏的自动化运行。 5. **程序样例**:这...
【实验题目Java】涉及到三个Java编程任务,涵盖了随机数生成、事件模拟、图形绘制和扑克牌游戏算法等多个知识点。 1. 龟兔赛跑模拟: 这个任务要求用Java实现一个模拟龟兔赛跑的游戏。核心在于随机数生成和条件...
总的来说,这个“练习的代码”涵盖了面向对象编程、随机数生成、数据结构(如类、数组/列表、堆栈/队列)、算法(如排序、洗牌)、比较逻辑以及游戏规则的编程实现。这些都是IT行业中非常重要的编程技能和知识,通过...
这个游戏是五张牌抽牌游戏的变体,通常称为五张扑克或五张牌梭哈,是一种流行的传统扑克游戏。 描述中的“这个免费的五张牌抽牌游戏完全用VB6编写,尽情享受吧!”暗示了游戏不仅免费,而且开发者可能已经对其进行...