|
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> |
|