Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
战舰游戏-Javascript指南_Javascript_Arrays_Variables_If Statement - Fatal编程技术网

战舰游戏-Javascript指南

战舰游戏-Javascript指南,javascript,arrays,variables,if-statement,Javascript,Arrays,Variables,If Statement,我有点需要一个纯用javascript编写的战舰游戏的指导 我的游戏由7个表行和7个表数据(7x7)组成的预制网格组成,其构建方式如下: [00][01][02][03][04][05][06] [10][11][12][13][14][15][16] [20][21][22][23][24][25][26] [30][31][32][33][34][35][36] [40][41][42][43][44][45][46] [50][51][52][53][54][55][56] [60][61

我有点需要一个纯用javascript编写的战舰游戏的指导

我的游戏由7个表行和7个表数据(7x7)组成的预制网格组成,其构建方式如下:

[00][01][02][03][04][05][06]
[10][11][12][13][14][15][16]
[20][21][22][23][24][25][26]
[30][31][32][33][34][35][36]
[40][41][42][43][44][45][46]
[50][51][52][53][54][55][56]
[60][61][62][63][64][65][66]
  var location1 = Math.floor(Math.random() * 48);
  var location2 = location1+1
  var location3 = location2+1
我现在只有一艘船,它随机地在地图上的某个地方航行,并在3个区域水平设置。实现这一点的代码如下所示:

[00][01][02][03][04][05][06]
[10][11][12][13][14][15][16]
[20][21][22][23][24][25][26]
[30][31][32][33][34][35][36]
[40][41][42][43][44][45][46]
[50][51][52][53][54][55][56]
[60][61][62][63][64][65][66]
  var location1 = Math.floor(Math.random() * 48);
  var location2 = location1+1
  var location3 = location2+1
然后,我有一个代码,所以我必须单击每个磁贴以找到船的位置,如果是命中/未命中,我会收到一条消息

我的问题是,我必须让3艘船水平/垂直地出现在地图上,我需要一些指导,知道怎样做才是最好的方法。我相信我可以创建更多的变量,称为位置4、5、6等等,但我认为这里最好将3艘船放在一个数组中


你能为我提供一些帮助吗?用更简单的代码包装3艘船的最佳方法是什么?

你可以使用对象来保持一切井然有序。您还可以创建一个mtheod,将船舶放置在该对象内的场地上。您可以做更多的工作来改进代码,但请以此为起点:

// direction: true = hor, false = vert - nicer solutions than "magic numbers" are possible
function Ship (size, direction) { 
    this.coveredFields = [];
    this.place         = function (sizeY, sizeX) { // sizeX & sizeY: size of fields in both dimensions

        // pick randomly within our limits
        var locationX;
        var locationY;
        if (direction) {
            locationX = Math.floor(Math.random() * (sizeX - 1 - size));
            locationY = Math.floor(Math.random() * (sizeY - 1));
        } else {
            locationX = Math.floor(Math.random() * (sizeX - 1));
            locationY = Math.floor(Math.random() * (sizeY - 1 - size));
        }

        // TODO: check that we don't cross/overlap other ships
        // ...

        // setting locations
        for (var i = 0 ; i < size ; i++) {
            if (direction) {
                this.coveredFields.push(locationY * 10 + locationX + i)
            } else {
                this.coveredFields.push((locationY + i) * 10 + locationX)
            }
        }
    }
}
//方向:true=hor,false=vert-比“幻数”更好的解决方案是可能的
功能船(大小、方向){
this.coveredFields=[];
this.place=函数(sizeY,sizeX){//sizeX&sizeY:两个维度中字段的大小
//在我们的范围内随意挑选
var-locationX;
变量定位;
如果(指示){
locationX=Math.floor(Math.random()*(sizeX-1-size));
locationY=Math.floor(Math.random()*(sizeY-1));
}否则{
locationX=Math.floor(Math.random()*(sizeX-1));
locationY=Math.floor(Math.random()*(sizeY-1-size));
}
//TODO:检查我们是否与其他船只交叉/重叠
// ...
//设置位置
对于(变量i=0;i
然后,您可以使用
var ship1=newship(3,false)
创建3字段长的水平ship;使用
ship1将其放置在您的字段中。放置(7,7)
;并使用
ship1.coveredFields
(包含所有字段的数组)访问包含的字段

如果这对您来说太复杂,只需为每个芯片的位置使用一个数组(
var ship1=[location1,location2,…]
)-但OOP很可能是最好的方法


另一个建议是:用二维数组(即包含数组的数组)描述字段。然后,将船只存储在该阵列中,而不是船只内部的坐标。这也使得在没有重叠的情况下放置更容易,并且可以检查命中或未命中


如果你不想这样做,因为它超出了你当前的技能水平,你应该考虑至少单独存储每个维度,而不是从两者中生成一个数字。你可以使用每个点都有两个元素的数组(第一个值是,x,第二个y),或者像这样的对象:

{x:5,y:3}

除了定位飞船之外,你应该发布你的代码,从外观上看,还有很多可以改进的地方。你确实意识到你的飞船现在可以从26到27(哪个不存在)?嗨,Johannes H,是的,这是我知道的另一个问题,我只是想看看我是否可以从船上开始。我也会检查代码审查,谢谢@NitGenerate可能的有效起始位置数组(即n,n+1,n+2必须都存在并且为空,n才能成为有效的起始位置),从数组中选择随机项。为下一艘船重新生成数组。嗨,Johannes,这显然给了我足够的时间继续工作。非常感谢你的详细解释。非常感谢。@SmáriAlfreðsson很高兴我能帮上忙!查看我的最新编辑,以获得计算船只覆盖的所有位置的固定版本-我忘记了实际增加每个字段的numer;)