List Haskell:在不减速的情况下按程序生成级别

List Haskell:在不减速的情况下按程序生成级别,list,haskell,random,functional-programming,List,Haskell,Random,Functional Programming,为了更好地学习Haskell,我试图基本上构建一个著名独立游戏的变体 但是,我对级别生成有一个问题: 现在,级别生成是通过一个包含所有不同“挑战”(墙模式,实现为[[Bool]],行数可变,每个行包含True或False)的列表来完成的;这些是该级别的构建块。使用getStdGen()数字生成器,我可以创建一个无限长的手套列表 但是,在同一时间,我们只想渲染其中的一部分。为了跟踪一个挑战是否已经通过,引入了第二个参数,包含在此参数之前所有挑战的行数之和。(例如,length(gauntletDa

为了更好地学习Haskell,我试图基本上构建一个著名独立游戏的变体

但是,我对级别生成有一个问题:

现在,级别生成是通过一个包含所有不同“挑战”(墙模式,实现为
[[Bool]]
,行数可变,每个行包含
True
False
)的列表来完成的;这些是该级别的构建块。使用getStdGen()数字生成器,我可以创建一个无限长的手套列表

但是,在同一时间,我们只想渲染其中的一部分。为了跟踪一个挑战是否已经通过,引入了第二个参数,包含在此参数之前所有挑战的行数之和。(例如,
length(gauntletData currentRandomNumber)+snd$randomGauntletList!!(n-1)
,其中
randomGauntletList
的类型为
[(Gauntlet,Integer)]

问题在于如何在渲染函数和更新函数中使用此列表:
take 30$dropWhile(\(\uu,distance)->currentDistance>distance)randomGaultList

dropWhile
导致程序返回列表当前“起点”的时间越来越长,因此在+-30秒后会减慢游戏速度


我没办法了:有没有办法解决这个问题?

你能把挑战列表存储在一个引用中,然后把你已经通过的部分扔掉吗?@DanielWagner可能吧?这样的引用怎么可能产生?我怎么能扔掉无限列表中的部分?你能展示一下吗我想@DanielWagner是在建议,不管你如何持有无限列表,你都可以在需要的时候删除第一个元素。这可能意味着有一个递归函数用列表的尾部调用它自己,或者它可能意味着修改一个
IORef
来占据它持有的列表的头部,或者它可能意味着修改tate在一个
StateT
…如果看不到更多的代码,就很难提出具体的建议。@qwy:它应该与您当前正在增加
当前距离的
非常类似;但是不使用
(+)
要生成新的距离编号,可以使用
drop
生成新的手套列表。