提高功能速度
Improve function speed
我正在用iio引擎用javascript做一个战舰游戏。
我正试图与电脑对抗,所以我必须为船只放置一个随机位置(我希望你知道游戏:))。
我有5艘船必须放在一个网格中(10x10)。问题是这个函数非常慢,有时页面根本无法加载。
我想知道这些功能的速度是否有一些改进,我有点新手:D
function posShips(size){
// var size -> size of the ship
var isOk = false; // flag var to check if the ship is in a right position
var isOk2 = true; // flag var, become false if the cell is already fill with another ship
var i;
var j;
var side; // horizontal or vertical
while(!isOk){
i = iio.getRandomInt(1,11);
j = iio.getRandomInt(1,11);
side = iio.getRandomInt(0,2);
if((side ? j : i)+size-1 < 11){ // Not out of the array
for (var k = 0; k < size; k++) { // Size of the ship
if(side){
if(gridHit[i][j+k].stat == "empty"){ //If is empty put the ship
gridHit[i][j+k].stat = "ship";
gridHit[i][j+k].setFillStyle("red")
}else{ // If not empty
isOk2 = false; //Position is not good, do all the thing again.
for (var a = 0; a < size; a++) { // Reset cell
gridHit[i][j+a].stat = "empty";
}
k = 10;
}
}else{
if(gridHit[i+k][j].stat == "empty"){ //If is empty put the ship
gridHit[i+k][j].stat = "ship";
gridHit[i+k][j].setFillStyle("red")
}else{ // If not empty
isOk2 = false; //Position is not good, do all the thing again.
for (var a = 0; a < size; a++) { // Reset cell
gridHit[i+a][j].stat = "empty";
}
k = 10;
}
}
};
if(isOk2)
isOk = true;
}
}
}
-
不要选择将落在网格之外的船舶位置。首先拾取方向,然后根据
size
限制x
和y
的初始位置。例如,如果大小是3,则对于变化坐标的初始值没有超过7的点。 -
搜索时不要更改数组。先进行搜索,然后才更新数组。这样可以避免任何"清理"操作。
-
尽可能消除重复的深层对象引用。如果针对不同的
x
重复访问grid[y][x]
,请先引用grid[y]
,然后将其用于后续访问。 -
尽早脱离循环,如果前一个位置已经失败,那么继续测试一个位置是没有意义的。
-
把你的大船放在第一位——把小船放在大船之间的空隙里更容易。
请参阅http://jsfiddle.net/alnitak/Rp9Ke/对于我的实现,与您的功能等效的是:
this.place = function(size) {
// faster array access
var g = this.grid;
// initial direction, and vector
var dir = rand(2); // 0 - y, 1 - x
var dx = dir ? 1 : 0;
var dy = dir ? 0 : 1; // or 1 - dx
LOOP: while (true) {
// initial position
var x = dir ? rand(10 - size) : rand(10);
var y = dir ? rand(10) : rand(10 - size);
// test points
var n = size, tx = x, ty = y;
while (n--) {
if (g[ty][tx]) continue LOOP;
tx += dx;
ty += dy;
}
// fill points
n = size;
while (n--) {
g[y][x] = size;
x += dx;
y += dy;
}
break;
}
};
相关文章:
- 添加文字和评论功能更新Div
- JavaScript打印功能使日历停止工作
- 每当您在选择器内移动鼠标时,悬停功能就会重复
- 如何防止网页加载后自动启动功能
- 除修剪外的其他功能
- 悬停功能触发器
- 使用angularjs向浏览器发送servlet响应(下载功能)
- Wacom stu-430签名捕获速度太慢
- 删除CKEditor工具栏按钮,但不删除功能
- 异步facebook功能
- 如何将chrome扩展功能移植到移动设备(特别是jquery和trello)
- jQuery滚动功能只工作一次
- 为什么本机浏览器排序功能的工作速度比快速排序慢
- 使用速度缓动功能.js无法正常工作
- 增加滚动速度的功能
- 吸气功能的速度与直接访问的速度
- 提高功能速度
- jQuery速度完成回调正在调用,但功能没有
- 如何使用JIRA AUI功能在我自己的自定义领域-速度编辑
- 使用jquery.effects.滑梯,如何结合方向、速度,完成功能