Comments 51
А зачем вы используйте
var context = canvas.getContext(«2d»);
в двух функциях anim и init?
var context = canvas.getContext(«2d»);
в двух функциях anim и init?
Зачем перерисовывать поле каждые 20 (в вашем случае) мс? Не лучше ли было бы перерисовывать при непосредственно перемещении плитки? Зачем функции, которая передается в setDraw, параметры-координаты? Или я неверно понял логику?
Поле вообще не надо перерисовывать) Надо зарисовать старую пятнашку и нарисовать новую ;)
Это-то в идеале) Код вообще, что называется, оставил ряд вопросов после себя.
Ряд вопросов? )) Задавайте. Пытался писать как можно проще. Поле неоправданно перерисовываю каждый раз признаю, но это скорей издержка того что задумывались пятнашки более продвинутыми и в них перерисовка была просто необходима. Но в итоге было решено всё упростить и оставить так как описано в посте.
Спасибо! Вспомнил детство :)
А мне вот как-то в детстве не хватало толи терпения, толи мозгов чтобы их собрать (у меня даже была идея что из некоторых позиций это невозможно). Но на пятнашках автора залип и собрал).
Да, такие позиции есть. В итоге, насколько я помню, можно собрать один из двух вариантов:




Нет не собираемых позиций.
Хотя нет, ошибся я, одна всё же есть, указанная на первой картинке: «Можно показать, что ровно половину из всех возможных 1 307 674 368 000 (=15!) начальных положений пятнашек невозможно привести к собранному виду»
Собрал махом.
А с пятнашками из комплекта Portal 2 несколько дней мучаюсь ;)
А с пятнашками из комплекта Portal 2 несколько дней мучаюсь ;)
Спасибо, вспомнил цитату с башорга:
Удивительное это дело — прогресс. Чтобы набрать и распечатать одну
страничку красиво оформленного текста мне уже не хватает мощности
компьютера, который с легкостью может управлять двумя тысячами советских
боевых спутников одновременно.
Я к тому, что страница загружает одно ядро на 100%. И это всего лишь пятнашки.
Удивительное это дело — прогресс. Чтобы набрать и распечатать одну
страничку красиво оформленного текста мне уже не хватает мощности
компьютера, который с легкостью может управлять двумя тысячами советских
боевых спутников одновременно.
Я к тому, что страница загружает одно ядро на 100%. И это всего лишь пятнашки.
Ну, код для обучения сгодиться. То же самое при помощи LibCanvas.Engines.Tiles можно сделать на Canvas с меньшим кодом и с близкой к нулевой загрузкой проца)
А зачем вообще канву использовать? Даёшь пятнашки на дивах!
А добавьте таблицу рекордов вида:
md5(начальная позиция), время*клики ник.
md5(начальная позиция), время*клики ник.
Не хватает возможности перетаскивать несколько пятнашек на одной линии, приходится порой делать целых три клика вместо одного :)
Какие NP-полные задачи решают эти пятнашки? Они грузят двух-ядерный процессор на 50%.
На фотке с айФоном лампу надо было ставить под сильным углом, тогда тени стали бы такими, что цифры можно было бы прочитать)
Делать было нечего, сделал простелькие пятнашки на дивах :)
Ох, завидую я вам, вам делать было нечего…
Вижу, ищете стиль и стараетесь делать по уму. Впринципе, неплохо, но кое-где перепроектировали, а кое-где — недопроектировали ;)
Хотя, такие вещи лучше вынести в CSS.
Вместо
Идея с флагом — не очень, проверяете одно и то же:
regisrty => registry
.var div = $("<div dir='{blockId:"+index+"}'/>");
// Лучше через второе свойство добавлять аттрибуты
var div = $("<div />", { dir: dir='{blockId:'+index+'}'});
$.each(regisrty.getOption('block').css, function(property, value) {
div.css(property, value);
}.bind(this));
// =>
div.css(regisrty.getOption('block').css);
div.css('float', 'left');
div.css('border', '1px solid #000');
div.css('width', regisrty.blockSize - 2);
div.css('height', regisrty.blockSize - 2);
// =>
div.css({
float : 'left',
border: '1px solid #000',
width : registry.blockSize - 2,
height: registry.blockSize - 2
})
Хотя, такие вещи лучше вынести в CSS.
if (0 == index) {
// =>
if (!index)
$(div).click(function() {
this.processEvent(div);
}.bind(this));
// =>
$(div).click(this.processEvent.bind(this, div));
this.processEvent
так и проситься рефакторинга. Проглядывается копипаст шаблон:if (typeof stack[column][value] != 'undefined' && stack[column][value] == 0) {
stack[column][value] = stack[column][row];
stack[row] = 0;
}
Вместо
typeof stack[column][row+1] != 'undefined'
лучше пишите stack[column][row+1] != null
. В вашем случае суть та же, а захламление кода меньше. Тем более реальная проверка на 'undefined' практически никогда не нужна.this.init = function() {
$.each(this.options.css, function(property, value) {
$('#' + this.options.id).css(property, value);
}.bind(this));
this.paint();
}
// =>
this.init = function() {
$('#' + this.options.id).css(this.options.css);
this.paint();
}
Идея с флагом — не очень, проверяете одно и то же:
var finish = false;
while (!finish) {
r = Math.round(Math.random() * 15);
if ( !localStack[r] && 0 != localStack[r] ) {
localStack[r] = r;
finish = true;
}
}
// =>
while (true) {
r = Math.round(Math.random() * 15);
if ( !localStack[r] ) {
localStack[r] = r;
break;
}
}
getDiv()
— плохое название. А если пятнашка станет spanом? getCell/getItem/getElement, что-то типа такого.И да, bind — штука прикольная, но лучше добавить обратную совместимость, ибо даже в третьем фоксе пятнашки уже не работают.
Ваша версия не решается в 50% случаев — habrahabr.ru/blogs/html5/118356/#comment_3859537
Мне вот сходу достался нерешаемый вариант (
Мне вот сходу достался нерешаемый вариант (
Неправильно генерится поле… не всегда можно собрать.
Тоже было нечего делать, а с canvas никогда не работал — решил попробовать игру сделать какую-нибудь…
В итоге решил сделать «Swell Foop» — так она в убунте называлась, вроде бы. Посидел вечерок, сделал.
Код написан неоптимально, допиливать лень, да и нет времени. Проект на git: https://github.com/Shut/swellfoo.
Хостинга нет, так что выложить посмотреть негде, к сожалению.
В итоге решил сделать «Swell Foop» — так она в убунте называлась, вроде бы. Посидел вечерок, сделал.
Код написан неоптимально, допиливать лень, да и нет времени. Проект на git: https://github.com/Shut/swellfoo.
Хостинга нет, так что выложить посмотреть негде, к сожалению.
Спасибо, не знал (первый проект на git, никогда не пользовался до этого, позор мне :) ).
Доступно теперь по http://shut.github.com/swellfoop/.
Таблицы рейтингов отключить пришлось.
Да и тестровал только в FF, Chrome и Opera — IE в топку.
Доступно теперь по http://shut.github.com/swellfoop/.
Таблицы рейтингов отключить пришлось.
Да и тестровал только в FF, Chrome и Opera — IE в топку.
Очень классно. Порадовала высокая производительность и внешний вид.
Код грязноват.
Т.к. в IE не работает и врядли заработает могу посоветовать убрать функцию
Одна из серьезный проблем — у вас используются то табы, то пробелы. Рекомендую выбрать что-то одно.
Вы, практически, переписали половину AtomJS. Если не знаете, это миниатюрная js-либа, смесь JQuery и MooTools, который не тянет совместимость со старыми браузерами. У вас написано пол этой либы)))
А также atom.ajax, atom.Class, atom.Class.Options.
Ну и, как я говорил выше, такая штука очень круто делается на LibCanvas.Engines.Tiles
Код грязноват.
Т.к. в IE не работает и врядли заработает могу посоветовать убрать функцию
addEvent
— у всех целевых браузеров есть addEventListener
. Аналогично с XHR и ActiveXObject.Одна из серьезный проблем — у вас используются то табы, то пробелы. Рекомендую выбрать что-то одно.
Вы, практически, переписали половину AtomJS. Если не знаете, это миниатюрная js-либа, смесь JQuery и MooTools, который не тянет совместимость со старыми браузерами. У вас написано пол этой либы)))
function randomNumber(m, n) {
return Math.floor( Math.random() * (n - m + 1) ) + m;
}
randomNumber(min, max)
// =>
Number.random(min, max)
document.getElementById('newGame')
// =>
atom.dom("#newGame")
Game.prototype._getNickname = function() {
var cookie = ' ' + document.cookie;
var search = ' nickname=';
var nickname = null;
var offset = 0;
var end = 0;
if (cookie.length > 0) {
offset = cookie.indexOf(search);
if (offset != -1) {
offset += search.length;
end = cookie.indexOf(";", offset)
if (end == -1) {
end = cookie.length;
}
nickname = cookie.substring(offset, end);
}
}
return (nickname);
}
// =>
Game.prototype._getNickname = function() {
return atom.cookie.get('nickname');
}
А также atom.ajax, atom.Class, atom.Class.Options.
Ну и, как я говорил выше, такая штука очень круто делается на LibCanvas.Engines.Tiles
1) Да, насчет кода знаю — можно выкинуть/переписать, но руки никак не дохоодят… Хотел даже топик написать, но куда там, если на гитхаб уже месяц не мог выложить — а все лень.
2)Некоторые части (запись в куки, навешивание событий) — просто скопипастены из других проектов, а там поддерживается ИЕ (т.к. тот же jQuery не используется на работе, куча уже ставших классическими функций, вроде навешивания обработчика событий, ajax).
3) Про atom.js читал (вроде Ваше творение, да?), но вот использовать не приходилось, к сожалению… Будет время — поразбираюсь, прикручу :)
4) Да, про табы в курсе. Просто начал делать на работе (а там для отступов принято использовать пробелы), дома же у меня табы (да и везде в своих проектах их использую). А ширина отступа везде 4 пробела, то не заметил даже.
2)Некоторые части (запись в куки, навешивание событий) — просто скопипастены из других проектов, а там поддерживается ИЕ (т.к. тот же jQuery не используется на работе, куча уже ставших классическими функций, вроде навешивания обработчика событий, ajax).
3) Про atom.js читал (вроде Ваше творение, да?), но вот использовать не приходилось, к сожалению… Будет время — поразбираюсь, прикручу :)
4) Да, про табы в курсе. Просто начал делать на работе (а там для отступов принято использовать пробелы), дома же у меня табы (да и везде в своих проектах их использую). А ширина отступа везде 4 пробела, то не заметил даже.
я набрал 3220 очков: о)
Разобрал пример с пятнашек и решил повторить ваш подвиг :)
У меня немного меньше кода вышло stfalcon.github.com/swell-foop/, но не реализован подсчет очков и подсветка секторов.
У меня немного меньше кода вышло stfalcon.github.com/swell-foop/, но не реализован подсчет очков и подсветка секторов.
к сожалению, в Вашей игре(прототипе) есть маленький недостаток, делающий игру неиграбельной — отслеживается событие onmouseclick (а не omousedown). Поэтому при отпускании кнопки мыши (если она передвинулась хоть на пиксель) — события не происходит…
Sign up to leave a comment.
Canvas: пятнадцать минут на пятнашки