Poker program

本人水平有限,文章中如果出现什么不正确或者模糊的地方,还请各位小伙伴留下评论,多多指教 : )

题目描述

一副新的扑克牌,除去大小鬼剩下52张牌(这副牌包括梅花、方块、红桃和黑桃4种花色,每种花色又有13种牌,分别是A、2、3、4、5、6、7、8、9、10、J、Q、K)。发牌者把这52张牌随机发给4个玩家,直到把所有牌发完。按上面要求写一个发牌程序,要求把4个玩家手里的牌都打印出来。

要求:
用你最熟悉的计算机语言实现上面程序,并画出UML图。(程序必须完整,可以直接运行)

目的:
1)主要考察面向对象的设计能力。
2)UML知识。

UML 类图

这里写图片描述

这里写图片描述

这里写图片描述

思路概述

根据面向对象的思想,这里实现3个类,分别的卡牌(Card)、玩家(Player)以及游戏规则(GameRule)。可以看出这三个类之间的关系可以描述为Player类和GameRule类中都需要用到Card类。

这里解释一下Card中weight的变量,因为我们牌随机分发的过程是跟这个变量有关的。int weight的值是一个来自于1到1000之间的随机数,我们首先按花色和数字生成52张牌,于此同时给每张拍的weight赋值(一个随机数)。
这里写图片描述
可以看出每个card在实例化之后都会有一个随机的weight值。然后根据这个weight值从小到大再对52张牌排序。

这里写图片描述
大家可以看到,现在的ArrayList cards 中的卡牌已经按照weight值从小到大进行了排序这样一来得到的就是一组相对随机的牌。最后我们把这个cards数组中的前13张牌分给第一个玩家,然后下标为14到26的牌分给第二个玩家,27到39的分给第三个,然后最后13张牌分给最后一个玩家。

再通过一些函数将牌进行排序,再对花色与数字进行判断,就能得出如下结果:
这里写图片描述

重要函数

Class GameRule:

  /**
     * 产生一随机排序的套牌
     * @return ArrayList<Cards>
     */
    public ArrayList<Card> MakeCards(){
        //实例化ArrayList<Card> cards
        cards =new ArrayList<>();
        for(int i =0 ;i<4;i++){
            //i从0到3,4个数代表花色,j从1到13,代表数字
            for (int j =1;j<=13;j++){
                //产生一个1到1000的随机数
                int r =1+(int)(Math.random()*1000);
                //实例化一个Card对象
                Card card =new Card(i,j,r);
                //把card对象加入到cards的ArrayList当中
                cards.add(card);
            }
        }
        //调用了sortCards()方法,返回一套随机排序的卡牌
        return sortCards(cards);
    }


    /**
     * 将卡牌随机打乱
     * @param cards
     * @return cards
     */
    public ArrayList<Card> sortCards(ArrayList<Card> cards){
        int n =cards.size();
        int noswap=1;  //每轮扫描有无交换标志,1表示无交换,0表示有交换
        //从数组里面的最后一个元素向前扫描
        for (int i=0;i<n-1;i++){
            noswap=1;
            for(int j=n-1;j>i;j--){
                Card card1 = cards.get(j);
                Card card2 = cards.get(j - 1);
                if (card1.weight < card2.weight) {
                    cards.set(j, card2);
                    cards.set(j - 1, card1);
                    noswap=0; //修改交换的标记
                }
            }
            if(noswap==1) //如果某一论没有发生交换,则说明排序完成,冒泡算法终止
                return cards;
        }
        return cards;
    }

 /**
     * 按数字的大小整理手牌
     * @param cards 传入手牌
     * @return
     */
    public  ArrayList<Card> trimHand(ArrayList<Card>  cards){
        int n=cards.size();
        int noswap=1;

        //花色排序
        for (int i=0;i<n-1;i++){
            noswap=1;//每轮扫描有无交换标志,1表示无交换,0表示有交换
            for(int j=n-1;j>i;j--){
                Card card1 = cards.get(j);
                Card card2 = cards.get(j - 1);
                if (card1.num < card2.num) {
                    //花色交换
                    cards.set(j, card2);
                    cards.set(j - 1, card1);
                    noswap=0;
                }
            }

            if(noswap==1)//如果某一论没有发生交换,则说明排序完成,冒泡算法终止
                return cards;
        }
        return cards;
    }
}

这里重点解释一下按照weight大小进行排序和按照num大小进行排序的区别。

将weight作为排序的依据,目的是模拟一个随机的过程,因为52张牌的weight是随机产生的 ,那么按照weight从小达大排列出来卡牌必然也是随机的

将num的大小进行排序的依据,只是为了让玩家看到的牌更加舒服而已(在网上斗过地主的小伙伴应该都明白),相当于一个体验优化。

总结

基本上最关键的几个函数都已经在上面讲解了,剩下的内容(例如android界面的显示、数字花色的判断)都是一些小的细节问题,大家可以从完整的代码中的查看。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
随机数作为密钥或密码运算资源被广泛应用于信息安全系统,随机数的研究 越来越重要。随着计算技术和密码学的发展,在信息安全应用中不仅需要可输出 各种形式随机数的发生器,而且还需要对随机数的随机性做更深入的研究与分析, 为相关应用提供理论支撑。 本文综合讨论了随机数发生器及随机性检测器的设计与实现。 首先对随机数发生器进行了分类讨论,按照真随机数发生器与伪随机数发生 器两种产生方法及性能进行了分析和对比。本文研究并设计了两款伪随机数发生 器,并用软件实现这两个发生器,产生相应的实例以供随机性检测器测试。同时 在信息安全领域真 随机数发生器中选择了一款常用的噪声源芯片 WNG4 ,用该芯 片产生真随机数,本软件系统调用该真随机数序列作为测试实例,以供随机性检 测器测试。 其次 本文设计并实现了一款随机性检测器,该检测器实现了国内较常用的 15 种检测方法,包括单比特频数检测、块内频数检测、扑克检测、重叠子序列检测、 游程总数检测、游程分布检测、块内最 大 1 游程检测、二元推导检测、自相关 检测 、矩阵秩检测、累加和检测、近似熵检测、线性复杂度检测、 Maurer 通用统 计检测、离散傅立叶检测等 15 项检测方法。以统计与概率学为理论依据,对 15 种检测方法进行 软件实现,对每种方法的运算步骤及实现做了详细的研究与分析。 然后 本文使用三个正向实例与一个反向实例作为测试案例对检测器进行测试。 正向实例为本文自行设计 的 随机数发生器产生 的 结果 作 为待测样本数据 即两款 伪随机数发生器与一款真随机数发生器产生的随机数 。 反向实例为模拟一个有明 显缺陷的随机数序列。 本文 详细讨论了测试结果,对随机数发生器与随机性检测 器同时进行测试与验证, 以 证明随机数发生器的良好性能及随机性检测器的运行 有效性,并得出结论, 证明 该检测系统的设计与实现与预期一致。 本文的亮点在于: 紧密结合工作实际,紧紧围 绕随机数随机性检测这一课题的研究,系统地梳 理了相关检测方法,综合国内实际情况选择了最适合信息安全领域的 15 种检测方 法,再用简洁高效的软件语言实现这些检测方法,拓展了企业在随机性检测领域 的检测能力,使之成为信息安全 领域 的有效测试工具。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值