Java实验-模拟保皇游戏开始的发牌过程

3.模拟保皇游戏开始的发牌过程。

规则: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.*;

public class Main {

    public static void main(String[] args) {
        Poker p = new Poker(); // 生成1副扑克
        String []poker =  p.getPoker(); // 获取这副扑克

        p.playgame(); // 生成4副扑克,并洗好
        List poker_list = p.getPoker_list(); //获取 洗好的牌
        //生成五名玩家
        PlayUser [] playuser = new PlayUser[5];
        for(int i = 0; i < 5; i ++ ){
            playuser[i] = new PlayUser(poker);
        }
        //测试玩家是否生成
//        for( int i = 0; i < 5; i ++ ){
//            System.out.println(playuser[i].getName());
//        }
        //发牌并标记皇帝
        int flag_index = 0;
        for(int i = 0; i < poker_list.size(); i ++){
            int t = i % 5;
            int index = (int)poker_list.get(i);
            (playuser[t].getUser_poker())[index] ++;
            if( index == 54 ){ // 表示皇上
                flag_index = t;
            }
        }
        //测试发牌是否生成
        System.out.println("玩家1-玩家5的牌为:");
        for( int i = 0; i < 5; i ++ ){
            System.out.println(playuser[i]);
        }
        // 找到皇上
//        System.out.println("\n\n皇上是玩家" + (flag_index + 1));

        // 找皇上的侍卫
        // 判断皇帝自己能否是侍卫
        if( playuser[flag_index].jment()){
            System.out.println("\n\n皇上是: " +  playuser[flag_index].getName() + "( 可自保 )");
            System.out.print("皇上的牌是:");
            System.out.println(playuser[flag_index]);
        }
        else{
            List list = playuser[flag_index].select_guard();
            System.out.println("皇上有几个3个相同的: " + list.size());
            if( list.size() > 1 ){ // 如果皇上有多个3个相同的
                int ind = (int) (Math.random() * list.size());
                System.out.println("\n\n皇上是: " +  playuser[flag_index].getName());
                System.out.println(playuser[flag_index]);
                System.out.println("侍卫对应的牌是:" + list.get(ind));
                for( int i = 0; i < playuser.length ; i ++ ){
                    if( i != flag_index && playuser[i].getUser_pokers().indexOf(list.get(ind)) != -1 ) {
                        System.out.println("侍卫是:" + playuser[i].getName());
                        System.out.print("侍卫的牌是:");
                        System.out.println(playuser[i]);
                    }
                }
            }
            else if( list.size() == 1 ){
                System.out.println("\n\n皇上是: " +  playuser[flag_index].getName());
                System.out.println(playuser[flag_index]);
                System.out.println("侍卫对应的牌是:" + list.get(0));
                for( int i = 0; i < playuser.length; i ++ ){
                    if( i != flag_index && playuser[i].getUser_pokers().indexOf(list.get(0)) >= 0 ){
                        System.out.println("侍卫是:" + playuser[i].getName());
                        System.out.print("侍卫的牌是:");
                        System.out.println(playuser[i]);
                    }
                }
            }
            else{
                System.out.println("\n\n皇上是: " +  playuser[flag_index].getName() + "( 无法获取侍卫 )");
                System.out.print("皇上的牌是:");
                System.out.println(playuser[flag_index]);
            }
        }
    }
}

class Poker{
    private String[] poker;// 生成一幅扑克牌
    private final int poker_num = 54;
    private List poker_list; // 生成4副扑克牌

    String [] poker_type = { "梅花", "方块", "黑桃", "红桃"};
    String [] poker_value = {"2", "A", "K", "Q", "J", "10", "9", "8", "7", "6", "5", "4", "3"};
    //生成一幅扑克牌,一幅扑克 54 张
    Poker(){
        this.poker = new String[this.poker_num];
        poker[0] = "大王";
        poker[1] = "小王";

        for(int i = 2; i < poker_num; ){
            for( int j = 0; j < poker_value.length; ++ j ){
                for(int k = 0; k < poker_type.length; ++ k ){
                    poker[i ++] = poker_type[k] + poker_value[j];
                }
            }
        }
    }

