水排序关卡生成

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可以起到快速统计连续相同元素的作用

posted @ 2021-03-30 20:08  余者皆可  阅读(333)  评论(0编辑  收藏  举报