2016-04-13 40 views
1

我在想我应该用什么数据结构来表示一个方形游戏板(考虑每个单元格可以有一些颜色)。最自然的想法是二维列表,但很难查询和改变它。Immutable.js:表示2D游戏领域的数据结构

所以,现在使用地图,键${x}.${y}(存在JS :(无元组)和值代表颜色 像这样的东西蜇伤:

Map([['0.0', 'red'], ['0.1', 'red'], ['1.0', 'blue'], ['1.1', 'red']]) 

它是确定使用这些数据?结构是否有Immutable.js方面的任何更好的解决方案

回答

5

我正在构建一些自己的2D游戏板,并且遇到了同样的问题。我所做的解决方案是Record

它看起来像一个物体,也表现得像一个物体。但是用香草物体,你不能做下面的映射字典的东西。

const dict = {}; 

const key1 = { row: 0, col: 1 }; 
const value1 = { some: 'value' }; 

dict[key1] = value; // will not work 

这是我想要的,尽管我试图使映射尽可能简单。与RecordMapImmutable.js,您可以执行以下操作。

import { Map, Record } from 'immutable'; 

const dict = Map(); 
const Pos = Record({ row: 0, col: 0 }); // some initial value. 
const Val = Record({ some: 'value' }); // same here. 

const key1 = new Pos({ row: 0, col: 1 }); 
const value1 = new Val({ some: 'value' }); 

dict = dict.set(key1, value1); // works like you wish 

您可以阅读官方文档了解更多信息。也许你有更好的解决方案,请让我知道:)。

+0

好的答案!我可以比较两个记录吗? – kharandziuk

+0

当然你可以,结帐Immutable.is() –

+0

我想这是有道理的添加到答案 – kharandziuk

0

是否有一个理由,为什么你不能用一个2维数组,像这样:

let square = [ 
    ['red', 'green', 'blue'], 
    ['orange', 'red', 'blue'], 
    ['red', 'blue', 'blue'] 
]; 

然后,您可以将上述数据结构添加到您的地图。

所以要访问中间的磁贴,您可以使用数组的索引[1][1]

+0

>在Immutable.js方面有没有更好的解决方案? – kharandziuk

+0

你可以在这里找到的原因https://facebook.github.io/react/docs/advanced-performance.html – kharandziuk

+0

我确定有。你只是要求数据结构。我就是这么做的。问题在于,如果你说这是一个“游戏板”,为什么你会希望它是不可变的?它会不会在某个点或另一个点改变状态? – Neal

0

我很好奇你为什么认为列表清单很难查询和更改。您可以使用长度为2的数组作为[x, y]对,并将其传递给getInsetInupdateIn方法。

let grid = Immutable.toJS([ 
    ['red', 'green'], 
    ['blue', 'yellow'] 
]); 

grid.getIn([0, 1]); // => 'green'; 
grid = grid.setIn([0, 1], 'purple'); 
grid.getIn([0, 1]); // => 'purple'; 
grid = grid.updateIn([0, 0], cell => cell.toUpperCase()); 
grid.getIn([0, 0]); // => 'RED'; 

很容易一些功能应用到网格中的每一个细胞都带有map(...)

可能是比用地图正试图找到一个价值坐标棘手
grid.map((row, x) => row.map(cell, y) => x + cell + y); 
grid.get([1, 1]); // => '1yellow1' 

一件事。

const x = grid.findIndex(row => row.contains('blue')); // => 1 
const y = grid.get(x).indexOf('blue'); // => 0 
grid.get([x, y]); // => blue