java作业 实现模拟保皇开始的发牌环节

最近写了一个比较大的java作业文件,由于是自己一点一点写的,遇到了一些问题,收获了很多,所以放在这里保存一下。
题目:
模拟保皇游戏开始的发牌过程。规则:4副扑克,5个玩家。1)有一个大王标记为皇上。每次发牌时,所发牌中有该大王的玩家是皇上。2)皇帝选择侍卫(也叫保儿、腿子,游戏过程中与皇帝一伙):作为皇上的玩家从自己的牌中选择一张拥有相同三张(点数和花色都相同)的一张牌(不能是2、3、大小王),其他四个玩家中有这张牌的就是侍卫。例如,皇上有三个红桃5,其他四个玩家中有红桃5的玩家就是侍卫。特殊情况是:1)皇上有一套四张牌相同的点数的牌,皇帝可以自己做侍卫;2)皇帝没有满足要求的牌,无法获得侍卫。程序要求:程序启动后生成5个玩家,并自动给他们发牌。然后输出:1)皇帝和侍卫的名字及其手里的牌(每张牌输出为“花色”+“点数”,如红桃5,牌之间用“,”分割),并按照大王、小王、2、A、K、Q、J、10、9、8、7、6、5、4、3的顺序排列,相同点数但不同花色的牌要把相同花色的牌放在一起;2)那张作为侍卫所特有的牌(“花色”+“点数”)。如果无法得到侍卫,则程序输出相应的提示。例如,程序运行后输出如下的结果:

皇帝是:玩家1

皇帝的牌是:[皇上, 小王, 小王, 小王, 小王, 方片2, 黑桃2, 黑桃A, 黑桃A, 红桃A, 方片K, 梅花K, 黑桃K, 红桃K, 梅花Q, 梅花Q, 黑桃Q, 方片J, 方片J, 方片J, 红桃J, 梅花9, 黑桃9, 黑桃9, 方片8, 梅花8, 红桃8, 梅花7, 黑桃7, 黑桃7, 红桃7, 梅花6, 梅花6, 黑桃6, 黑桃6, 方片5, 梅花5, 黑桃5, 黑桃5, 梅花4, 梅花4, 梅花4, 方片3, 红桃3]

侍卫对应的牌是:方片J

侍卫是:玩家2

侍卫的牌是:[方片2, 黑桃2, 红桃2, 方片A, 方片K, 梅花K, 梅花K, 黑桃K, 红桃K, 红桃K, 黑桃Q, 红桃Q, 方片J, 方片10, 黑桃10, 红桃10, 红桃10, 红桃10, 方片9, 红桃9, 方片8, 梅花8, 梅花8, 黑桃8, 黑桃8, 黑桃8, 红桃8, 红桃8, 方片7, 黑桃7, 黑桃7, 方片6, 黑桃6, 黑桃5, 梅花4, 黑桃4, 红桃4, 红桃4, 方片3, 梅花3, 黑桃3, 红桃3, 红桃3]

方便被一次复制,所以多类合并一个文件

import java.util.*;


class Card{
    String color;
    String no;
    boolean isk;
    public Card(String c,String n,boolean i ){
        color = c;
        no = n;
        isk = i;
    }
    public Card(String c,String n ){
        color = c;
        no = n;
        isk = false;
    }
    public boolean getIsk(){
        return isk;
    }
    public String getColor(){
        return color;
    }
    public String getNo(){
        return no;
    }
    public int getN(){
        if(no.equals("大王")) return 17;
        else if(no.equals("小王")) return 16;
        else if(no.equals("2")) return 15;
        else if(no.equals("A")) return 14;
        else if(no.equals("K")) return 13;
        else if(no.equals("Q")) return 12;
        else if(no.equals("J")) return 11;
        else return Integer.parseInt(no);
    }
    public int getM(){
        if(color.equals("方片")) return 0;
        else if(color.equals("梅花")) return 1;
        else if(color.equals("黑桃")) return 2;
        else if(color.equals("红桃")) return 3;
        return 0;
    }
}

class preCard{
    ArrayList<Card> c = new ArrayList<Card>();//总牌堆
    
