java题目:发牌程序

内容要求:

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

下面是一个运行示例:

输入扑克牌幅数:1
输入人数:3

输出如下:
第1个人:
黑桃:K 10 5 A
红心:10 3 2
草花:K 10 8 6 3 A
方块:Q J 5 2
第2个人:
.......
第3个人:
......

分析:构建两个类,一位玩家类和一副牌类,玩家有清空手牌(初始化)方法和展示手牌(输出)方法,牌有取一副新牌(初始化)方法和随机发一张方法。游戏开始前,输入牌的副数和玩家人数,建立一群玩家对象(对象数组)和一副牌对象。

        游戏开始,发牌方式为每轮次每人发一张,避开不整除的问题。每次取一副牌发,52张后判断是否要再发一副牌,直到牌发完为止。

        游戏结束,循环调用展示手牌方法输出每位玩家的手牌。

        难点在于发牌的逻辑思维要足够清晰,一群玩家对象数组需要先实例化否则会报空指针的错误。

代码片段如下:

public class Poker {//一副牌类
    boolean[] out=new boolean[53];

    public void init()//取一副牌开始发(初始化)
    {
        for(int i=0;i<53;i++)
            out[i]=true;
    }

    public int getpoker()//随机发一张牌
    {
        int x;
        while(true) {
            x = (int) (Math.random() * 52) + 1;
            if(out[x]==true){out[x]=false;break;}
        }
        return x;
    }

}
public class Gamer {//一位玩家类
    int[] hand=new int[53];

    public void init(){//清空玩家手中的牌(初始化)
        for(int i=0;i<53;i++)
            hand[i]=0;
    }

    public void show(int[] hand){//输出玩家手中所有花色牌
        System.out.print("黑桃:");
        for(int i=13;i>=1;i--)
            for(int j=hand[i];j>0;j--)
            {
                int k=i%13;
                if(k==11)System.out.print("J ");
                else if(k==12)System.out.print("Q ");
                else if(k==0)System.out.print("K ");
                else System.out.printf("%d ",k);
            }
        System.out.println();

        System.out.print("红心:");
        for(int i=26;i>=14;i--)
            for(int j=hand[i];j>0;j--)
            {
                int k=i%13;
                if(k==11)System.out.print("J ");
                else if(k==12)System.out.print("Q ");
                else if(k==0)System.out.print("K ");
                else System.out.printf("%d ",k);
            }
        System.out.println();

        System.out.print("草花:");
        for(int i=39;i>=27;i--)
            for(int j=hand[i];j>0;j--)
            {
                int k=i%13;
                if(k==11)System.out.print("J ");
                else if(k==12)System.out.print("Q ");
                else if(k==0)System.out.print("K ");
                else System.out.printf("%d ",k);
            }
        System.out.println();

        System.out.print("方块:");
        for(int i=52;i>=40;i--)
            for(int j=hand[i];j>0;j--)
            {
                int k=i%13;
                if(k==11)System.out.print("J ");
                else if(k==12)System.out.print("Q ");
                else if(k==0)System.out.print("K ");
                else System.out.printf("%d ",k);
            }
        System.out.println();

    }
}
import java.util.Scanner;

public class PokerGame {
    public static void main(String[] args) {
        int pokernum;//牌的副数
        int gamernum;//玩家人数
        Scanner sc=new Scanner(System.in);
        System.out.print("输入扑克牌幅数:");
        pokernum=sc.nextInt();
        System.out.print("输入人数:");
        gamernum=sc.nextInt();

        Poker onepoker=new Poker();//创建一个对象,表示一副牌

        Gamer[] onegamer=new Gamer[gamernum+1];//创建一个对象数组并实例化,表示一群玩家
        for(int i=1;i<=gamernum;i++) {
            onegamer[i] = new Gamer();
            onegamer[i].init();
        }


        onepoker.init();
        for(int i=1,j=1,k=1;;){//i表示第i张牌,j表示第j位玩家,k表示第k副牌
            onegamer[j].hand[onepoker.getpoker()] += 1;//给第j位玩家随机发一张牌

            j++;//发完一轮后发下一轮,j从第一位玩家开始
            if(j==gamernum+1)j=1;

            i++;//发完第52张牌时判断是否需要发下一副牌
            if(i==53){
                if(k<pokernum){i=1;k+=1;onepoker.init();}
                else break;
            }
        }

        for(int i=1;i<=gamernum;i++){//循环输出每位玩家手里的牌
            System.out.printf("第%d个玩家的手牌:\n",i);
            onegamer[i].show(onegamer[i].hand);
        }
    }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值