Комментарии 44
Я знал, я знал, что тетрис следующий:)
Это уже второй тетрис. Первый был тут — habrahabr.ru/post/138335/
а где длинная??? я ее так ждал…
Так, что там ещё осталось из потенциально 30-строчного… Жизнь, шашки, сапёр, морской бой, судоку…
Пора сделать минусатор постов «XXX на JS на 30 строк» на 30 строк JS.
split (в данном случае) это читерство.
Вообще код без 'use strict' не считается.
Скоро начнут постить код «Anything-you-want на javascript в одну+ строку»
А в титрах благодарности пакеру Дина Эдвардса
Вообще код без 'use strict' не считается.
Скоро начнут постить код «Anything-you-want на javascript в одну+ строку»
А в титрах благодарности пакеру Дина Эдвардса

Я так долго ждал линию…
Тетрамино как-то неканонично поворачиваются. Плюс зависимость скорости движения от системной настройки скорости повтора символов напрягает (та же проблема была с пинг-понгом, но там вообще играть невозможно).
Классно. Только есть замечание по работе кнопки Вниз. Если ее зажать, то после того как фигура упала следующая вылетает также быстро. Хочется либо задержки на один «ход» в момент когда фигура ложится, либо сброса действия кнопки Вниз для следующей фигуры, то есть для того чтобы она ускорилась нужно было бы отпустить кнопку и нажать на нее еще раз. Да, и фигуры у стены не все поворачиваются.
Вот такая вот штука у меня вышла.
Только в 30 строк не уложились повороты фигур :(
Только в 30 строк не уложились повороты фигур :(
<canvas id="canvas" style="background:#eeeeee" width = "200px" height="400px" ></canvas>
var map=[], pos=5, move=0, score=0, bit=0, fig=0;
var canvas = document.querySelector('#canvas'), ctx = canvas.getContext("2d");
function _$ (body, ret){ return eval("(function(a,b,c){"+(ret ? 'return ':'')+body+";})");}
_i = _$("parseInt(a)", 1);
range = _$("_$('for(var i='+a+'; i<='+b+'; ++i ) a(i); return 1')", 1);
set_color = _$("ctx.fillStyle = (['none', 'white', 'black', 'red'])[a]", 1);
draw_cell = _$("set_color(map[a]) && ctx.fillRect(a%10*20, _i(a/10)*20-20*3, 19, 19);");
can_move = _$("(b>1 || _i(a/10)==_i((a+b)/10)) && (a+b>=0) && ((a+b)<map.length) && (map[a+b]!=2)", 1);
bounced = _$('map.reduce(_$("a + ((b==3) && !can_move(c, "+a+")) ? 1 : 0", 1), 0)', 1);
cell_move = _$("can_move(a, b) && (map[a+b]=map[a]) && (map[a]=1)");
cell = _$("map[pos + a%4 + parseInt(a/4)*10] = (([1,15,46,78,142,204,198])[b] & (1<<(7-a))) ? 3 : 1");
new_fig = _$("range(0, 7)(_$('cell(a,'+(Math.floor(Math.random()*6)+1)+')'))", 1);
(rng0_229 = range(0, 229))(_$("map[a] = 1"));
new_fig();
document.body.onkeydown = function(e) {
(move = ([-1, 0, 1, 10])[e.keyCode-37]) && !bounced(move)
&& rng0_229 (_$("b = move<0 ? a : 229-a; map[b]==3 && cell_move(b, move)"));
};
var interval = setInterval (function () {
bounced(10) >0 && rng0_229 (_$("map[a]==3 && (map[a]=2)"))
&& range(3, 22) (_$('map.slice(a*10, a*10+10).reduce(_$("a+b", 1),0)==20 && ++score\
&& range(a*10, a*10+9)(_$("map[a]=1"))\
&& rng0_229 (_$("cell_move(229-a, 10)"))'))
&& range(20, 29) (_$("(map[a]==2) && interval && !clearInterval(interval) \
&& !alert ('Game over! Score: '+score) && (interval=0) "))
&& new_fig();
rng0_229 (_$("map[229-a]==3 && a>=10 && cell_move(229-a, 10)"))
rng0_229 (_$("draw_cell(a)"))
}, 200);
Раз уж такое дело, то вот змейка вот змейка (хотя и не идеальная, но все же).
Змейка же уже была! Собственно, по моему, с нее и начался марафон мини-игр в 30 строк кода на хабре.
http://habrahabr.ru/post/202476/
http://habrahabr.ru/post/202476/
да и строк 100+ :) не считается
160
270 — потом уже просто сыпятся как ненормальные
330 ))
смог дойти до 280, потом начинается дурдом :)
Неделя исполнения 30-ти строчных желаний. Только хотел попросить змейку она уже была, не успел заикнуться про тетрис — он тоже в строю. Даже на душе хорошо стало.
А Сокобана в 30 строк недождаться… (
> Все фигурки хранятся в переменной fs=«1111:01|01|01|01*011|110:010|011|001*...» в виде строки. Чтобы получить массив фигур — делаем split('*')
Можно сэкономить на кавычках, сделав заменителем цифру:
не так 'a.b.c.d'.split('.')
а так 'a5b5c5d5'.split(5)
Можно сэкономить на кавычках, сделав заменителем цифру:
не так 'a.b.c.d'.split('.')
а так 'a5b5c5d5'.split(5)
А мы недавно сделали задачку по составлению алгоритма решения игры «Тетрис»
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Tetris на javascript (в 30+ строк)