• java实现倒水瓶排序


    最近看到一个小游戏倒水瓶很火, 就想用java来实现一下

    实现思路

    • 先确定瓶子和颜色的数量, 比如5种颜色, 那么就需要5+1个瓶子, 然后前5个瓶子每个瓶子倒满一种颜色, 每种颜色各5块, 最后一个是空瓶
    • 然后就是随机打乱瓶中色块
    • 最后将最后一个瓶子中的色块匀到其他瓶中, 一个关卡就生成了
    • 水瓶色块复原可以使用暴力破解, 就是随机倒色块, 只要两个色块颜色相同, 就把他们绑死, 永不分离, 但有时会遇到无法破解的关卡, 比如色块不能再倒入其他瓶中, 这时可以重新生成关卡
    • 将关卡打印结果复制到excel中, 就可以愉快的玩耍了

    代码

    import org.junit.jupiter.api.Test;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Random;
    import java.util.Stack;
    
    /**
     * 倒水瓶游戏
     * 黄色	绿色	绿色	黄色	蓝色	橙色	蓝色
     * 绿色	橙色	紫色	橙色	红色	靛色	靛色
     * 橙色	黄色	橙色	绿色	红色	靛色	红色
     * 紫色	绿色	黄色	黄色	蓝色	紫色	紫色
     * 靛色	绿色	橙色	紫色	紫色	绿色	红色
     * 蓝色	靛色	紫色	红色	红色	黄色	靛色
     * 红色	黄色	蓝色	蓝色	橙色	蓝色	靛色
     */
    public class WaterBottle {
    
        @Test
        public void test0927() {
            // 混乱次数
            int num = 10000;
            // 色块可以随意加减
            Stack<String> e = new Stack<>();
            e.add("红色");
            e.add("橙色");
            e.add("黄色");
            e.add("绿色");
            e.add("蓝色");
            e.add("靛色");
            e.add("紫色");
    
            // 颜色数量
            int colorCount = e.size();
    
            // 保存所有的水瓶, 以及水瓶中的颜色
            List<Stack<String>> list = new ArrayList<>();
            for (int i=0; i<colorCount; i++) {
                Stack<String> a = new Stack<>();
                String color = e.pop();
                for (int j=0; j<colorCount; j++) {
                    a.add(color);
                }
                list.add(a);
            }
            // 空水瓶
            Stack<String> a = new Stack<>();
            list.add(a);
    
            // 1.打乱颜色
            Random random = new Random();
            while (num > 0) {
                // 被倒入瓶子
                int index = random.nextInt(colorCount+1);
                while (list.get(index).size() == colorCount) {
                    index = random.nextInt(colorCount+1);
                }
    
                // 倒出瓶子
                int index2 = random.nextInt(colorCount+1);
                while (list.get(index2).isEmpty() || index2 == index) {
                    index2 = random.nextInt(colorCount+1);
                }
    
                // 倒出个数
                int count = random.nextInt(Math.min(list.get(index2).size(),colorCount - list.get(index).size()) + 1);
    
                for (int j=0; j<count; j++) {
                    list.get(index).add(list.get(index2).pop());
                }
    
                num--;
            }
    
            // 将最后一个瓶子置空
            if (!list.get(colorCount).isEmpty()) {
                for (int i=0; i<list.size()-1; i++) {
                    int temp = colorCount-list.get(i).size();
                    for (int j=0; j<temp; j++) {
                        list.get(i).add(list.get(colorCount).pop());
                    }
                }
            }
    
            // 打印结果
            /*for (int i=0; i
    
    
            // 2.恢复颜色
            // 方法一, 随机倒, 但一旦两个相同颜色靠在一起,就永远不分开
            num = 100000;
            while (num > 0) {
                // 倒出瓶子
                int index2 = random.nextInt(colorCount+1);
                if (list.get(index2).isEmpty()) {
                    continue;
                }
    
                // 倒出个数
                int count = 0;
                String outColor = list.get(index2).peek();
                for (int i=list.get(index2).size()-1; i>-1; i--) {
                    if (outColor.equals(list.get(index2).get(i))) {
                        count++;
                    } else {
                        break;
                    }
                }
    
                // 被倒入瓶子
                int index = random.nextInt(colorCount+1);
                if (list.get(index).size() + count > colorCount || index2 == index) {
                    continue;
                }
    
                for (int j=0; j<count; j++) {
                    list.get(index).add(list.get(index2).pop());
                }
    
                num--;
            }
    
    
    
            System.out.println("dd");
    
        }
    
    
    }
    
    
    • 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
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137

    示例

    黄色 绿色 绿色 黄色 蓝色 橙色 蓝色
    绿色 橙色 紫色 橙色 红色 靛色 靛色
    橙色 黄色 橙色 绿色 红色 靛色 红色
    紫色 绿色 黄色 黄色 蓝色 紫色 紫色
    靛色 绿色 橙色 紫色 紫色 绿色 红色
    蓝色 靛色 紫色 红色 红色 黄色 靛色
    红色 黄色 蓝色 蓝色 橙色 蓝色 靛色

  • 相关阅读:
    安装配置Spark集群
    qml Combobox用法介绍与代码演示
    打造“共富果园” 广东乳源推动茶油全产业链高质量发展
    鸿鹄工程项目管理系统em Spring Cloud+Spring Boot+前后端分离构建工程项目管理系统
    明阳天下团建游戏------围城
    代码随想录算法训练营第23期day12| 239. 滑动窗口最大值 、347. 前K个高频元素
    vue3 和 vue2 区别,面试简答
    好用的博客评论系统 Valine 使用及避坑指南
    面试题1:简单介绍,有哪几种方法可以将内联元素转换为块级元素?
    「教程」秀米怎么添加附件(Word文档、Excel表格等)
  • 原文地址:https://blog.csdn.net/sinat_34067387/article/details/133377603