    public String[] getPoker() {
        return poker;
    }

    public List getPoker_list() {
        return poker_list;
    }

    // 生成4副扑克牌
    public  void playgame() {
        poker_list = new ArrayList<Integer>();
        for( int i = 0; i < poker.length - 1; i ++ ){
            poker_list.add(i);
            poker_list.add(i);
            poker_list.add(i);
            poker_list.add(i);
        }
        poker_list.add(poker.length - 1);
        poker_list.add(poker.length - 1);
        poker_list.add(poker.length - 1);
        poker_list.add(54); // 皇帝
        Collections.shuffle(poker_list); // 进行随机排序
    }
}

class PlayUser{
    private String name; // 玩家名字
    private int [] user_poker = new int[55]; // 玩家手里的牌
    private String[] poker;
    private static int num = 1;
    private boolean bool = false;

    public PlayUser(String [] poker) {
        this.name = "玩家" + num ++;
        this.poker = poker;
        for( int i = 0; i < user_poker.length; ++ i ){
            user_poker[i] = 0; // 清零
        }
    }
    // 找侍卫
    public List select_guard(){
        List guard = new ArrayList<String>();
        for(int i = 3; i < user_poker.length - 1; i ++ ){
            // (点数和花色都相同)的一张牌(不能是2、3、大小王)
            if( user_poker[i] == 3 && i != 14){
                guard.add( poker[i] );
            }
        }
        return guard;
    }

    // 判断皇上自己能否当侍卫
    public boolean jment(){
        for(int i = 3; i < user_poker.length - 1; i ++ ){
            // 皇上有一套四张牌相同的点数的牌,皇帝可以自己做侍卫
            if( user_poker[i] == 4 ){
                return true;
            }
        }
        return false;
    }

    public String getName() {
        return name;
    }

    public int[] getUser_poker() {
        return user_poker;
    }

    public List getUser_pokers() {
        int sum = 0;
        List user_list = new ArrayList<String>();
        if( user_poker[54] != 0 ){
            user_list.add("皇上");
            sum += 1;
        }
        for(int i = 0; i < user_poker.length - 1; i ++ ){
            sum += user_poker[i];
            for( int j = 0; j < user_poker[i]; j ++ ){
                user_list.add( poker[i] );
            }
        }
        //测试每个玩家几张牌
      //  System.out.println(sum);
        return user_list;
    }
    public String toString(){
        String res = "[";
        List user_list = getUser_pokers();
        for(int i = 0; i < user_list.size() - 1; i ++ ){
            res += user_list.get(i) + ", ";
        }
        return res + user_list.get(user_list.size() - 1) + "]";
    }
}


测试结果1

