JavaScript中的二维结构数组
我想在javascript中创建二维数组,其中每个单元格都是具有属性的结构。如何访问单元结构的属性 这是我的代码: 谢谢 ----更新---- 我犯了这个错误JavaScript中的二维结构数组,javascript,arrays,Javascript,Arrays,我想在javascript中创建二维数组,其中每个单元格都是具有属性的结构。如何访问单元结构的属性 这是我的代码: 谢谢 ----更新---- 我犯了这个错误 TypeError: Cannot set property 'mine' of undefined (line 38) 这是我的密码 //扫雷游戏 //询问用户游戏的大小 var rows=行数(提示(“请输入行数”,“10”)); var cols=编号(提示(“请输入列数”,“10”)); //计算矿井数量 var矿山=数学地板(
TypeError: Cannot set property 'mine' of undefined (line 38)
这是我的密码
//扫雷游戏
//询问用户游戏的大小
var rows=行数(提示(“请输入行数”,“10”));
var cols=编号(提示(“请输入列数”,“10”));
//计算矿井数量
var矿山=数学地板(行*列*0.2);
//函数创建单元格对象
功能单元(值,打开){
返回{
“价值”:价值,
“开放”:开放,
“我的”:假的
};
};
//初始化所有单元格
var game=新阵列(行);
对于(变量i=0;i
更新:我不知道为什么我的答案被否决了,因为这是在OP发布更新之前发布的,但不管怎样
我只是这样做了:
// function to create cell objects
function cell() {
return {
"value": 0,
"open": 0,
"mine": false
};
};
// initialise all cells
var game = new Array(10);
for (var i = 0; i < 10; i++) {
game[i] = new Array(10);
for (var j = 0; j < 10; j++) {
game[i][j] = cell();
}
}
console.log(game[0][0].mine);
//用于创建单元格对象的函数
功能单元(){
返回{
“值”:0,
“打开”:0,
“我的”:假的
};
};
//初始化所有单元格
var游戏=新阵列(10);
对于(变量i=0;i<10;i++){
游戏[i]=新阵列(10);
对于(var j=0;j<10;j++){
game[i][j]=cell();
}
}
console.log(游戏[0][0].mine);
我在我的控制台上得到了正确的值。访问它到底有什么问题?问题不在于数组本身,而在于代码中的最后一条if语句
if( game[i][j].mine === false){
game[i][j].mine = true;
placedMine = true;
}
在前面的for循环中定义并使用了j。当j
等于cols
且j保留该值(cols
的值)时,for循环退出,因此if语句中的条件等于
if( game[0][cols].mine === false){
...
}
由于您从未将任何内容分配给game[0][cols]
,因此表达式(game[0][cols]
)未定义,并且没有名为mine
你也有一个功能缺陷。您在最后一个for循环中使用i作为地雷计数器以及行号。我想你真正想做的是
// place mines randomly
for(var i = 0 ; i < mines ; i++){
var placedMine = false;
while(!placedMine){
var row = Math.floor((Math.random()*rows)),
col = Math.floor((Math.random()*cols)),
cell = game[row][cell];
if(cell.mine === false){
cell.mine = true;
placedMine = true;
}
}
}
//随机放置地雷
对于(var i=0;i
我做了三个改变:
x
和y
更多的描述性名称cell
row
和col
(以前是x
和y
)作为索引,而不是I
和j
通过创建一个变量来保存单元格引用,您不再需要两次索引,重命名x和y使代码更易于阅读(特别是因为x通常是水平值,也就是列号,y通常是垂直值)您的代码示例完全按照您想要的方式工作。哦,天哪!我怎么会错过这个!非常感谢!
if( game[i][j].mine === false){
game[i][j].mine = true;
placedMine = true;
}
if( game[0][cols].mine === false){
...
}
// place mines randomly
for(var i = 0 ; i < mines ; i++){
var placedMine = false;
while(!placedMine){
var row = Math.floor((Math.random()*rows)),
col = Math.floor((Math.random()*cols)),
cell = game[row][cell];
if(cell.mine === false){
cell.mine = true;
placedMine = true;
}
}
}