ZAPAnet総合情報局 > [Z]ZAPAブロ〜グ2.0 > プログラミングTIPS > あの565バイトテトリスが、ついに500バイトを切った!

あの565バイトテトリスが、ついに500バイトを切った!

このエントリーをはてなブックマークに追加
2007年11月05日 カテゴリ:プログラミングTIPS
各所で話題になった「わずか565バイトテトリスのプログラミング解説」。
あの565バイトテトリスの作者がわかったとともに、さらにプログラム行数の圧縮が進められていました!

詳細は、
482バイトテトリス - Cozy Ozy
に載っています。
(リンク先は482バイトとなっていますが、手元で改行コードを2バイトで確認してみたところ493バイトでした→追記:Ozyさんからコメントを頂きました。「改行位置を工夫すれば、セミコロンが省略できるので489バイトにできますよ」だそうです)

565バイトテトリスを作ったのは、nanagyouさんという方で、Short Coding本にも名を刻んでいる超絶スーパーコーダーらしいです。

そして初期の565バイトテトリス完成から5年半以上経ち、新しく500バイトを切ったテトリスのソースコードはこちら。
<body id=D onKeyDown=K=event.keyCode-38><script>Z=X=[B=A=12];function Y(){for(C
=[q=c=i=4];f=i--*K;c-=!Z[h+(K+6?p+K:C[i]=p*A-(p/9|0)*145)])p=B[i];for(c?0:K+6?h
+=K:t?B=C:0;i=K=q--;f+=Z[A+p])k=X[p=h+B[q]]=1;h+=A;if(f|B)for(Z=X,X=[l=228],B=[
[-7,-20,6,h=17,-9,3,3][t=++t%7]-4,0,1,t-6?-A:2];l--;)for(l%A?l-=l%A*!Z[l]:(P+=
k++,c=l+=A);--c>A;)Z[c]=Z[c-A];for(S="";i<240;S+=X[i]|(X[i]=Z[i]|=++i%A<2|i>228
)?i%A?"■":"■<br>":"_");D.innerHTML=S+P;Z[5]||setTimeout(Y,i-P)}Y(h=K=t=P=0)
</script>
もう少しで400字詰めの原稿用紙1枚に収まってしまいそうです。
もちろん、このソースコードもメモ帳に貼り付けて、htmlで保存すればテトリスが動きます。
→テトリスの動作サンプルはこちら
操作方法は、SPACEキーで回転、カーソルキー(左右)で移動です。

今回の改良で、document.bodyのところは最初にIDを付け、keyCodeは最初に-38されていることがわかります。
特にテトリミノ(落下ブロックのこと)の回転に工夫がなされています。
この前紹介したソースコードと比べると、どの辺りを改良したのかがよくわかります。
<body onKeyDown=K=event.keyCode><script>X=[Z=[B=A=12]];h=e=K=t=P=0;function Y()
{C=[d=K-38];c=0;for(i=4;i--*K;K-13?c+=!Z[h+p+d]:c-=!Z[h+(C[i]=p*A-Math.round(p/
A)*145)])p=B[i];!t|c+4?c-4?0:h+=d:B=C;for(f=K=i=0;i<4;f+=Z[A+p])X[p=h+B[i++]]=1
if(e=!e){if(f|B){for(l=228;i--;)Z[h+B[i]]=k=1;for(B=[[-7,-20,6,17,-9,3,6][t=++t
%7]-4,0,1,t-6?-A:-1];l--;h=5)if(l%A)l-=l%A*!Z[l];else for(P+=k++,j=l+=A;--j>A;)
Z[j]=Z[j-A]}h+=A}for(i=S="";i<240;X[i]=Z[i]|=++i%A<2|i>228)i%A?0:S+="<br>",S+=X
[i]?"■":"_";document.body.innerHTML=S+P;Z[5]||setTimeout(Y,99-P)}Y()</script>
大元のコード解説は、
7 line programming
7行テトリスコードで分からない所があります -OKWave
7行テトリスを初心者でも理解できるよう書き直していただきたい 以下のURLの7行テトリスのプログラムを、プログラミング初心者(プログラミング言語共通の「教科書的な文.. - 人力検索はてな
辺りをチェックすれば、少しは理解できるかと思います。


前回「落下スピードが速すぎる」とある人から言われた時、最後の行の
setTimeout(Y,99-P)
の99を大きくすれば(199とかに)ゆっくりにできますよ。テトリスが得意なら1にすると速くて面白いですよ。
と答えていたのですが、このスピードの値ですら他の変数の使い回しになっているところが驚きです。
ここまで短くなってきたら、「下キーで加速」、「テトリミノに色付け」をして7行に収められたら楽しそうです。

とりあえず、カラーバージョンはnanagyouさんのページの
七行プログラミング
にソースコードと動作サンプルページが載っています。

こういう技術を見てると、Short Coding ~職人達の技法~が猛烈に欲しくなってきてしまいますね。
Short Coding ~職人達の技法~
Ozy
毎日コミュニケーションズ
2007-08-09

by [Z]ZAPAnetサーチ2.0

関連リンク

わずか565バイトテトリスのプログラミング解説
続・わずか565バイトテトリスのプログラミング解説
わずか96キロバイトの超絶FPSゲーム
わずか681バイトで動くぷよぷよ