Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 636|回复: 0

C语言趣味程序百例精解之JAVA实现(86)自动发牌

[复制链接]

该用户从未签到

发表于 2011-9-18 16:39:25 | 显示全部楼层 |阅读模式
C语言趣味程序百例精解之java实现(86)自动发牌

import java.util.*;
/**
*1,定义一个类Card,该类的对象代表一张扑克牌。
*要求包含三个属性:点数,花色,和大小王信息
*(三者均为enum类型)。要求扑克牌能比较大小,
*比较规则为:
*a,大王最大,小王其次。
*b,其他的扑克牌按点数大小来比,点数相同的按花色来比
*(花色从大到小的顺序是:黑桃>红桃>梅花>方块)。
*
*2,为Card类写一个静态方法:
*TreeSet[] dispatch(int numberOfPlayer,int reserverCards),
*要求用一副扑克牌随机的为多人发牌,并预留给定张数的底牌,返回一个TreeSet数组,
*保存排好序的每个玩家得到的牌,以及预留的底牌。
*
*3,写一个主方法测试以上程序,输出每次发牌的结果。
*/
public class Card implements Comparable< Card>{
/**
  * 扑克牌的点数
*/
Number n;
/**
  * 扑克牌的花色
*/
Huase h;
/**
  * 扑克牌的大小王
*/
JOKER j;
/**
  * 扑克牌的值,该值用来描述一张扑克牌的大小
*/
int value;
/**
  * 扑克牌是否是大小王之一
*/
boolean isJoker;
public Card(Number n,Huase h){
  this.n=n;
  this.h=h;
  value=n.ordinal()*10+h.ordinal();
  isJoker=false;
}
public Card(JOKER j){
  this.j=j;
  value=10000+j.ordinal();
  isJoker=true;
}
public int compareTo(Card c){
  if(this.value>c.value)
   return 1;
  else if(this.value< c.value)
   return -1;
  else return 0;
}
public String toString(){
  String str=null;
  if(isJoker){
   str=j.name()+"JOKER";   
  }
  else{
   switch(h){
    case DIAMOND: str="方块"; break;
    case CLUB:  str="梅花";break;
    case HEART: str="红桃";break;
    case SPADE:str="黑桃";break;
   }
   switch(n){
    case TWO:str+="2";break;
    case THREE:str+="3";break;
    case FOUR:str+="4";break;
    case FIVE:str+="5";break;
    case SIX:str+="6";break;
    case SEVEN:str+="7";break;
    case EIGHT:str+="8";break;
    case NINE:str+="9";break;
    case TEN:str+="10";break;
    case JACK:str+="J";break;
    case QUEEN:str+="Q";break;
    case KING:str+="K";break;
    case ACE:str+="A";break;
   }  
  }
  return str;
}

public static TreeSet< Card>[] dispatch(int players,int reservers){
  //必须保证:(54-reserverCards)%numberOfPlayer==0
  if((54-reservers)%players!=0){
   throw new RuntimeException("按照给定的底牌数和玩家人数不能平均分发扑克牌!");
  }
  //用来存放所有的扑克牌的集合。
  LinkedList< Card> allCards=new LinkedList< Card>();
  //生成所有扑克牌,并存放到allCards中。
  for(Number num:Number.values()){
   for(Huase h:Huase.values()){
    allCards.add(new Card(num,h));
   }
  }
  allCards.add(new Card(JOKER.SMALL));
  allCards.add(new Card(JOKER.BIG));
  //cards数组用来存放每一个玩家的扑克牌以及最后保留的底牌。
  TreeSet cards[]= new TreeSet[players+1];
  int i=0;
  //下面的for循环随机的分发numberOfPlayer方的牌,将其存放到cards数组中,
  //同时把已发出去的牌从allCards中删除掉。  
     for(;i< players;i++){
   cards=new TreeSet< Card>();
   for(int j=0;j< (54-reservers)/players;j++){
    int k=(int)(Math.random()*allCards.size());
    cards.add(allCards.remove(k));
   }
  }
     //下面的循环将剩余的底牌存放到cards数组中。
     cards=new TreeSet();
     for(Card c: allCards){
      cards.add(c);
     }
     return cards;
}

public static void main(String[] args){
  //4个玩家,留6张底牌。
  TreeSet< Card> cards[]=Card.dispatch(4,6);
  //打印每个玩家的扑克牌。
     for(int m=0;m< cards.length-1;m++){
      System.out.println("\nthe person-"+m+"\'s cards:");
      for(Card c:cards[m]){
       System.out.print(c+" ");
      }
     }
     //打印所留的底牌。
     System.out.println("\n\nthe reserver cards:");
     for(Card c:cards[cards.length-1]){
             System.out.print(c+" ");
     }
}
}
/**
* 枚举类型,代表扑克牌的点数。
* @author tony.tang
*
*/
enum Number{
TWO,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE,TEN,JACK,QUEEN,KING,ACE
}
/**
* 枚举类型,代表扑克牌的花色。
* @author tony.tang
*
*/
enum Huase{
DIAMOND,CLUB,HEART,SPADE
}
/**
* 枚举类型,代表扑克牌中的大小王。
* @author tony.tang
*
*/
enum JOKER{
SMALL,BIG
}

运行结果:

the person-0's cards:
红桃2 黑桃2 方块3 红桃3 黑桃3 方块5 红桃5 黑桃8 红桃9 梅花J 梅花K SMALLJOKER

the person-1's cards:
方块4 梅花4 红桃4 梅花5 方块6 黑桃6 梅花7 方块8 黑桃9 黑桃10 红桃Q 红桃K

the person-2's cards:
方块2 梅花2 梅花3 梅花6 红桃7 方块9 梅花9 梅花10 红桃10 方块K 黑桃K BIGJOKER

the person-3's cards:
黑桃4 黑桃5 黑桃7 梅花8 红桃8 方块J 黑桃J 梅花Q 黑桃Q 方块A 红桃A 黑桃A

the reserver cards:
红桃6 方块7 方块10 红桃J 方块Q 梅花A
C:\bat>
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2024-5-23 22:18 , Processed in 0.355745 second(s), 47 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表