TA的每日心情 | 开心 2021-3-12 23:18 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
- C语言趣味程序百例精解之JAVA实现(86)自动发牌
- [img]http://img.javaxxz.com/2014/11/26/000609031.jpg[/img]
- 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[i]=new TreeSet< Card>();
- for(int j=0;j< (54-reservers)/players;j++){
- int k=(int)(Math.random()*allCards.size());
- cards[i].add(allCards.remove(k));
- }
- }
- //下面的循环将剩余的底牌存放到cards数组中。
- cards[i]=new TreeSet
-
- ();
- for(Card c: allCards){
- cards[i].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("
- the person-"+m+""s cards:");
- for(Card c:cards[m]){
- System.out.print(c+" ");
- }
- }
- //打印所留的底牌。
- System.out.println("
- the 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:at>
源码下载:http://file.javaxxz.com/2014/11/26/000609171.zip |
|