LINUX.ORG.RU

Правильно ли я пишу на яваскрипт?

 


0

1

Пишу небольшую игрушку на html и там такая задача, что нужно по индексам двух ячеек на поле 10 на 10 определить можно ли из ячеек составить вертикальную или горизонтальную цепочку. Т.е. берем один индекс пристраиваем к нему еще, далее берем второй индекс как конец и пристраиваем к нему дальше. Собственно ниже моя функция проверки. Ниже приведена моя функция проверки. И собственно вопрос, что меня беспокоит: не многовато ли round, abs, floor? Реально ли в javascript как то работать с целыми числами ( типа как с int в с++ )?

cellsChain = function( cell_1, cell_2 ) {
	
	cell_1 = Math.round(cell_1);
	cell_2 = Math.round(cell_2);
	
	if( ( Math.abs( cell_1 - cell_2 ) == 1 ) && ( Math.floor( cell_1/10 ) == Math.floor( cell_2/10 ) ) ) {
		return true;
	}
	
	if( ( Math.abs( cell_1 - cell_2 ) == 10 ) && ( Math.floor( cell_1%10 ) == Math.floor( cell_2%10 ) ) ){
		return true;
	}
	
	return false;
}

★★

Неважно. Всё равно мы все умрём.

anonymous
()

Нет, не правильно. Твои строки слишком длинные.

anonymous
()

Слишком много пробелов и отступов.

anonymous
()

нифига не понятно. что такое cell_1, cell_2? как задается поле?

Mr_Gentoo
()

Я нифига не понял твою задачу. Если все X или все Y одинаковы - то линия, не?

По коду не очень-то понятно тоже (что кстати значит что пишешь ты неправильно)

Kalashnikov ★★★
()

Почитай в чем отличие объявления var_name = function(){} от function var_name() {}

xpahos ★★★★★
()

Можешь вместо Math.floor использовать запись вида:

(cell/10)|0, либо ~~(cell/10)

Math.abs можешь локально кешировать:

var abs = Math.abs, правда прироста производительноси это не принесет, зато запись короче.

Строгой типизации в js нет, поэтому забудь про int.

Boba_Fett
()

не многовато ли round

Всего два. Но только что это вообще такое? Индексы полей? А почему они не целые у тебя? Почему их два, хотя, я так понимаю, должно быть четыре (X, Y первой и второй клетки)?

abs

Если тебе нужна абсолютная величина умножения, как еще ее взять? Разве что написать свой abs.

floor

Не понимаю, зачем запихивать деление целых чисел по модулю 10 в floor. В случае простого деления - ну, наверное, нельзя обойтись, кроме хитрых переподвыподвертов...

Хотя, мне кажется, я начал догадываться, что ты там удумал. У тебя индекс каждой клетки - это двузначное число, где старший разряд - координата X (от 0 до 9), а младший - Y (или наоборот). Так, что ли? (Но тогда зачем round?)

Если ты такого хочешь, то, может быть, подумать над двоичным представлением этих чисел и пользоваться соответствующими функциями для вычислений?

proud_anon ★★★★★
()
Последнее исправление: proud_anon (всего исправлений: 1)

Ты прочитал, что в жабаскрипте нет целых чисел и тебе стало не по себе? Иначе я не пойму, что происходит.

Deleted
()

Тип ceil_1 и ceil_2 меняется -> будет деоптимизация.

Vit ★★★★★
()

Собственно ниже моя функция проверки. Ниже приведена моя функция проверки. И собственно вопрос, что меня беспокоит

Вот до чего доводит программирование на си))

Math.floor( cell_2%10 )

Отбрасываем дробную часть остатка целочисленного деления, мда..

cellsChain = function( cell_1, cell_2 ) {
	
  return Math.abs( cell_1 - cell_2 ) == 1 || Math.abs( cell_1 - cell_2 ) == 10

}

Я что-то не улавливаю смысла вторых условий.

special-k ★★★★
()
Ответ на: комментарий от Deleted

Просто как бы хотел узнать может есть способ сказать интерпретатору что переменная - это целое число типа как int в С++.

mio ★★
() автор топика
Ответ на: комментарий от special-k

Просто клетки с индексами 9 и 10 например находятся в разных рядах ( 9 - в первом, 10 - в начале второго ), смысл в этом.

mio ★★
() автор топика

в современном жабаскрипте есть типизированные массивы (google typed array javascript) записывая данные в них автоматически будет отбрасываться всякие знаки после запятой(если Int или UInt массивы) и т.п., и в принципе они быстрее и меньше (очень) жрут.

wwwsevolod
()
Ответ на: комментарий от mio

Да все верно индексы от 0 до 99

Но зачем? Я бы как-то так сделал, если нужно: 1 байт на X, 1 байт на Y. Предположим, что X - в старших разрядах. Тогда:

Если верно, что cell_1 & 0xFF == cell_2 & 0xFF, то клетки на одной горизонтали (если это не одна клетка). Или, например, Math.abs(cell_1 - cell_2) == 1 (или cell_1 - cell_2 == 1 || cell_2 - cell_1 == 1) => клетки соседи по горизонтали. Или там cell_1 & 0xFF == cell_2 & 0xFF && cell_1 != cell_2...

Соответственно, cell_1 & 0xFF00 == cell_2 & 0xFF00, то клетки на одной вертикали. Или Math.abs(cell_1 - cell_2) == 0x0100 - тогда это соседи. Или еще как-то.

В любом случае, зачем целые числа от 0 до 99 округлять?

proud_anon ★★★★★
()
Последнее исправление: proud_anon (всего исправлений: 3)
Ответ на: комментарий от proud_anon

Я пришел к выводу что лучше б я работал с самого начала с объектами содержащими два координаты по х и у чем с индексами )) Битовые операции это жесть еще похуже чем у меня сейчас. Короче не в духе яваскрипта это )))

mio ★★
() автор топика
Ответ на: комментарий от mio

х и у

Абсолютно. На поле 10х10 не никакого смысла вытягивать координаты в линию.

special-k ★★★★
()

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

Логика немного странная, 2 if можно объединить в один и даже сделать что то вроде return a === b, если это будет не слишком громозко выглядеть.

http://jslint.com/ - в помощь по стилю.

Hope ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.