水排序关卡生成
import random import numpy as np from collections import Counter import itertools # 定义多维数列转换函数,后面输出参数使用 def flatten(a): if not isinstance(a, (list, )): return [a] else: b = [] for item in a: b += flatten(item) return b # defin re map inital def remap(col_num,zon_num): big_arry=[] for i in range(col_num): pur_arry=np.repeat(i,4).tolist() big_arry.append(pur_arry) big_arry=flatten(big_arry) pass # random and cut to new array big_array=np.array(big_arry) big_sum=np.random.shuffle(big_array) #print(big_array) result_array=big_array.reshape(col_num,zon_num) #print(result_array) return result_array # define check arrayi in contine same and num # check if yes def check_if(array,check_num): xy=array.shape x=xy[0] y=xy[1] for i in range(y): for key, group in itertools.groupby(array[i]): if len(list(group)) > check_num: print(key,list(group)) return False break else: pass pass pass return True # number of color # creat big arrary col_num=5 # number of cup # zone of cup zon_num=4 # remap inita result_init=remap(col_num,zon_num) if check_if(result_init,2) ==True: if_i=False pass else: if_i=True pass while if_i: result_init=remap(col_num,zon_num) pass
最后的result_init即为随机结果
remap 函数是根据 提供的 颜色数量col_num和预装容器数量zon_num生成zon_num个初始乱序的数组
check_if 用来判断 初始数组中连续相邻的相同元素是否超过上线,超过则false
if_if 对check_if的结果进行反向;配合while使用
其中迭代工具itertools可以起到快速统计连续相同元素的作用
轻诺必寡信,多易必多难