Java 24点扑克牌问题(不放回抽取)

  前几天初学java时碰到的一道java基础编程题,稍微写了一下。(才识浅薄 轻喷)

题目如下:

给定一副扑克牌,去掉大王和小王后共52张牌,其中A K Q J对应的数值分别为1、13、12、11。其他牌按照牌面数值大小。

不断重复随机从抽取4张牌,直到所有牌抽取完毕。

每次计算4张牌的牌面数值之和,统计和为24的次数。

输出格式:

提示: int x = (int)(Math.random()*n); x是[0,n)之间的随机整数,包括0,不包括n。

 过程详解:

据题意这是一道不放回取出的排列组合,根据提示可以用随机数来进行取值,用数组解题。分析可得,取出共13组手牌,每组4张。

1.创建一个扑克牌牌堆(不需要打散)

2.利用随机数来进行取牌,每次取出一张

3.将取出的那张与牌堆顶部的交换,置入手牌

4.压缩牌堆,牌堆数量减一

5.在此基础上重复操作,直至取完

取牌过程图如下:

 具体细节见代码:

public class Main {
    static int AllCount=0;//标记24点的组个数
    static int poker[]=
            {1,2,3,4,5,6,7,8,9,10,11,12,13,
            1,2,3,4,5,6,7,8,9,10,11,12,13,
            1,2,3,4,5,6,7,8,9,10,11,12,13,
            1,2,3,4,5,6,7,8,9,10,11,12,13};//扑克牌牌堆;
    public static void main(String[] args) {
        System.out.print("开始:"+"\n");
        System.out.print("---------------"+"\n");
        int[][] arr = new int[13][4];//共有13个组,4张一组
        GetRandom(arr);//取牌
        Count(arr);//输出
    }
    public static void GetRandom(int arr[][])//抽牌
    {
        int n=51;//牌堆顶
        int temp=0;
        for (int i=0;i<13;i++)
        {
            for(int j=0;j<4;j++)
            {
                temp= (int)(Math.random()*n);//在剩余的牌堆里随机抽牌
                arr[i][j]=poker[temp];
                poker[temp]=poker[n];//顶部的牌交换,并置入手牌
                 n--;//牌数量减一
            }
        }
    }

    public static void Count(int arr[][])//输出
    {
        for (int i =0;i<13;i++)
        {
            int sum=0;
            for (int j=0;j<4;j++)
            {
               sum =sum+arr[i][j];
            }
            String jie=" ";
            if(sum==24)//后缀yes
            {
                AllCount++;
                jie="YES";
            }
            System.out.print(arr[i][0]+"+"+arr[i][1]+"+"+arr[i][2]+"+"+arr[i][3]+"="+sum+" "+jie+"\n");
        }
        System.out.print("----------------"+"\n");
        System.out.print("一共有"+AllCount+"组24");
    }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值