javascript - 战舰错误JavaScript
问题描述
我目前正在用 Javascript 开发 Battleship 游戏,但是,每次运行代码都会出现Cannot read property '4' of undefined
错误。
我到处寻找答案,但找不到任何答案。我还尝试console.log
查看未定义的内容,我认为这是我的变量选项卡,它是游戏的棋盘,但我找不到解决方案使其未定义。
这是我创建板的代码:
var tab = [];
for (var i=0; i<dim; i++) {
tab.push([]);
for(var j=0; j<dim; j++) {
tab[i].push(0);
}
}
generateships(tab, dim, 1, 4);
generateships(tab, dim, 2, 3);
generateships(tab, dim, 3, 2);
generateships(tab, dim, 4, 1);
在代码的最后一部分,我调用了检查是否可以在该位置插入船的函数。它需要tab,dim,这是板的尺寸,例如10,船的数量,最后是船的长度。
function generateships(tab, dim, numbships, boatlen) {
for (var i = 0; i < numbships; i++) {
var empty = false;
while (!empty) {
var direction = Math.floor(Math.random() * 2);
if (direction === 1) {
var X = Math.floor(Math.random() * (dim - boatlen));
var Y = Math.floor(Math.random() * dim);
for (var i = 0; i < dim; i++) {
if (tab[X][Y + i] == 0) {
empty = true;
} else {
empty = false;
}
}
} else {
var X = Math.floor(Math.random() * dim);
var Y = Math.floor(Math.random() * (dim - boatlen));
for (var k = 0; k < dim; k++) {
if (tab[X + k][Y] == 0) {
empty = true;
} else {
empty = false;
}
}
}
}
shiplocations(numbships, boatlen, direction, X, Y);
}
}
我调用的最后一个函数是将船插入特定位置的函数。它需要船只的数量、船的长度、方向和坐标。
function shiplocations(numbships, boatlen, direction, X, Y) {
for (var k = 0; k < numbships; k++) {
for (var i = 0; i < boatlen; i++) {
if (direction === 1) {
tab[X][Y + i] = boatlen;
} else if (direction != 1) {
tab[X + i][Y] = boatlen;
}
}
}
}
我真的很感谢你的帮助,谢谢。
解决方案
我还没有调试过你的代码,但这听起来像是一个索引与计数的问题。当您有四个项目并遍历它们时,项目 1、2、3 和 4 的索引为 0、1、2、3。很可能您正在尝试引用项目 nbr 4,但它将位于索引 3 (第四指数)。索引 4 处将没有任何内容(未定义)。尝试从 i = 1 而不是 i = 0 开始循环,或者更好地从零而不是 1 开始你的项目。
推荐阅读
- php - 在 Woocommerce 的自定义“我的帐户”部分获取 $_GET 或 $_POST
- swift - 线程 1 EXC_BAD_ACCESS(代码=2,地址=0x7ffeeb1aeff8)
- asp.net-mvc - 编辑视图中的恢复日期时间值
- ios - iOS - Objective C 动态框架为 arch x86_64 (模拟器)发出位码
- android - 无法从身份验证成功侦听器写入 Firebase 数据库
- javascript - 用于在 Web 浏览器中查看和填写 PDF 表单的 JS 库
- python - 调试 ansible-playbook 失败
- html - 引导下拉菜单隐藏在 div 和 z-index 属性下方不起作用
- r - R使用dplyr将行添加到分组的df
- c - 用c系统函数执行openssl命令和在终端执行openssl命令输出不同