zoukankan      html  css  js  c++  java
  • JAVA collection集合之 扑克牌游戏

    主要内容:这里使用collection集合,模拟香港电影中大佬们玩的扑克牌游戏。

    1、游戏规则:两个玩家每人手中发两张牌,进行比较。比较每个玩家手中牌最大的点数,大小由A-2,点数大者获胜。如果点数相同,则比较花色,大小由黑(4)、红(3)、梅(2)、方(1),花色大者获胜。

    2、实现步骤:

    • 创建一副扑克牌A-2,四种花色黑(4)、红(3)、梅(2)、方(1)共52张牌;
    • 创建两个玩家包含玩家ID和姓名、所持牌Card信息;
    • 洗牌并向两位玩家各发两张牌;
    • 比较玩家手中牌大小,得出获胜者;

    3、程序实现

    牌Card类:包含牌的数字和花色

    package collectiontest.games;
    public class Card {
        private Integer id; //牌的大小
        private Integer type;//牌的花色
        
        public Card(Integer id, Integer type) {
            this.id = id;
            this.type = type;
        }
        public Integer getId() {
            return id;
        }
        public void setId(Integer id) {
            this.id = id;
        }
        public Integer getType() {
            return type;
        }
        public void setType(Integer type) {
            this.type = type;
        }
        @Override
        public String toString() {
            return "Card [id=" + id + ", type=" + type + "]";
        }    
    }

     扑克牌Poker类:包含扑克牌Card A-2

    package collectiontest.games;
    public class Poker {
        private Card id2 ;
        private Card id3 ;
        private Card id4 ;
        private Card id5 ;
        private Card id6 ;
        private Card id7 ;
        private Card id8 ;
        private Card id9 ;
        private Card id10 ;
        private Card J ;
        private Card Q ;
        private Card K ;
        private Card A ;
        
        public Poker() {
        }        
        //四个类型:黑--4、红--3、梅--2、方--1
        public Poker(Integer type) {
            this.id2 = new Card(2, type);
            this.id3 = new Card(3, type);
            this.id4 = new Card(4, type);
            this.id5 = new Card(5, type);
            this.id6 = new Card(6, type);
            this.id7 = new Card(7, type);
            this.id8 = new Card(8, type);
            this.id9 = new Card(9, type);
            this.id10 = new Card(10, type);
            this.J = new Card(11, type);
            this.Q = new Card(12, type);
            this.K = new Card(13, type);
            this.A = new Card(14, type);
        }
        public Card getId2() {
            return id2;
        }
        public void setId2(Card id2) {
            this.id2 = id2;
        }
        public Card getId3() {
            return id3;
        }
        public void setId3(Card id3) {
            this.id3 = id3;
        }
        public Card getId4() {
            return id4;
        }
        public void setId4(Card id4) {
            this.id4 = id4;
        }
        public Card getId5() {
            return id5;
        }
        public void setId5(Card id5) {
            this.id5 = id5;
        }
        public Card getId6() {
            return id6;
        }
        public void setId6(Card id6) {
            this.id6 = id6;
        }
        public Card getId7() {
            return id7;
        }
        public void setId7(Card id7) {
            this.id7 = id7;
        }
        public Card getId8() {
            return id8;
        }
        public void setId8(Card id8) {
            this.id8 = id8;
        }
    
        public Card getId9() {
            return id9;
        }
        public void setId9(Card id9) {
            this.id9 = id9;
        }
        public Card getId10() {
            return id10;
        }
        public void setId10(Card id10) {
            this.id10 = id10;
        }
        public Card getJ() {
            return J;
        }
        public void setJ(Card j) {
            J = j;
        }
        public Card getQ() {
            return Q;
        }
        public void setQ(Card q) {
            Q = q;
        }
        public Card getK() {
            return K;
        }
        public void setK(Card k) {
            K = k;
        }
        public Card getA() {
            return A;
        }
        public void setA(Card a) {
            A = a;
        }
    }

     玩家Player类:包含玩家ID和姓名、所持卡片信息

    package collectiontest.games;
    import java.util.ArrayList;
    import java.util.List;
    
    public class Player {
        //玩家的ID
        private  String id ;
        //玩家姓名
        private  String name ;
        //玩家所持牌
        private  List<Card> pokerType ;
        
        public Player() {    
        }
        public Player(String id, String name, List<Card> pokerType) {
            this.id = id;
            this.name = name;
            this.pokerType = new ArrayList<>();
        }
    
        public String getId() {
            return id;
        }
        public void setId(String id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public List<Card> getPokerType() {
            return pokerType;
        }
        public void setPokerType(List<Card> pokerType) {
            this.pokerType = pokerType;
        }    
    }

    扑克牌游戏主类:包含1)扑克牌创建 2)玩家创建 3)洗牌 4)发牌 5)比较胜负

    package collectiontest.games;
    
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Collections;
    import java.util.HashMap;
    import java.util.HashSet;
    import java.util.List;
    import java.util.Map;
    import java.util.Scanner;
    import java.util.Set;
    
    public class GamsBegin {
    
        // 创建扑克牌
        public  Set<Poker> cPoker() {
            
            System.out.println("**********开始创建扑克牌**********");
            // 创建一副poker
            // 四个类型:黑--4、红--3、梅--2、方--1
            Set<Poker> pokers = new HashSet<>();
            Poker[] poker = { new Poker(1), new Poker(2), new Poker(3),
                    new Poker(4) };
            /*
             * Collections工具类的使用
             * Collections.addAll(pokers, new Poker(1), new Poker(2), new Poker(3),new Poker(4));
             *
             * */
            pokers.addAll(Arrays.asList(poker));
    
            System.out.println("**********扑克牌创建成功**********");
    
            return pokers;
        }
    
        // 创建两个玩家
        public  Map<String, Player> cPlayer() {
            
            System.out.println("**********开始创建玩家**********");
            Map<String, Player> map = new HashMap<String, Player>();
            // 控制数量
            Integer control = 0;
    
            System.out.println("创建两名玩家,根据提示创建");
            Scanner console = new Scanner(System.in);
            while (true) {
                System.out.println("请输入第  "+(control+1)+" 个玩家ID:");
                String courseId = console.next();
    
                if (isNumeric(courseId)) {
                    System.out.println("请输入第  "+(control+1)+" 个玩家姓名:");
                    String courseName = console.next();
    
                    Player players = new Player(courseId, courseName, null);
                    //保存数据
                    map.put(courseId, players);
    
                    System.out.println("添加第 " + (control + 1) + " 个玩家  " + courseName
                            + " 成功");
                    //数量自加
                    control++;
                } else {
                    System.out.println("*****请输入数字ID*****");
                    continue;
                }
    
                if (control == 2) {
                    break;
                }
    
            }
    
            System.out.println("**********玩家创建成功**********");
    
            return map;
        }
    
        // 判断输入是否为数字, Character.isDigit()为java方法
        public  boolean isNumeric(String str) {
            for (int i = 0; i < str.length(); i++) {
                if (!Character.isDigit(str.charAt(i))) {
                    return false;
                }
            }
            return true;
        }
    
        /**
         * 洗牌 :也可以产生52个不同随机数,实现洗牌
         *
         **/
        public  List<Card> wPoker(Set<Poker> pokers) {
            System.out.println("**********开始洗牌**********");
            //利用List的有序排序,洗牌之后保存顺序不变
            List<Card> listCard = new ArrayList<>();
            // 利用Set集合的无序排序,实现洗牌
            Set<Card> listSet = new HashSet<>();
    
            //保存到Set集合,无序
            for (Poker pk : pokers) {
                listSet.add(pk.getId2());
                listSet.add(pk.getId3());
                listSet.add(pk.getId4());
                listSet.add(pk.getId5());
                listSet.add(pk.getId6());
                listSet.add(pk.getId7());
                listSet.add(pk.getId8());
                listSet.add(pk.getId9());
                listSet.add(pk.getId10());
                listSet.add(pk.getJ());
                listSet.add(pk.getQ());
                listSet.add(pk.getK());
                listSet.add(pk.getA());
            }
    
            //保存在List集合,有序
            for (Card cd : listSet) {
                listCard.add(cd);
                System.out.println(cd);
            }
            
            System.out.println("**********洗牌成功**********");
    
            return listCard;
        }
    
        // 发牌
        public  Map<String, Player> pushPoker(List<Card> listCard,
                Map<String, Player> pMap) {
            System.out.println("**********发牌开始**********");
            
            // 控制每人发两张牌后结束
            int control = 0;
    
            for (Map.Entry<String, Player> entry : pMap.entrySet()) {
    
                if (control == 0) {
                    for (int i = 0; i < 3; i = i + 2) {
                        // 发牌
                        entry.getValue().getPokerType().add(listCard.get(i));
                    }
                    // 更新map对象
                    pMap.put(entry.getKey(), entry.getValue());
                    control++;
                } else if (control == 1) {
                    for (int i = 1; i < 4; i = i + 2) {
                        // 发牌
                        entry.getValue().getPokerType().add(listCard.get(i));
                    }
                    // 更新map对象
                    pMap.put(entry.getKey(), entry.getValue());
                    control++;
                } else {
                    break;
                }
            }
    
            System.out.println("**********发牌成功**********");
    
            return pMap;
        }
    
    
        public  void compareMatch(Map<String, Player> newMap) {
        
            /*比较胜负
             * 1.首先取得每个玩家手中最大牌的ID和花色ID。
             * 2.比较俩玩家手中最大牌的ID大小,牌大者获胜。
             * 3.如果两张牌的ID相等,在比较两张牌的花色ID,花色ID更大着获胜。
             * 
             * */ 
            
            List<Player> players = new ArrayList<>();
    
            // 获得两个玩家
            for (Map.Entry<String, Player> entry : newMap.entrySet()) {
                players.add(entry.getValue());
            }
    
            // 玩家一信息和所持牌
            List<Card> playerOne = players.get(0).getPokerType();
            //获得最大牌的ID和花色
            Integer oneMaxId = Math.max(playerOne.get(0).getId(), playerOne.get(1)
                    .getId());
            Integer oneMaxType = (oneMaxId!=playerOne.get(0).getId()) ?  playerOne.get(1).getType() : playerOne.get(0).getType() ;
    
            // 玩家二信息和所持牌
            List<Card> playerTwo = players.get(1).getPokerType();
            //获得最大牌的ID和花色
            Integer twoMaxId = Math.max(playerTwo.get(0).getId(), playerTwo.get(1)
                    .getId());
            Integer twoMaxType = (twoMaxId!=playerTwo.get(0).getId()) ?  playerTwo.get(1).getType() : playerTwo.get(0).getType() ;
    
            if (oneMaxId > twoMaxId) {
                System.out.println("玩家 : " + players.get(0).getName() + " 获胜!!");
            } else if (oneMaxId == twoMaxId) {
    
                if (oneMaxType > twoMaxType) {
                    System.out
                            .println("玩家 : " + players.get(0).getName() + " 获胜!!");
    
                } else {
                    System.out
                            .println("玩家 : " + players.get(1).getName() + " 获胜!!");
                }
    
            } else {
                System.out.println("玩家 : " + players.get(1).getName() + " 获胜!!");
            }
    
            System.out.println("**********************************************");
            System.out.println("玩家 : " + players.get(0).getName() + "的牌是:"
                    + showName(playerOne.get(0).getType(), 0) + "--"
                    + showName(playerOne.get(0).getId(), 1) + "   "
                    + showName(playerOne.get(1).getType(), 0) + "--"
                    + showName(playerOne.get(1).getId(), 1));
            System.out.println("玩家 : " + players.get(1).getName() + "的牌是:"
                    + showName(playerTwo.get(0).getType(), 0) + "--"
                    + showName(playerTwo.get(0).getId(), 1) + "   "
                    + showName(playerTwo.get(1).getType(), 0) + "--"
                    + showName(playerTwo.get(1).getId(), 1));
        }
    
        // 显示牌的名称
        private  String showName(Integer i, Integer type) {
            String str = "";
    
            // 显示花色
            if (type == 0) {
                switch (i) {
                case 1: {
                    str = "方块";
                    break;
                }
                case 2: {
                    str = "梅花";
                    break;
                }
                case 3: {
                    str = "红桃";
                    break;
                }
                case 4: {
                    str = "黑桃";
                    break;
                }
    
                default: {
                    break;
                }
                }
    
            }
    
            // 显示数字
            if (type == 1) {
                if (i < 11) {
                    return i.toString();
                } else {
                    switch (i) {
                    case 11: {
                        str = "J";
                        break;
                    }
                    case 12: {
                        str = "Q";
                        break;
                    }
                    case 13: {
                        str = "K";
                        break;
                    }
                    case 14: {
                        str = "A";
                        break;
                    }
    
                    default: {
                        break;
                    }
                    }
                }
            }
    
            return str;
        }
    
        public static void main(String[] args) {
            GamsBegin gb = new GamsBegin();
            
            // 1、创建扑克牌
            Set<Poker> pokers = gb.cPoker();
    
            // 2、创建两个玩家
            Map<String, Player> pMap = gb.cPlayer();
    
            // 3、洗牌
            List<Card> listCard = gb.wPoker(pokers);
    
            // 4、发牌
            Map<String, Player> newMap = gb.pushPoker(listCard, pMap);
    
            // 4、比较胜负
            gb.compareMatch(newMap);
    
        }
    }

    运行结果:

    **********开始创建扑克牌**********
    **********扑克牌创建成功**********
    **********开始创建玩家**********
    创建两名玩家,根据提示创建
    请输入第  1 个玩家ID:
    123
    请输入第  1 个玩家姓名:
    周星驰
    添加第 1 个玩家  周星驰 成功
    请输入第  2 个玩家ID:
    456
    请输入第  2 个玩家姓名:
    周润发
    添加第 2 个玩家  周润发 成功
    **********玩家创建成功**********
    **********开始洗牌**********
    Card [id=9, type=3]
    Card [id=11, type=4]
    Card [id=13, type=3]
    Card [id=8, type=3]
    Card [id=5, type=2]
    Card [id=6, type=1]
    Card [id=4, type=3]
    Card [id=5, type=4]
    Card [id=2, type=3]
    Card [id=9, type=2]
    Card [id=9, type=4]
    Card [id=14, type=2]
    Card [id=9, type=1]
    Card [id=2, type=1]
    Card [id=2, type=4]
    Card [id=7, type=4]
    Card [id=11, type=1]
    Card [id=10, type=1]
    Card [id=14, type=4]
    Card [id=14, type=3]
    Card [id=12, type=2]
    Card [id=2, type=2]
    Card [id=10, type=2]
    Card [id=7, type=1]
    Card [id=7, type=3]
    Card [id=8, type=2]
    Card [id=4, type=4]
    Card [id=13, type=4]
    Card [id=14, type=1]
    Card [id=12, type=1]
    Card [id=5, type=1]
    Card [id=6, type=4]
    Card [id=12, type=4]
    Card [id=11, type=2]
    Card [id=10, type=3]
    Card [id=3, type=4]
    Card [id=12, type=3]
    Card [id=4, type=2]
    Card [id=4, type=1]
    Card [id=6, type=2]
    Card [id=5, type=3]
    Card [id=8, type=4]
    Card [id=3, type=2]
    Card [id=13, type=2]
    Card [id=7, type=2]
    Card [id=3, type=3]
    Card [id=3, type=1]
    Card [id=6, type=3]
    Card [id=8, type=1]
    Card [id=11, type=3]
    Card [id=13, type=1]
    Card [id=10, type=4]
    **********洗牌成功**********
    **********发牌开始**********
    **********发牌成功**********
    玩家 : 周星驰 获胜!!
    **********************************************
    玩家 : 周星驰的牌是:红桃--9   红桃--K
    玩家 : 周润发的牌是:黑桃--J   红桃--8
  • 相关阅读:
    破解Mac版MyEclipse-2017-ci3
    JAVA8 十大新特性详解
    Java 1.8 时间日期库的20个使用示例
    20180206 反射中模块化开发的上课思路
    反射在数据库读写中的应用
    浅谈多线程并发
    Mac OS Git 安装
    MAC node + git + bower 简单安装
    Mac OS 下 eclipse中文乱码解决方法(eclipse for mac 中文乱码)
    【精华】MacOS 10.13.2 环境下安装eclipse
  • 原文地址:https://www.cnblogs.com/xiaoxing/p/6025361.html
Copyright © 2011-2022 走看看