玩家1-玩家5的牌为:
[皇上, 大王, 大王, 小王, 方块2, 方块2, 黑桃2, 红桃2, 梅花A, 梅花A, 方块A, 红桃A, 红桃A, 梅花K, 方块K, 黑桃K, 黑桃K, 红桃K, 红桃K, 梅花Q, 红桃Q, 红桃Q, 黑桃J, 红桃J, 梅花10, 方块10, 梅花9, 方块9, 黑桃9, 梅花8, 梅花8, 方块7, 黑桃7, 红桃7, 红桃6, 红桃6, 红桃6, 梅花5, 梅花5, 方块5, 方块5, 黑桃5, 方块4, 黑桃4]
[梅花2, 方块2, 黑桃2, 红桃2, 红桃2, 梅花A, 方块A, 黑桃A, 红桃A, 梅花K, 黑桃K, 红桃K, 方块Q, 黑桃Q, 红桃Q, 红桃Q, 黑桃J, 黑桃J, 红桃J, 梅花10, 方块9, 红桃9, 梅花8, 方块8, 黑桃8, 黑桃8, 梅花7, 梅花6, 梅花6, 方块6, 方块6, 方块6, 方块5, 方块5, 红桃5, 红桃5, 梅花3, 梅花3, 梅花3, 方块3, 方块3, 方块3, 红桃3]
[小王, 梅花2, 黑桃2, 黑桃2, 红桃2, 梅花Q, 梅花Q, 方块Q, 方块Q, 梅花J, 梅花J, 梅花J, 方块J, 方块J, 红桃J, 梅花10, 方块10, 红桃10, 梅花9, 黑桃9, 黑桃9, 黑桃9, 红桃9, 方块8, 方块8, 黑桃8, 梅花7, 方块7, 方块7, 黑桃7, 梅花6, 梅花6, 黑桃6, 黑桃5, 黑桃5, 红桃5, 梅花4, 梅花4, 梅花4, 方块4, 红桃4, 黑桃3, 黑桃3]
[大王, 小王, 小王, 梅花2, 方块2, 方块A, 方块A, 红桃A, 方块K, 方块K, 梅花Q, 方块Q, 黑桃Q, 梅花J, 方块J, 黑桃J, 方块10, 黑桃10, 黑桃10, 红桃10, 梅花9, 红桃9, 梅花8, 红桃8, 红桃8, 红桃8, 红桃8, 方块7, 黑桃7, 黑桃7, 红桃7, 红桃7, 方块6, 黑桃6, 黑桃6, 梅花5, 红桃5, 黑桃4, 红桃4, 梅花3, 方块3, 黑桃3, 红桃3]
[大王, 梅花2, 梅花A, 黑桃A, 黑桃A, 黑桃A, 梅花K, 梅花K, 方块K, 黑桃K, 红桃K, 黑桃Q, 黑桃Q, 方块J, 红桃J, 梅花10, 方块10, 黑桃10, 黑桃10, 红桃10, 红桃10, 梅花9, 方块9, 方块9, 红桃9, 方块8, 黑桃8, 梅花7, 梅花7, 红桃7, 黑桃6, 红桃6, 梅花5, 黑桃5, 梅花4, 方块4, 方块4, 黑桃4, 黑桃4, 红桃4, 红桃4, 黑桃3, 红桃3]
皇上有几个3个相同的: 1

皇上是: 玩家1
[皇上, 大王, 大王, 小王, 方块2, 方块2, 黑桃2, 红桃2, 梅花A, 梅花A, 方块A, 红桃A, 红桃A, 梅花K, 方块K, 黑桃K, 黑桃K, 红桃K, 红桃K, 梅花Q, 红桃Q, 红桃Q, 黑桃J, 红桃J, 梅花10, 方块10, 梅花9, 方块9, 黑桃9, 梅花8, 梅花8, 方块7, 黑桃7, 红桃7, 红桃6, 红桃6, 红桃6, 梅花5, 梅花5, 方块5, 方块5, 黑桃5, 方块4, 黑桃4]
侍卫对应的牌是:红桃6
侍卫是:玩家5
侍卫的牌是:[大王, 梅花2, 梅花A, 黑桃A, 黑桃A, 黑桃A, 梅花K, 梅花K, 方块K, 黑桃K, 红桃K, 黑桃Q, 黑桃Q, 方块J, 红桃J, 梅花10, 方块10, 黑桃10, 黑桃10, 红桃10, 红桃10, 梅花9, 方块9, 方块9, 红桃9, 方块8, 黑桃8, 梅花7, 梅花7, 红桃7, 黑桃6, 红桃6, 梅花5, 黑桃5, 梅花4, 方块4, 方块4, 黑桃4, 黑桃4, 红桃4, 红桃4, 黑桃3, 红桃3]

测试结果2

