• Java基础(二十一)十点半游戏


    十点半游戏

    十点半是一种流行的纸牌游戏,可以说是一种变体的二十一点游戏。游戏的规则是,每个玩家根据所拿到的牌点数的总和来决定是否继续要牌。目标是尽量接近但不超过十点半的点数,超过十点半即为爆牌。如果两名玩家都未爆牌,则点数更接近十点半的人获胜。这个游戏非常简单且容易上手,适合多人一起娱乐。
    代码实现

    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    
    public class Poker {
        private static final List<String> suits = Arrays.asList("♠", "♥", "♦", "♣");  // 花色
        private static final List<String> ranks = Arrays.asList("2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "小王", "大王");  // 点数
    
        private List<String> deck;
        private Boolean isComplete;
    
        public Poker() {
            this(true);
        }
    
        public Poker(boolean isComplete) {
            deck = new ArrayList<>();  // 扑克牌
            // 向扑克牌列表中储存元素
            for (String suit : suits) {
                for (String rank : ranks.subList(0, 13)) {
                    String card = suit + rank;
                    deck.add(card);
                }
            }
            if (isComplete) {
                deck.add("大王");
                deck.add("小王");
            }
        }
    
        public List<String> getDeck() {
            return deck;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    import java.util.*;
    
    /**
     * @author BXB
     */
    public class Game {
        public static void main(String[] args) {
            List<String> poker = new Poker(false).getDeck();
    
            shuffle(poker);
            gameing(poker);
        }
        
        // 进行游戏
        public static void gameing(List<String> poker){
            ArrayList<String> player = new ArrayList<>();
            ArrayList<String> bot = new ArrayList<>();
            boolean isTermination = true;
            Scanner input = new Scanner(System.in);
            // 玩家发牌
            do {
                player.add(poker.get(0));  // 向玩家发牌
                System.out.println(player);
                poker.remove(0);  // 去除已经发出去的牌
                if (countPoints(player) > 10.5) {
                    break;
                }
                System.out.println("还要继续取牌吗?(Y or N)");
                if ("N".equals(input.next())) {
                    isTermination = false;
                }
            } while (isTermination);
    
            if (isWin(player)) {
                System.out.println("你赢了,恭喜恭喜");
                System.out.println(bot);
            } else if (countPoints2(player) <= 10.5) {
                // 机器人取牌
                while (countPoints2(bot) <= countPoints2(player) && countPoints2(bot) != 10.5) {
                    bot.add(poker.get(0));
                    poker.remove(0);
                }
                // 判断机器人是否赢了
                if (isLost(bot)) {
                    System.out.println("机器人输了\n" + bot);
                } else if (isWin(bot) || isWin(bot, player)) {
                    System.out.println("机器人赢了\n" + bot);
                } else {
                    System.out.println("你赢了,恭喜恭喜\n" + bot);
                }
            } else {
                System.out.println("你输了");
            }
        }
    
        // 洗牌
        public static void shuffle(List<String> list) {
            for (int i = 0; i < 3; i++) {
                // System.currentTimeMillis() 来设置随机种子。每一次运行程序时都会使用不同的随机种子,从而产生更随机的结果。
                Collections.shuffle(list, new Random(System.currentTimeMillis()));
            }
        }
    
        // 计算点数和2
        public static double countPoints2(List<String> list) {
            List<String> ranks = Arrays.asList("A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K");  // 点数
            double count = 0;
            // 匿名函数中局部变量 count 必须声明为 final 或者实际上是 final 的(即该变量值不可更改)。
            for (String str : list) {
                str = str.replaceAll("[♠♥♦♣]", "");  // 去除花色
                switch (str) {
                    case "A" -> count += 1;
                    case "J","Q","K" -> count += 0.5;
                    default -> count += Double.parseDouble(str);
                }
            }
            return count;
        }
    
        // 判断输赢
        public static boolean isLost(List<String> list) {
            if (countPoints2(list) > 10.5) {
                return true;
            }
            return false;
        }
        
        public static boolean isWin(List<String> list) {
            if (countPoints2(list) > 10.5) {
                return false;
            } else if (list.size() == 5) {
                return true;
            }
            return false;
        }
        
        public static boolean isWin(List<String> list, List<String> botList) {
            return countPoints2(list) > countPoints2(botList);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
  • 相关阅读:
    RedisTemplate的Pipelined方式怎么使用?
    域内创建机器用户
    微信小程序文件上传wx.uploadFile
    Redis Geo
    OpenMP 教程(一) 深入剖析 OpenMP reduction 子句
    OpenGL ES glad 下载和使用
    k8s集群reset恢复重置
    大咖说|翼辉丁晓华:我们已经真正意义上感受到了原始创新带来的巨大价值
    【工具】利用ffmpeg将网页中的.m3u8视频文件转化为.mp4格式
    linux常见命令(七)
  • 原文地址:https://blog.csdn.net/bao_14440/article/details/132794886