Более компактный способ сделать это? - PullRequest
1 голос
/ 17 мая 2009

У меня есть пара функций, которые зацикливаются на окружающих клетках клетки. Сетка содержится внутри массива.

В моем коде у меня есть проверки, чтобы убедиться, что это не одна из краевых ячеек, так как проверка неопределенной ячейки вызывает ошибку.

Таким образом, у меня есть такой код:

if(x > 0) {
    var firstX = x - 1;
} else {
    var firstX = x;
}
if(x < 199) {
    var lastX = x + 1;
} else {
    var lastX = x;
}

if(y > 0) {
    var firstY = y - 1;
} else {
    var firstY = y;
}
if(y < 199) {
    var lastY = y + 1;
} else {
    var lastY = y;
}

Много строк кода, чтобы сделать очень мало. Есть ли более элегантный способ сделать это?

Ответы [ 4 ]

11 голосов
/ 17 мая 2009

Или более четко:

var firstX = Math.max(x - 1, 0);
var lastX = Math.min(x + 1, 199);
var firstY = Math.max(y - 1, 0);
var lastY = Math.min(y + 1, 199);
9 голосов
/ 17 мая 2009

Вы можете использовать условный оператор:

var firstX = x > 0 ? x - 1 : x;
var lastX = x < 199 ? x + 1 : x;
var firstY = y > 0 ? y - 1 : y;
var lastY = y < 199 ? y + 1 : y;

Вы можете удалить избыточность, написав функцию для вычисления «первого» заданного значения и аналогичную для «последнего» - но я думаю, что в этом случае это будет излишним.

4 голосов
/ 17 мая 2009

Вы можете использовать условный оператор:

var firstX = x - (x > 0 ? 1:0);
var lastX = x + (x < 199 ? 1:0);
var firstY = y - (y > 0 ? 1:0);
var lastY = y + (y < 199 ? 1:0);

Edit:
Предложил альтернативный способ его использования, так как Джон уже разместил «мой» код. ;)

Редактировать 2:
Как указал Рафаэль, условие может быть неявно преобразовано в число, поэтому условный оператор не требуется:

var firstX = x - (x > 0);
var lastX = x + (x < 199);
var firstY = y - (y > 0);
var lastY = y + (y < 199);

Однако менее очевидно, что этот код делает на самом деле. Из моих тестов кажется, что Javascript последовательно использует значение 1 для true, но во всех языках программирования значение -1 так же часто используется.

0 голосов
/ 17 мая 2009

Используйте проверяемые переменные (x и y) вместо First / lastX и First / lastY

if(x > 0 && x < 199) x-=1;
else if(x > 0) x+=1;

if(y > 0 && y < 199) y-=1;
else if(y > 0) y +=1;

Просто отметьте x и y после этого. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...