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入门到精通教程
查看: 609|回复: 0

[算法学习]C语言趣味程序百例精解之JAVA实现(86)自动发牌

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-11-26 00:06:09 | 显示全部楼层 |阅读模式
    1. C语言趣味程序百例精解之JAVA实现(86)自动发牌
    2. [img]http://img.javaxxz.com/2014/11/26/000609031.jpg[/img]
    3. import java.util.*;
    4. /**
    5. *1,定义一个类Card,该类的对象代表一张扑克牌。
    6. *要求包含三个属性:点数,花色,和大小王信息
    7. *(三者均为enum类型)。要求扑克牌能比较大小,
    8. *比较规则为:
    9. *a,大王最大,小王其次。
    10. *b,其他的扑克牌按点数大小来比,点数相同的按花色来比
    11. *(花色从大到小的顺序是:黑桃>红桃>梅花>方块)。
    12. *
    13. *2,为Card类写一个静态方法:
    14. *TreeSet[] dispatch(int numberOfPlayer,int reserverCards),
    15. *要求用一副扑克牌随机的为多人发牌,并预留给定张数的底牌,返回一个TreeSet数组,
    16. *保存排好序的每个玩家得到的牌,以及预留的底牌。
    17. *
    18. *3,写一个主方法测试以上程序,输出每次发牌的结果。
    19. */
    20. public class Card implements Comparable< Card>{
    21. /**
    22.   * 扑克牌的点数
    23. */
    24. Number n;
    25. /**
    26.   * 扑克牌的花色
    27. */
    28. Huase h;
    29. /**
    30.   * 扑克牌的大小王
    31. */
    32. JOKER j;
    33. /**
    34.   * 扑克牌的值,该值用来描述一张扑克牌的大小
    35. */
    36. int value;
    37. /**
    38.   * 扑克牌是否是大小王之一
    39. */
    40. boolean isJoker;
    41. public Card(Number n,Huase h){
    42.   this.n=n;
    43.   this.h=h;
    44.   value=n.ordinal()*10+h.ordinal();
    45.   isJoker=false;
    46. }
    47. public Card(JOKER j){
    48.   this.j=j;
    49.   value=10000+j.ordinal();
    50.   isJoker=true;
    51. }
    52. public int compareTo(Card c){
    53.   if(this.value>c.value)
    54.    return 1;
    55.   else if(this.value< c.value)
    56.    return -1;
    57.   else return 0;
    58. }
    59. public String toString(){
    60.   String str=null;
    61.   if(isJoker){
    62.    str=j.name()+"JOKER";   
    63.   }
    64.   else{
    65.    switch(h){
    66.     case DIAMOND: str="方块"; break;
    67.     case CLUB:  str="梅花";break;
    68.     case HEART: str="红桃";break;
    69.     case SPADE:str="黑桃";break;
    70.    }
    71.    switch(n){
    72.     case TWO:str+="2";break;
    73.     case THREE:str+="3";break;
    74.     case FOUR:str+="4";break;
    75.     case FIVE:str+="5";break;
    76.     case SIX:str+="6";break;
    77.     case SEVEN:str+="7";break;
    78.     case EIGHT:str+="8";break;
    79.     case NINE:str+="9";break;
    80.     case TEN:str+="10";break;
    81.     case JACK:str+="J";break;
    82.     case QUEEN:str+="Q";break;
    83.     case KING:str+="K";break;
    84.     case ACE:str+="A";break;
    85.    }  
    86.   }
    87.   return str;
    88. }

    89. public static TreeSet< Card>[] dispatch(int players,int reservers){
    90.   //必须保证:(54-reserverCards)%numberOfPlayer==0
    91.   if((54-reservers)%players!=0){
    92.    throw new RuntimeException("按照给定的底牌数和玩家人数不能平均分发扑克牌!");
    93.   }
    94.   //用来存放所有的扑克牌的集合。
    95.   LinkedList< Card> allCards=new LinkedList< Card>();
    96.   //生成所有扑克牌,并存放到allCards中。
    97.   for(Number num:Number.values()){
    98.    for(Huase h:Huase.values()){
    99.     allCards.add(new Card(num,h));
    100.    }
    101.   }
    102.   allCards.add(new Card(JOKER.SMALL));
    103.   allCards.add(new Card(JOKER.BIG));
    104.   //cards数组用来存放每一个玩家的扑克牌以及最后保留的底牌。
    105.   TreeSet
    106.    
    107.       cards[]= new TreeSet[players+1];
    108.   int i=0;
    109.   //下面的for循环随机的分发numberOfPlayer方的牌,将其存放到cards数组中,
    110.   //同时把已发出去的牌从allCards中删除掉。  
    111.      for(;i< players;i++){
    112.    cards[i]=new TreeSet< Card>();
    113.    for(int j=0;j< (54-reservers)/players;j++){
    114.     int k=(int)(Math.random()*allCards.size());
    115.     cards[i].add(allCards.remove(k));
    116.    }
    117.   }
    118.      //下面的循环将剩余的底牌存放到cards数组中。
    119.      cards[i]=new TreeSet
    120.      
    121.       ();
    122.      for(Card c: allCards){
    123.       cards[i].add(c);
    124.      }
    125.      return cards;
    126. }

    127. public static void main(String[] args){
    128.   //4个玩家,留6张底牌。
    129.   TreeSet< Card> cards[]=Card.dispatch(4,6);
    130.   //打印每个玩家的扑克牌。
    131.      for(int m=0;m< cards.length-1;m++){
    132.       System.out.println("
    133. the person-"+m+""s cards:");
    134.       for(Card c:cards[m]){
    135.        System.out.print(c+" ");
    136.       }
    137.      }
    138.      //打印所留的底牌。
    139.      System.out.println("
    140. the reserver cards:");
    141.      for(Card c:cards[cards.length-1]){
    142.              System.out.print(c+" ");
    143.      }
    144. }
    145. }
    146. /**
    147. * 枚举类型,代表扑克牌的点数。
    148. * @author tony.tang
    149. *
    150. */
    151. enum Number{
    152. TWO,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE,TEN,JACK,QUEEN,KING,ACE
    153. }
    154. /**
    155. * 枚举类型,代表扑克牌的花色。
    156. * @author tony.tang
    157. *
    158. */
    159. enum Huase{
    160. DIAMOND,CLUB,HEART,SPADE
    161. }
    162. /**
    163. * 枚举类型,代表扑克牌中的大小王。
    164. * @author tony.tang
    165. *
    166. */
    167. enum JOKER{
    168. SMALL,BIG
    169. }
    170.      
    171.    
    复制代码
    运行结果: 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
    回复

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2025-2-25 04:25 , Processed in 0.344129 second(s), 34 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

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