Java 扑克牌发牌
今天看到这个算法题,http://www.cnblogs.com/xishuai/p/3392981.html ,忍不住自己用Java做了一个。
初始化很重要,所有的52张牌按顺序放入到容器里边,标志位标记为false表示手里没这牌。
1 发牌
利用随机数,找到容器中的这张牌,将标志位标记为true,表示手里有了这张牌。
2 排序
因为放入的时候是按顺序的,于是每个花色各自,自然也是按照顺序,找出标志位为true的,输出即可。
3找出最大连续牌
思路是将连续的字符分隔出来,连续数目最大的,即为最大连续牌。每个花色的的最大牌找出来,再找出最大的。
做法:
每个花色里,生成一个字符串,其中,手里有的排,将索引加入字符串,再加分隔符。手里没有的,用分号加入字符串。
用分号分隔后,长度大于1的即为有连续牌的。从有连续牌的,找出最大的即可。
/**
* desc
* 程序描述: 一副纸牌有52张,4种花色,每种花色13张。我们能用一个整数m就表示出所有的52种情况,规则是: m / 13: =0: 红心,=1: 方块,=2: 梅花,=3: 黑桃 m % 13: =0:2,=1:3,=2:4 .... =8:10,=9:J,=10:Q,=11: K,=12:A 比如:m = 15 就表示:方块4 m=38表示:梅花A 我们希望用程序模拟1副扑克牌随机抽取13张,发给某人的过程。 发牌后需要排序:规则是:先按花色,再按点数。花色的大小顺序是:梅花、方块、红心、黑桃。点数的顺序是:2、3、4、…. 10、J、Q、K、A。 然后,挑选出最大的连续牌型。规则是:连续张数多的大。张数相等的则花色大的大(此时与点数无关)。 我加了一条规则 最小连续是3张 */
package algorithm; import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.Vector; /**
* @author new
*
*/
public class Poker {
private static final int CARDSNUM=13;
private static final int MAX_NUM=52;
private static final int MIN_CONSEC_NUM = 2;
private Map<CardColor,Vector<Cards>> allCards=new HashMap<CardColor,Vector<Cards>>();
public void start(){
init();
genarate();
order();
printMax();
} private void init(){
allCards.clear();
for(CardColor color:CardColor.values()){
Vector<Cards> v=new Vector<Cards>();
for(CardDisplay cd:CardDisplay.values()){
Cards c = new Cards();
c.setCardColor(color);
c.setCardDisplay(cd);
c.setExist(false);
c.setRealNum(CARDSNUM*color.colorType+cd.num);
v.add(c);
}
allCards.put(color, v);
}
}
/**
* 随机抽取13张牌
*/
private void genarate(){
System.out.println("my cards is :");
int i=0;
do{
Random r = new Random();
int tmp = r.nextInt(MAX_NUM);
int answer = tmp / CARDSNUM ;
for(Cards obj:allCards.get(getColor(answer))){
if(obj.getRealNum()==tmp&&obj.isExist()==false){
i++;
obj.setExist(true);
System.out.println(obj.getCardColor().colorDesc+":"+obj.getCardDisplay().displayStr);
break;
}
}
}while(i<CARDSNUM);
}
private CardColor getColor(int answer){
for(CardColor cc:CardColor.values()){
if(cc.colorType == answer){
return cc;
}
}
return null;
}
/**
* 开始排序 其实不用排序 枚举初始化的时候已经排好序
*/
private void order(){
System.out.println();
System.out.println("ofter order :");
for(CardColor key:allCards.keySet()){
System.out.print(key.colorDesc +" : ");
for(Cards obj:allCards.get(key)){
if(obj.isExist()){
System.out.print(obj.getCardDisplay().displayStr+" ");
}
}
System.out.println();
}
}
/**
* 取出最大的连续牌型
*/
private void printMax(){
CardColor maxColor=null;
int maxCardIdx = -1;
int maxCardLength =0;
for(CardColor key:allCards.keySet()){
Vector<Cards> v = allCards.get(key);
StringBuffer tmpcards=new StringBuffer();
for(int idx=0;idx<v.size();idx++){
Cards obj = v.get(idx);
if(obj.isExist()){
tmpcards.append(idx).append("-");
}else{
tmpcards.append(";");
}
}
String cardstr= tmpcards.toString().replaceAll("-;", ";");
if(cardstr.endsWith("-"))cardstr=cardstr.substring(0,cardstr.length()-2);
String[] tmpcardsarr=cardstr.split(";");
int temp_maxCardIdx =-1;
int tmp_maxCardLength =0;
for(int i=0;i<tmpcardsarr.length;i++){
String[] arr = tmpcardsarr[i].split("-");
if(tmp_maxCardLength<=arr.length&&arr.length>=MIN_CONSEC_NUM){
temp_maxCardIdx=Integer.parseInt(arr[0]);
tmp_maxCardLength=arr.length;
}
}
if(tmp_maxCardLength>=MIN_CONSEC_NUM){
if(tmp_maxCardLength>maxCardLength||(maxColor!=null && tmp_maxCardLength==maxCardLength&&key.colorIndex>maxColor.colorIndex)){
maxColor = key;
maxCardIdx = temp_maxCardIdx;
maxCardLength = tmp_maxCardLength;
}
}
}
System.out.println();
System.out.println("max :");
if(maxCardLength>=MIN_CONSEC_NUM){
System.out.print(maxColor.colorDesc+":");
Vector<Cards> v = allCards.get(maxColor);
for(int i=maxCardIdx;i<v.size();i++){
Cards obj = v.get(i);
if(obj.isExist()){
System.out.print(obj.getCardDisplay().displayStr+" ");
}else{
return;
}
}
}
else
{
System.out.println("无连续牌");
}
}
/**
* @param args
*/
public static void main(String[] args) {
Poker p = new Poker();
p.start();
} }
class CardMax
{
CardColor maxColor;
int maxCardIdx;
}
/**
*
* @author new
*
*/
enum CardColor
{
CLUB(2,"梅花",1),//梅花
DIAMOND(1,"方块",2),//方块
HEART(0,"红桃",3),//红桃
SPADE(3,"黑桃",4);//黑桃
protected final int colorType;
protected final String colorDesc;
protected final int colorIndex;//代表花色大小 值越大越大
private CardColor(int type,String desc,int oidx)
{
this.colorType = type;
this.colorDesc = desc;
this.colorIndex = oidx;
}
}
enum CardDisplay
{
CARD_2(0),
CARD_3(1),
CARD_4(2),
CARD_5(3),
CARD_6(4),
CARD_7(5),
CARD_8(6),
CARD_9(7),
CARD_10(8),
CARD_J(9),
CARD_Q(10),
CARD_K(11),
CARD_A(12);
protected final String displayStr;
protected final int num;
private CardDisplay(int num)
{
this.num = num;
if(num<9){
this.displayStr = String.valueOf(num+2);
}
else{
String str="";
switch(num){
case 9:
str = "J";
break;
case 10:
str = "Q";
break;
case 11:
str = "K";
break;
case 12:
str="A";
break;
}
this.displayStr = str;
}
}
}
/**
* 每张牌对象
* @author new
*
*/
class Cards
{
Cards(){
}
Cards(CardColor cardColor,CardDisplay cardDisplay,int realNum,boolean exist){
this.cardColor = cardColor;
this.cardDisplay = cardDisplay;
this.realNum = realNum;
this.exist = exist;
}
private CardColor cardColor;//花色
private CardDisplay cardDisplay;
private int realNum;
private boolean exist;
public CardColor getCardColor() {
return cardColor;
}
public CardDisplay getCardDisplay() {
return cardDisplay;
}
public int getRealNum() {
return realNum;
}
public boolean isExist() {
return exist;
}
public void setCardColor(CardColor cardColor) {
this.cardColor = cardColor;
}
public void setCardDisplay(CardDisplay cardDisplay) {
this.cardDisplay = cardDisplay;
}
public void setRealNum(int realNum) {
this.realNum = realNum;
}
public void setExist(boolean exist) {
this.exist = exist;
}
}
测试结果:
my cards is :
方块:6
方块:8
方块:4
梅花:4
方块:A
红桃:9
黑桃:Q
梅花:9
梅花:5
黑桃:10
黑桃:5
方块:3
方块:9 ofter order :
方块 : 3 4 6 8 9 A
黑桃 : 5 10 Q
红桃 : 9
梅花 : 4 5 9 max :
方块:8 9
Java 扑克牌发牌的更多相关文章
- Java练习——扑克牌发牌器
Java练习——扑克牌发牌器声明:学习自其他博主,感谢分享,这里自己也写了一下.实现思路 - 构建一张扑克牌 - 构建一套扑克牌 - 测试 构建一张扑克牌 /** * @author 冬冬 * 定义 ...
- C算法编程题(一)扑克牌发牌
前言 上周写<我的编程开始(C)>这篇文章的时候,说过有时间的话会写些算法编程的题目,可能是这两天周末过的太舒适了,忘记写了.下班了,还没回去,闲来无事就写下吧. 因为写C++的编程题和其 ...
- [原]用C#模拟实现扑克牌发牌、排序程序…
(1)52张扑克牌,四种花色(红桃.黑桃.方块和梅花),随机发牌给四个人. (2)最后将四个人的扑克牌包括花色打印在控制台上. 其中: 花色和点数用枚举类型实现 每张扑克牌用结构实 ...
- [原]用C#模拟实现扑克牌发牌、排序程序。
(1)52张扑克牌,四种花色(红桃.黑桃.方块和梅花),随机发牌给四个人. (2)最后将四个人的扑克牌包括花色打印在控制台上. 其中: 花色和点数用枚举类型实现 每张扑克牌用结构实 ...
- C# -- 模拟扑克牌发牌
C# -- 模拟扑克牌发牌 1. User 类: 玩家 public class User { private List<PaperCard> listCard = new List&l ...
- Python面向对象编程扑克牌发牌程序,另含大量Python代码!
1. 题目 编写程序, 4名牌手打牌,计算机随机将52张牌(不含大小鬼)发给4名牌手,在屏幕上显示每位牌手的牌. 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不 ...
- JAVA 实现发牌的 改进
java是一门面向对象的语言,我们在解决这个问题的时候先找对象.我认为面想对象 “就是把复杂的问题变简单,简单的问题程序化” .如果我们 创建一盒牌--->洗牌--->选地主牌---&g ...
- HashTable的使用,扑克牌发牌游戏
l 场景 主要实现以下功能: 1. 首先给扑克牌中每张牌设定一个编号,下面算法实现的编号规则如下: 红桃按照从小到大依次为:1-13 方块按照从小到大依次为:14-26 黑桃按 ...
- Java程序设计之扑克牌
这段代码的主要实现功能扑克牌的洗牌和发牌功能,一副牌,红桃,黑桃,梅花,方片,A~K,不含大小王. 构造一个class. 首先是声明花色: private String[] sign={"方 ...
随机推荐
- 3ds Max学习日记(六)
到了周六就不想再忙实验室的活了,于是玩了一下3ds max,第5和第6章每章都只有4个视频,于是就一起弄完了,什么网格建模,曲面建模啥的,nurbs啥的. 附上今日的劳动成果: 叉子(用长方体 ...
- 【Linux】- apt-get命令
apt-get,是一条linux命令,适用于deb包管理式的操作系统,主要用于自动从互联网的软件仓库中搜索.安装.升级.卸载软件或操作系统. Advanced Package Tool,又名apt-g ...
- mstsc远程登录终端超出最大连接数的解决办法
1,.远程服务器有两个用户登录 2.第三个登录时提示:终端服务器超出了最大允许连接,这种情况怎么解决 A.通过运行命令来解决:运行输入mstsc /admin /v:IP:端口 敲回车来解决,这里的 ...
- 错误 10 非静态的字段、方法或属性“Test10.Program.a”要求对象引用
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test ...
- DBGrid相关技术整理
DBGrid相关技术整理: 注:对于DBGrid相关属性.方法的学习融入到技术整理过程中 一,多选 设置属性: Options->dgMultiSelect = True; ->dgRow ...
- Delphi实现在数据库中存取图像
向窗体上添加一个TListBox组件.一个TImage组件和一个TTable组件,设计完成的主界面如图1所示. 图1 主界面 本系统中需要设计一个新的基于Paradox 7的数据库Image.db,图 ...
- MATLAB中mat2gray的用法【转】
函数简介 函数功能:实现图像矩阵的归一化操作.所谓"归一化"就是使矩阵的每个元素的值都在0和1之间.该函数在数字图像处理中经常用到. 调用格式: I = mat2gray(A, [ ...
- deep learning2
九.Deep learning的常用模型或者方法 9.1.AutoEncoder自动编码器 Deep Learning最简单的一种方法是利用人工神经网络的特点,人工神经网络(ANN)本身就是具有层次结 ...
- BZOJ 3507 通配符匹配(贪心+hash或贪心+AC自动机)
首先可以对n个目标串单独进行处理. 对于每个目标串,考虑把模式串按'*'进行划分为cnt段.首尾两段一定得于原串进行匹配.剩下的cnt-2段尽量与最靠左的起点进行匹配. 对于剩下的cnt-2段.每段又 ...
- python的if语句、while循环、for循环
if语句 计算机又被称作电脑,意指计算机可以像人脑一样,根据周围环境条件(即expession)的变化做出不同的反应(即执行代码)if语句就是来控制计算机实现这一功能 语法: 1.单分支,单个条件判断 ...