玩家1-玩家5的牌为:
[大王, 梅花2, 方块2, 方块2, 黑桃2, 黑桃2, 黑桃A, 梅花K, 方块K, 方块K, 黑桃K, 方块Q, 黑桃Q, 梅花J, 方块J, 方块J, 黑桃J, 黑桃J, 红桃J, 梅花10, 梅花10, 黑桃10, 红桃10, 方块9, 梅花8, 方块8, 黑桃8, 黑桃8, 红桃8, 方块7, 方块7, 黑桃7, 梅花6, 方块6, 黑桃6, 方块5, 红桃5, 红桃5, 梅花4, 梅花4, 黑桃4, 黑桃4, 红桃4, 红桃4]
[小王, 红桃2, 梅花A, 梅花A, 方块A, 方块A, 红桃A, 梅花K, 红桃K, 梅花Q, 方块Q, 黑桃Q, 梅花J, 梅花J, 梅花J, 方块J, 梅花10, 方块10, 方块10, 红桃10, 梅花9, 方块9, 方块9, 红桃9, 红桃9, 红桃8, 梅花7, 梅花7, 黑桃7, 梅花6, 方块6, 黑桃6, 红桃6, 红桃6, 梅花5, 梅花5, 方块5, 梅花4, 红桃4, 方块3, 方块3, 方块3, 黑桃3]
[皇上, 大王, 小王, 小王, 方块2, 黑桃2, 黑桃2, 梅花A, 方块A, 黑桃A, 红桃A, 红桃A, 梅花K, 方块K, 红桃Q, 红桃Q, 红桃Q, 红桃Q, 红桃J, 黑桃10, 方块9, 黑桃9, 黑桃9, 梅花8, 方块8, 梅花7, 方块7, 黑桃7, 红桃7, 红桃7, 梅花6, 红桃6, 梅花5, 黑桃5, 黑桃5, 黑桃5, 红桃5, 梅花4, 方块4, 方块4, 方块3, 红桃3, 红桃3]
[大王, 大王, 小王, 梅花2, 方块2, 红桃2, 红桃2, 梅花A, 黑桃A, 黑桃K, 红桃K, 红桃K, 梅花Q, 梅花Q, 黑桃Q, 黑桃J, 红桃J, 红桃J, 方块10, 方块10, 黑桃10, 红桃10, 梅花9, 黑桃9, 黑桃9, 红桃9, 红桃9, 梅花8, 梅花8, 方块8, 红桃8, 梅花7, 方块7, 梅花6, 方块6, 方块6, 黑桃6, 方块5, 黑桃5, 方块4, 方块4, 黑桃4, 黑桃3]
[梅花2, 梅花2, 红桃2, 方块A, 黑桃A, 红桃A, 梅花K, 方块K, 黑桃K, 黑桃K, 红桃K, 梅花Q, 方块Q, 方块Q, 黑桃Q, 方块J, 黑桃J, 梅花10, 黑桃10, 红桃10, 梅花9, 梅花9, 方块8, 黑桃8, 黑桃8, 红桃8, 黑桃7, 红桃7, 红桃7, 黑桃6, 红桃6, 梅花5, 方块5, 红桃5, 黑桃4, 红桃4, 梅花3, 梅花3, 梅花3, 梅花3, 黑桃3, 黑桃3, 红桃3]

皇上是: 玩家3( 可自保 )
皇上的牌是:[皇上, 大王, 小王, 小王, 方块2, 黑桃2, 黑桃2, 梅花A, 方块A, 黑桃A, 红桃A, 红桃A, 梅花K, 方块K, 红桃Q, 红桃Q, 红桃Q, 红桃Q, 红桃J, 黑桃10, 方块9, 黑桃9, 黑桃9, 梅花8, 方块8, 梅花7, 方块7, 黑桃7, 红桃7, 红桃7, 梅花6, 红桃6, 梅花5, 黑桃5, 黑桃5, 黑桃5, 红桃5, 梅花4, 方块4, 方块4, 方块3, 红桃3, 红桃3]

测试结果3

