我有一个2048类型的游戏,其中的游戏板网格是由一个列表的4个其他列表(其中每个包含4个瓷砖)。
每次移动时,newGameboardGrid都保存在另一个列表中(以便当玩家想要撤消移动时可以调用removeLast )。
当玩家滑动时,我需要将newGameboardGrid网格和前一个网格进行比较,看看是否发生了任何实际的移动,或者瓷砖的值是否仍然相同(就像玩家在没有可能移动的方向上滑动一样)。
我试过这个代码:
if (newGameboardGrid == listOfGameboardGrids.last) {
// do something
}这几乎是因为它将新移动的>与上一步的>进行了比较,但问题是,即使所有的平铺值都相同,也永远不会导致两个>相等。我相信这是因为它在比较哈希码和/或其他东西。

Tile类中有很多东西,但是我想比较的是一个名为"value“的int。是否可以仅比较这两个>的“值”变量?
提前感谢您的帮助!(如果我的任何条款不准确,请表示歉意。)
发布于 2021-02-13 17:12:28
Dart列表实现不覆盖operator== of Object,因此它们只能与自己相等。没有检查这些元素。
如果要比较元素(这里是列表元素的元素),可以使用来自package:collection的package:collection类
const boardEquality = ListEquality(ListEquality(DefaultEquality()));这将创建一个ListEquality对象,该对象通过检查两个元素列表是否包含相同数量的列表来比较它们,该列表同样包含相同数量的相同元素。(我假设Tile实现了operator==)。
您可以将其用作:if (boardEquality.equals(newGameboardGrid, listOfGameboardGrids.last)) { ... }。
发布于 2021-02-13 01:35:11
您可以对特定的列表类型执行扩展方法,并为比较每个Tile创建一个Tile方法。
extension TileListComp on List<List<Tile>> {
bool isEqual(List<List<Tile>> other) {
if(this.length != other.length || this[0]?.length != other[0]?.length) {
return false;
}
for(int x = 0; x < this.length; x++) {
for(int y = 0; y < this[0].length; y++) {
if(this[x][y] != other[x][y]) {
return false;
}
}
}
return true;
}
}如果您让而不是为您的Tile类实现了任何类型的比较,则需要这样做。必要的话我可以告诉你。
https://stackoverflow.com/questions/66181011
复制相似问题