    static int count = 0;
    public preCard(int n){
        for(int i=0;i<n;i++){
            makeCard();
        }
    }

    public void makeCard(){//准备一副牌 洗完加入总牌堆
        ArrayList<Card> c1 = new ArrayList<Card>();
        String[] co = new String[4];// 四花色赋值数组
        co[0] = "红桃";
        co[1] = "方片";
        co[2] = "黑桃";
        co[3] = "梅花";

        for(int i=1;i<=13;i++){ // 开始往一副初始牌 装填
            if(i==11){
                for(int j=0;j<4;j++){
                    c1.add(new Card(co[j],"J"));
                }
            }
            else if(i==12){
                for(int j=0;j<4;j++){
                    c1.add(new Card(co[j],"Q"));
                }
            }
            else if(i==13){
                for(int j=0;j<4;j++){
                    c1.add(new Card(co[j],"K"));
                }
            }
            else if(i==1){
                for(int j=0;j<4;j++){
                    c1.add(new Card(co[j],"A"));
                }
            }
            else{
                for(int j=0;j<4;j++){
                    c1.add(new Card(co[j],String.valueOf(i)));
                }
            }
        }
        if(count == 0){
            c1.add(new Card("无","小王"));
            c1.add(new Card("无","大王",true));
        }
        else{
            c1.add(new Card("无","小王"));
            c1.add(new Card("无","大王"));
        }

        Collections.shuffle(c1);//洗牌
        for(int i=0;i<54;i++){ //加入总牌堆
            c.add(c1.get(i));
        }
        count ++;
    }

    
    public ArrayList<Card> getCard(){ //取出牌堆
        return c;
    }

    
}

class giveCard{
    ArrayList<ArrayList<Card>> a= new ArrayList<ArrayList<Card>>();
    public giveCard(ArrayList<Card> h,int n){
        for(int i=0;i<n;i++){
            a.add(new ArrayList<Card>());
        }
        int i;
        int n1 = h.size()/n; //每个人分一张的轮数
        int n2 = h.size()%n; //单独分出来的
        for(i=0;i<n1*n;){
            for(int j=0;j<n;j++){
                a.get(j).add(h.get(i)); i++;
            }
        }
         for(int j=0;j<n2;j++){
            a.get(j).add(h.get(i)); i++;
         }
    }

    public ArrayList<ArrayList<Card>> getC(){
        return a;
    }
}

class So implements Comparator<Card>{
    public int compare(Card a,Card b){
        if(a.getN()==b.getN()){
            return a.getM()-b.getM();
        }
        else{
            return b.getN()-a.getN();
        }
    }
}

class Player{
    ArrayList<Card> a = new ArrayList<Card>();
    int n;
    boolean King = false;
    boolean isDf = false;
    public Player(ArrayList<Card> b){//创建玩家
        a = b;
        Collections.sort(a,new So());
    }

    
    
    public boolean isKing(){
        for(int i=0;i<a.size();i++){
            if(a.get(i).getIsk()==true){
                King = true;
                return true;
            }
        }
        return false;
    }

    public HashMap.Entry <Card,Integer> hasD(){//寻找是否有三个以上
        Map<Card,Integer> b = new HashMap<Card,Integer>();
        
        Comparator<Card> m = new So();

        for(int i=0;i<a.size();i++){
            Iterator<HashMap.Entry<Card,Integer>> p = b.entrySet().iterator();
            int c=0;
            
            while(p.hasNext()){//      注意 不能在迭代器中添加元素
                 Map.Entry<Card,Integer> t = p.next();
                if(m.compare(a.get(i),t.getKey())==0){
                     c=t.getValue();
                } 
            }
            if(c==0)
            b.put(a.get(i),1);
            else b.put(a.get(i),c+1);
        }

        Iterator<HashMap.Entry<Card,Integer>> p = b.entrySet().iterator();
        while(p.hasNext()){
            HashMap.Entry<Card,Integer> t = p.next();
            if(t.getValue()>=3){
                return t;
            }
            
        }
           
        Iterator<HashMap.Entry<Card,Integer>> t = b.entrySet().iterator();
        return t.next();
    }

