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={"方 ...
随机推荐
- 将MathType公式转换为LaTex格式
LaTex编辑公式不够直观,常常会因为结构复杂导致数据或者符号出错,使用MathType编辑公式后再直接转换成LaTex代码可以避免这个问题. 一.首先在MathType中编辑公式 二.然后点击参数— ...
- LintCode-68.二叉树的后序遍历
二叉树的后序遍历 给出一棵二叉树,返回其节点值的后序遍历. 样例 给出一棵二叉树 {1,#,2,3}, 返回 [3,2,1] 挑战 你能使用非递归实现么? 标签 递归 二叉树 二叉树遍历 code / ...
- PokeCats开发者日志(十三)
现在是PokeCats游戏开发的第六十二天的晚上,把软著权登记证书的截图加上,又重新提交审核了一遍,但愿能过吧...
- WE团队团队汇总
WE团队目录 一.博客汇总 团队展示 选题报告 二.文档汇总 选题报告
- 在Centos中,大容量,且读写频繁的目录
1./根目录 2./usr目录 3./home目录 4./var目录 5./Swap目录 比较特殊,只要物理内存没使用完,就不会被启用 以上为鸟哥的linuxPDF中的学习心得
- 【其他】UTF-8带签名与不带签名
在 Visual Web Developer 另存为文件时,有编码选项,其中有: Unicode (UTF-8 with signature) - Codepage 65001 Unicode (UT ...
- 通过logger命令记录日志
通过logger命令记录日志 logger是一个shell命令接口,可以通过该接口使用Syslog的系统日志模块,还可以从命令行直接向系统日志文件写入一行信息. ------------------- ...
- Mac安装mysqldb
一. 安装mysql (一)下载地址 https://pan.baidu.com/s/1slw50LZ 安装成功后,在系统偏好设置里有MySQL图标,可以启动或关闭MySQL 二. Mysql roo ...
- Kindle 电子书相关的工具软件【转】
这里是与 Kindle 电子书相关的工具软件.它们可以帮助我们解决在日常使用电子书时所可能遇到的问题,比如 kindle 管理工具.kindle 转换工具.kindle电子书制作工具.kindle 推 ...
- Tomcat启动时报org.springframework.web.context.ContextLoaderListener错误解决方案
问题现象:新从svn上检出maven的项目maven+spring+springmvc项目在Tomcat启动时,报如下错误. 严重: Error configuring application lis ...