首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >俄罗斯方块清除整排

俄罗斯方块清除整排
EN

Stack Overflow用户
提问于 2018-10-20 17:57:46
回答 2查看 175关注 0票数 0

因此,我正在使用haskell制作一个俄罗斯方块游戏,我在实现最后一个特性、清除整行并减少上面的每个元组时遇到了困难。

作为bord,我使用的列表只有占用的坐标(xcoord,ycoord)。

我正在考虑检查列表是否有相同ycoord的15元组(俄罗斯方块游戏的宽度),因此,如果是这样的话,行是满的,行上的所有东西都会减少1。

代码语言:javascript
复制
removeFullRow :: [(Int,Int)] -> [(Int,Int)]
removeFullRow list = ?

在haskell,最好的方法是什么?

Thx寻求帮助

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-20 18:09:15

考虑到使用的数据结构[(Int, Int)],这是一件相当复杂的事情。我推荐一个更合适的。

话虽如此,有几个阶段。这里有一种可能的方法:

  1. 根据(y,x)值对输入列表进行排序(您可以将元组从(x,y)转换为Data.Tuple.swap ),以便每一行上的所有元素彼此相邻,并使较低的行位于列表的前面。
  2. 将输入列表按y值分组,以便所有行都在不同的子列表中。
  3. 将元组转换为x值。
  4. 筛选出具有15个元素的任何子列表。
  5. 通过将每个子列表的索引添加为其元素的y值来重构元组。
票数 1
EN

Stack Overflow用户

发布于 2018-10-20 18:49:50

下面是我们将要使用的方法:

  1. 我们折叠列表,计算每一行中有多少项。
  2. 如果任何行都满了
  3. 我们用整排的方式过滤掉所有的物品。

简介

代码语言:javascript
复制
import Data.Map as M

第一步

代码语言:javascript
复制
countInRows :: [(Int,Int)] -> M.Map Int Int
countInRows items =
  M.fromListWith (+) [(row,1) | (col,row) <- items]

这项工作是通过以下方式进行的:

  1. 将列表元素转换为“我知道n行中大约有一个正方形”。
  2. 通过将每一行的完整平方数相加,将它们合并在一起,
  3. 将该结果放入一个映射中,将行与其填充程度关联起来。

第二步

代码语言:javascript
复制
isFull :: Int -> M.Map Int Int -> Int -> Bool
isFull width counts row =
  M.findWithDefault 0 row counts >= width

这将发现一行有多满(如果它不在地图中,那么它必须有0满方格)。如果有许多满正方形的板是宽的,那么这一行必须是满的。

第三步(把所有的东西放在一起)

代码语言:javascript
复制
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

我们通过获取行筛选出项目,查看它是否已满,如果没有,则保留该项目。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52908558

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档