    public boolean isD(Card h){//判断是不是侍卫
        Iterator<Card> p = a.iterator();
        Comparator <Card> t = new So();
        while(p.hasNext()){
            if(t.compare(p.next(),h)==0)
            return true;
        }
        return false;
    }
    public void showC(){
        
        System.out.print("[");
        for(int i=0;i<a.size();i++){
            if(a.get(i).getColor().equals("无")){
                if(i==0)
                System.out.print(a.get(i).getNo());
                else System.out.print(", "+a.get(i).getNo());
            }
            else{
                if(i==0)
                System.out.print(a.get(i).getColor()+a.get(i).getNo());
                else System.out.print(", "+a.get(i).getColor()+a.get(i).getNo());
            }
            
        }
        System.out.print("]");
    }
}


public class Main{// 没有排除三张是2或者3 的情况
    public static void main(String[] args) {

        preCard a = new preCard(4);
        
        giveCard b = new giveCard(a.getCard(),5);
        ArrayList<ArrayList<Card>> h = b.getC();
        Player[] p = new Player[5];
        int k = 0;
        for(int i=0;i<5;i++){
            p[i] = new Player(h.get(i));
            if(p[i].isKing()){
                k=i;
            }
        }
        HashMap.Entry<Card,Integer> t1 = p[k].hasD();
        if(t1.getValue()==3){
            int tt=-1;
            for(int i=0;i<5;i++){
                if(i!=k){
                    if(p[i].isD(t1.getKey())){
                        tt=i;
                    }
                }
            }
            if(tt!=-1){
                System.out.println("皇帝是: 玩家"+(k+1));
                System.out.print("皇帝的牌是: ");
                p[k].showC();
                System.out.println("\n"+"侍卫对应的牌是: "+t1.getKey().getColor()+t1.getKey().getNo());
                System.out.println("侍卫是: 玩家"+(tt+1));
                System.out.print("侍卫的牌是: "+"\n");
                p[tt].showC();
            }
        }
        else if(t1.getValue()==4){
            System.out.println("皇帝是: 玩家"+(k+1));
                System.out.print("皇帝的牌是: ");
                p[k].showC();
                System.out.println("\n"+"侍卫对应的牌是: "+t1.getKey().getColor()+t1.getKey().getNo());
                System.out.println("侍卫是: 玩家"+(k+1));
                System.out.print("侍卫的牌是: "+"\n");
                p[k].showC();
        }
        else{
            System.out.println("无侍卫");
        }
       

        
    }
}

其中一种随机输出:
皇帝是: 玩家3
皇帝的牌是: [大王, 大王, 梅花2, 黑桃2, 红桃2, 方片A, 方片A, 黑桃A, 红桃A, 梅花K, 黑桃K, 红桃K, 红桃Q, 红桃Q, 梅花J, 黑桃J, 方片10, 黑桃10, 黑桃10, 梅花9, 梅花9, 梅花9, 黑桃9, 黑桃9, 黑桃9, 方片7, 梅花7, 黑桃7, 方片6, 梅花6, 梅花6, 黑桃6, 黑桃6, 红桃6, 方片5,
梅花5, 方片4, 黑桃4, 方片3, 方片3, 黑桃3, 黑桃3, 黑桃3]
侍卫对应的牌是: 黑桃9
侍卫是: 玩家1
侍卫的牌是:
[大王, 小王, 方片2, 黑桃2, 红桃2, 红桃2, 梅花A, 梅花A, 黑桃A, 红桃A, 红桃A, 方片K, 方片K, 红桃K, 红桃K, 梅花Q, 黑桃Q, 方片J, 方片J, 方片J, 梅花J, 方片10, 梅花10, 黑桃10, 方片9, 黑桃9, 红桃9, 红桃9, 方片8, 梅花8, 方片7, 梅花7, 黑桃7, 梅花6, 黑桃6, 红桃6, 方片5, 方片5, 梅花5, 黑桃5, 方片4, 方片4, 梅花4, 红桃3]

当没有侍卫 那就输出 无侍卫

题目中主要用到两种容器 ArrayList 以及 HashSet
类有Card (用来描述每一片牌)
preCard (构造初始所有牌放在一起的牌堆)

So (Card类的排序方法 comparator)
Player(每一个玩家的牌以及性质描述)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值