我正在制作棋盘游戏我正在寻找更好的方法来管理棋盘上的棋子。我现在拥有的是一种从坐标放置在板上的方法。这是存储播放器数据的JSON对象:
"players" : {
"1" : {
"id" : 1,
"name": "ilya",
"units" : [
{
"id" : 1,
"row" : 1,
"square" : 2
},{
"id" : 2,
"row" : 2,
"square" : 1
},{
"id" : 3,
"row" : 3,
"square" : 1
}
]
},
我只是通过创建一个div并将其附加到相应的棋盘方格div并使用jquery-ui移动它们来放置它们:
$('<div/>', {
class: 'draggable player' + player + ' unit unit' + unit,
}).appendTo('.row' + row + ' .square' + square + ' .unitPosition');
row
和square
是一个表格,unitPosition
是square
现在要在玩家移动后取回数据,我可以找回行和方形类并提取它们的数字,但在我看来这是一种非常低效的方式。有没有更好的方法来管理这样的网格并存储每个单元/单元的位置数据?
按照流行的要求,这是html(缩写为示例):
<div id="board">
<div class="clearfix row row1">
<div class="square square1">
<div class="unitPosition"></div>
</div>
<div class="square square2">
<div class="unitPosition"></div>
</div>
<div class="square square3">
<div class="unitPosition"></div>
</div>
</div>
<div class="clearfix row row2">
<div class="square square1">
<div class="unitPosition"></div>
</div>
<div class="square square2">
<div class="unitPosition"></div>
</div>
<div class="square square3">
<div class="unitPosition"></div>
</div>
</div>
</div>
董事会:
答案 0 :(得分:2)
为了更新数据对象,如果使用units
作为每个元素的键将id
更改为对象而不是数组,则会使其更简单
"players" : {
"1" : {
"id" : 1,
"name": "ilya",
"units" : {
1: {
"id" : 1,
"row" : 1,
"square" : 2
},
2:{
"id" : 2,
"row" : 2,
"square" : 1
}
}
您可以使用index()
方法获取行和单元格索引。对每个元素使用data-
属性将有很大帮助。
当您阅读数据时,您可以根据数据中eq()
和row
的值,使用squre
找到单元格。
var $cell = $('tr').eq( row ).find('td').eq( square);
$('<div data-player="'+player.id+'" data-unit_id="'+unit+'"/>', {
class: 'draggable player' + player + ' unit unit' + unit,
}).appendTo($cell);
当您将设备放入新的方块时:
/* pseudo code, not sure what your drop/append code looks like*/
var $cell= /* your logic to define the cell being placed in*/
var square= $cell.index();
var row= $cell.parent().index();
/* read player and unit from "data-" attributes of DIV*/
var unit= $(this).data('unit_id'), player= $(this).data('player');
现在通过修改数据结构,可以非常轻松地更新主对象players
:
players[player].units[unit].row=row;
players[player].units[unit].square=square;
简单的单元格/行索引演示:http://jsfiddle.net/buh4h/
API参考:
答案 1 :(得分:1)
我们对您的代码了解不多,但您似乎希望能够将数据附加到HTML元素,而不必依赖类,并从类名中提取数字。
您可以为每个表格单元格添加data-
属性,并使用播放器div来分隔数据,而不是(或除此之外)使用类。你的HTML会变成这样:
<table>
<tr>
<td data-row="1" data-col="1">
<div data-player="1"></div>
</td>
<!-- etc -->
</tr>
<!-- etc -->
</table>
然后,您可以通过阅读这些属性或使用.data()
方法使用jQuery检索这些值:
// Assuming you're inside an event handler and "this" is a td
var row = $(this).attr('data-row');
// or
var row = $(this).data('row');