战舰游戏 - Javascript指导

时间:2014-09-07 15:13:46

标签: 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][62][63][64][65][66]

我现在只有一艘船在地图上的某个地方随机出现,它在3个区域水平设置。实现这一目标的代码如下:

  var location1 = Math.floor(Math.random() * 48);
  var location2 = location1+1
  var location3 = location2+1

然后我有一个代码,所以我必须点击每个瓷砖找到船的位置,如果它是一个命中/错过,我会收到一条消息。

我的问题是,我必须在地图上水平/垂直放置3艘船,我需要一些指导,这是最好的方法。我确信我可以创建更多的变量,称为位置4,5,6等等,但我认为最好将3艘船放入阵列中。

你能否提供一些帮助,以简单的代码包装3艘船的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

您可以使用对象来整齐地整理所有内容。您还可以创建一个方法,将船放置在该对象内的字段上。您可以采取更多措施来改进代码,但请将此作为开始:

// 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)
            }
        }
    }
}

然后,您可以使用var ship1 = new Ship(3,false)创建3场长水平船;使用ship1.place(7,7)将其放置在您的字段中;并使用ship1.coveredFields(包含所有字段的数组)访问覆盖的字段

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


另一个建议:通过二维数组(即包含数组的数组)描述您的字段。然后,将您的船只存放在该阵列中,而不是船舶内的坐标。这也使得放置不会更容易,并检查命中或未命中。

如果您不想这样做,因为它高于您当前的技能水平,您应该考虑分别存储至少每个维度,而不是从两者中生成一个数字。您可以使用每个点都有两个元素的数组(第一个值是x,第二个y),或者看起来像这样的对象:{x : 5, y : 3}