最近看到一个小游戏倒水瓶很火, 就想用java来实现一下
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");
}
}
黄色 绿色 绿色 黄色 蓝色 橙色 蓝色
绿色 橙色 紫色 橙色 红色 靛色 靛色
橙色 黄色 橙色 绿色 红色 靛色 红色
紫色 绿色 黄色 黄色 蓝色 紫色 紫色
靛色 绿色 橙色 紫色 紫色 绿色 红色
蓝色 靛色 紫色 红色 红色 黄色 靛色
红色 黄色 蓝色 蓝色 橙色 蓝色 靛色