因此,我正在使用haskell制作一个俄罗斯方块游戏,我在实现最后一个特性、清除整行并减少上面的每个元组时遇到了困难。
作为bord,我使用的列表只有占用的坐标(xcoord,ycoord)。
我正在考虑检查列表是否有相同ycoord的15元组(俄罗斯方块游戏的宽度),因此,如果是这样的话,行是满的,行上的所有东西都会减少1。
removeFullRow :: [(Int,Int)] -> [(Int,Int)]
removeFullRow list = ?在haskell,最好的方法是什么?
Thx寻求帮助
发布于 2018-10-20 18:09:15
考虑到使用的数据结构[(Int, Int)],这是一件相当复杂的事情。我推荐一个更合适的。
话虽如此,有几个阶段。这里有一种可能的方法:
Data.Tuple.swap ),以便每一行上的所有元素彼此相邻,并使较低的行位于列表的前面。发布于 2018-10-20 18:49:50
下面是我们将要使用的方法:
简介
import Data.Map as M第一步
countInRows :: [(Int,Int)] -> M.Map Int Int
countInRows items =
M.fromListWith (+) [(row,1) | (col,row) <- items]这项工作是通过以下方式进行的:
第二步
isFull :: Int -> M.Map Int Int -> Int -> Bool
isFull width counts row =
M.findWithDefault 0 row counts >= width这将发现一行有多满(如果它不在地图中,那么它必须有0满方格)。如果有许多满正方形的板是宽的,那么这一行必须是满的。
第三步(把所有的东西放在一起)
import Data.Map as M
removeFullRows :: Int -> [(Int,Int)] -> [(Int,Int)]
removeFullRows items =
filter (not . isFull . row) items where
counts = M.fromListWith (+) [(row,1) | (col,row) <- items]
isFull row =
M.findWithDefault 0 row counts >= width
row (x,y) = y我们通过获取行筛选出项目,查看它是否已满,如果没有,则保留该项目。
https://stackoverflow.com/questions/52908558
复制相似问题