我对纯粹用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艘船的最佳方法是什么?
答案 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}