玩家1-玩家5的牌为:
[大王, 大王, 梅花A, 梅花A, 梅花A, 黑桃A, 黑桃A, 红桃A, 黑桃K, 方块Q, 红桃Q, 红桃Q, 梅花J, 方块J, 方块10, 方块10, 方块10, 红桃10, 梅花9, 方块8, 红桃8, 红桃8, 黑桃7, 黑桃7, 红桃7, 梅花6, 方块6, 黑桃6, 黑桃6, 红桃6, 红桃6, 方块5, 方块5, 方块5, 黑桃5, 红桃5, 梅花4, 方块4, 红桃4, 梅花3, 方块3, 方块3, 黑桃3, 红桃3]
[小王, 梅花2, 梅花2, 黑桃2, 红桃2, 红桃2, 梅花A, 方块A, 红桃A, 梅花K, 梅花Q, 方块Q, 方块Q, 方块Q, 黑桃Q, 黑桃Q, 梅花J, 梅花J, 方块J, 黑桃J, 黑桃J, 红桃J, 方块10, 黑桃10, 红桃10, 红桃10, 梅花9, 梅花9, 方块9, 方块9, 黑桃8, 黑桃8, 红桃8, 方块7, 方块7, 黑桃7, 梅花5, 红桃5, 方块4, 方块4, 梅花3, 梅花3, 黑桃3]
[小王, 方块2, 方块2, 黑桃2, 黑桃A, 方块K, 方块K, 方块K, 黑桃K, 红桃K, 红桃K, 梅花Q, 梅花Q, 黑桃Q, 梅花J, 方块J, 红桃J, 梅花10, 梅花10, 黑桃10, 黑桃10, 红桃10, 黑桃9, 黑桃9, 红桃9, 红桃9, 红桃9, 梅花8, 梅花8, 梅花8, 方块8, 梅花7, 梅花6, 梅花6, 方块6, 方块6, 黑桃6, 黑桃5, 黑桃4, 红桃4, 梅花3, 方块3, 方块3]
[皇上, 大王, 大王, 小王, 梅花2, 方块2, 黑桃2, 红桃A, 红桃A, 梅花K, 梅花K, 红桃K, 红桃K, 黑桃Q, 方块J, 黑桃J, 红桃J, 梅花10, 黑桃10, 梅花9, 方块9, 黑桃9, 红桃9, 梅花8, 方块8, 方块8, 黑桃8, 红桃8, 梅花7, 方块7, 方块7, 黑桃7, 红桃7, 梅花6, 梅花5, 梅花5, 黑桃5, 红桃5, 梅花4, 方块4, 黑桃4, 红桃4, 红桃3]
[小王, 梅花2, 方块2, 黑桃2, 红桃2, 红桃2, 方块A, 方块A, 方块A, 黑桃A, 梅花K, 方块K, 黑桃K, 黑桃K, 梅花Q, 红桃Q, 红桃Q, 黑桃J, 红桃J, 梅花10, 方块9, 黑桃9, 黑桃8, 梅花7, 梅花7, 红桃7, 红桃7, 方块6, 黑桃6, 红桃6, 红桃6, 梅花5, 方块5, 黑桃5, 红桃5, 梅花4, 梅花4, 黑桃4, 黑桃4, 红桃4, 黑桃3, 黑桃3, 红桃3]
皇上有几个3个相同的: 0

皇上是: 玩家4( 无法获取侍卫 )
皇上的牌是:[皇上, 大王, 大王, 小王, 梅花2, 方块2, 黑桃2, 红桃A, 红桃A, 梅花K, 梅花K, 红桃K, 红桃K, 黑桃Q, 方块J, 黑桃J, 红桃J, 梅花10, 黑桃10, 梅花9, 方块9, 黑桃9, 红桃9, 梅花8, 方块8, 方块8, 黑桃8, 红桃8, 梅花7, 方块7, 方块7, 黑桃7, 红桃7, 梅花6, 梅花5, 梅花5, 黑桃5, 红桃5, 梅花4, 方块4, 黑桃4, 红桃4, 红桃3]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Hello Spring

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值