SCAU Java 实验2 发牌游戏

本文介绍了一个Java程序,实现了一款多人参与的扑克游戏,支持多副牌并发发牌,并按花色和牌面展示每位玩家的牌组。通过实例演示了如何使用数组、方法和类来管理牌组和发牌过程,适合初学者理解Java基本概念。
摘要由CSDN通过智能技术生成

实验类型:验证性

实验目的:掌握Java数组、方法、类的基本定义。

实验内容:编写程序,项目名和类名均为PokerGame。

描述:

共有1幅扑克牌,不包括大王和小王共52张牌。

可能有n个人参与扑克游戏,2<=n<=6。

程序运行时输入n,然后52张牌分别依次分发给n个人。不能整除时,每个人的牌数可以不同,如3个人,则第1个人18张,第2个和第3个人17张牌。

发牌完成后按花色(顺序为黑桃、红心、草花、方块)和牌面大小输出每个人得到的牌。

例如:

输入人数:3

输出如下:

第1个人:

黑桃:K 10 5A

红心:10 3 2

草花:K 10 8 6 3 A

方块:Q J 5 2

第2个人:

第3个人:

要求:

(1)使用数组存放发牌情况。

(2)编写不同方法完成不同功能。

提交要求:打包为可以执行的JAR文档,其中要包含源程序文件。

package game;

import java.util.Arrays;
import java.util.Scanner;

/*
描述:
共有1幅扑克牌,不包括大王和小王共52张牌。
可能有n个人参与扑克游戏,2<=n<=6。
程序运行时输入n,然后52张牌分别依次分发给n个人。
不能整除时,每个人的牌数可以不同,如3个人,则第1个人18张,第2个和第3个人17张牌。
发牌完成后按花色(顺序为黑桃、红心、草花、方块)和牌面大小输出每个人得到的牌。
 */

public class PokerGame {
    public static void Get(int[] poker,int n){

        //初始化扑克数组
        for(int i=1;i<poker.length;i++){
            poker[i]=i;
        }

        //打乱扑克数组
        for(int i=poker.length-1;i>1;i--){
            int temp=(int)(Math.random()*i);  //生成随机下标
            if(temp!=0){  //0下标无效
                int k=poker[i];
                poker[i]=poker[temp];
                poker[temp]=k;
            }
        }

        int[] people=new int[52/n+1];  //存放每个人得到的数字1-52

        //轮流发放扑克牌
        for(int loc=1;loc<=n;loc++){  //n个人
            int k=0;  //记录第n个人发到的牌数
            for(int j=loc;j<poker.length;j=j+n){  //对第n个人发放扑克牌
                people[k]=poker[j];
                k++;
            }
            printGet(people,loc,k);  //打印输出第n个人得到的扑克牌,loc是第几个人,k是得到了多少张牌
        }

    }
    public static void printGet(int [] people,int loc,int k){
        String[] str={"黑桃:","红心:","草花:","方块:"};
        String[] menber={"A ","2 ","3 ","4 ","5 ","6 ","7 ","8 ","9 ","10 ","J ","Q ","K "};
        System.out.println("第"+loc+"个人:");

        //对每个花色的数字进行打印
        for(int i=0;i<4;i++){  //共有4个花色
            int p=0;  //记录该花色的牌数
            int[] number=new int[k];  //存放该花色对应的数字1-13
            System.out.print(str[i]);  //打印花色

            //遍历people数组,将得到的数字转化为数字1-13
            for(int j=0;j<k;j++){
                if((people[j]%52/13)==i){  //说明为i花色
                    int b=people[j]%13;
                    if(b==0){
                        b=13;  //!!!
                    }
                    number[p]=b;
                    p++;
                }
            }

            //排序
            Arrays.sort(number,0,p);

            //将得到的数字1-13转化成A-10-JQK,倒序输出
            for(int t=p-1;t>=0;t--){
                System.out.print(menber[number[t]-1]);
            }
            System.out.println();
        }


    }

    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入参与人数:");
        int n= sc.nextInt();
        int[] poker=new int[53];  //第0个位置不用
        Get(poker,n);
    }
}

升级版:m副扑克

package game;

import java.util.Arrays;
import java.util.Scanner;

/*
描述:
共有m幅扑克牌,不包括大王和小王共52*m张牌。
可能有n个人参与扑克游戏,2<=n<=6。
程序运行时输入n,然后52张牌分别依次分发给n个人。
不能整除时,每个人的牌数可以不同,如3个人,则第1个人18张,第2个和第3个人17张牌。
发牌完成后按花色(顺序为黑桃、红心、草花、方块)和牌面大小输出每个人得到的牌。
 */

public class PokerGame {
    public static void Get(int[] poker,int n,int m){

        //初始化扑克数组
        for(int i=1;i<poker.length;i++){
            poker[i]=i;
        }

        //打乱扑克数组
        for(int i=poker.length-1;i>1;i--){
            int temp=(int)(Math.random()*i);  //生成随机下标
            if(temp!=0){  //0下标无效
                int k=poker[i];
                poker[i]=poker[temp];
                poker[temp]=k;
            }
        }

        int[] people=new int[52*m/n+1];  //存放每个人得到的数字1-52*m

        //轮流发放扑克牌
        for(int loc=1;loc<=n;loc++){  //n个人
            int k=0;  //记录第n个人发到的牌数
            for(int j=loc;j<poker.length;j=j+n){  //对第n个人发放扑克牌
                people[k]=poker[j];
                k++;
            }
            printGet(people,loc,k);  //打印输出第n个人得到的扑克牌,loc是第几个人,k是得到了多少张牌
        }

    }
    public static void printGet(int [] people,int loc,int k){
        String[] str={"黑桃:","红心:","草花:","方块:"};
        String[] menber={"A ","2 ","3 ","4 ","5 ","6 ","7 ","8 ","9 ","10 ","J ","Q ","K "};
        System.out.println("第"+loc+"个人:");

        //对每个花色的数字进行打印
        for(int i=0;i<4;i++){  //共有4个花色
            int p=0;  //记录该花色的牌数
            int[] number=new int[k];  //存放该花色对应的数字1-13
            System.out.print(str[i]);  //打印花色

            //遍历people数组,将得到的数字转化为数字1-13
            for(int j=0;j<k;j++){
                if((people[j]%52/13)==i){  //说明为i花色
                    int b=people[j]%13;
                    if(b==0){
                        b=13;  //!!!
                    }
                    number[p]=b;
                    p++;
                }
            }

            //排序
            Arrays.sort(number,0,p);

            //将得到的数字1-13转化成A-10-JQK,倒序输出
            for(int t=p-1;t>=0;t--){
                System.out.print(menber[number[t]-1]);
            }
            System.out.println();
        }


    }

    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入有几副牌:");
        int m= sc.nextInt();
        System.out.println("请输入参与人数:");
        int n= sc.nextInt();
        int[] poker=new int[52*m+1];  //第0个位置不用
        Get(poker,n,m);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值