381

スマホで遊べる710バイトのぷよぷよ

by
ranea
ranea
おはこんばんちは。
ふとYouTubeを見ていたら、8行のコードでぷよぷよが遊べるというのを知り、どんな内容かなのか気になって見てみた。


https://youtu.be/mYQMxJVY-G8?si=ZbwO5WAPdCwDRTbk


なるほど、テトリスが短いコードで遊べるのは知っていたが、ぷよぷよもこのように短いコードでちゃんと遊べてて面白い。



というわけで、同様になるべく短いコードで、スマホのブラウザアプリで読み込ませるだけで文字化けせず遊べるようにしてみた。



大体こんな感じの画面。スマホ対応した分だけコードが長くなったが、710バイトでできた。1KB未満でできてよかった。
全角を使うと文字化けするし容量が大きいので半角文字。
空白が=ではなく_のが見やすいかもしれないが、可変幅フォントから等幅フォントにしようとすると容量が増えるので、可変幅のままズレない文字を採用した結果こうなった。
0179なのは色々試してこれが個人的に見やすい方だったから。
変えたい人は後述のコードの0179の部分を変えてください。

$が壁、=が空白マス、0179がぷよ。
下の数字がスコア。一応、連鎖数が大きい程増えやすいです。
上まで積んだらゲームオーバーなので、再度遊ぶ場合はリロードしてください。


以下のコードを(任意の名前).htmlで保存して、Chromeアプリとかでローカルで読み込ませれば遊べます。


<body id=D style=font-size:6em ontouchstart="K=(T=event.touches[0].clientX/innerWidth)<.33?-1:T>.66?1:-6,event.preventDefault()"><script>function G(x){Z[x]==c&&(Z[x]=q?
(P+=k++,0):-c,G(x+1),G(x+8),G(x-1),G(x-8),v++)}function Y(){i=I=96;if(e=++e%4)
for(K?K+6?Z[a=h+K]|Z[a+B]?0:h=a:Z[h+(E=B%8?B*8:-B/8)]?0:B=E:0;K=k=i--;X[h]=2+t%
4|0,X[h+B]=2+t/4|0,f=Z[8+h]+Z[8+h+B])X[i]=Z[i];else if(h+=8,r||f){r?r=0:X=[Z=X]
for(Z[-5]=0;i--;B=8)Z[j=i-8]*!Z[i]&&(Z[i]=Z[j],Z[r=j]=0);if(!r)for(t=Math.
random(h=3)*16;I--;q=v=0)if(c=Z[I],c>1)G(I),c=-c,r+=q=v>3,G(I);e=r?3:0}for(i=S=
"";i<96;S+=i%8?"=$0179".charAt(c):"$<br>")c=X[i]|(Z[i]|=++i%8<2|i>88);
D.innerHTML=S+P;Z[3]*!r||setTimeout(Y,150)}e=3;Y(f=X=Z=[r=h=K=P=0])</script>


・操作方法
画面左側1/3をタップ:左に移動
画面右側1/3をタップ:右に移動
画面中央1/3をタップ:回転
※上が軸ぷよ、下が子ぷよです。回転タップ1回で軸ぷよの左に子ぷよが来ます。
回転タップする度に軸ぷよに対して、
下(初期位置)→左→上→右→下→……
となります。



削ろうと思えばもっと削れるんですが、
style=font-size:6em
これがないと、


小さすぎて遊びづらいです。
私は6emが遊びやすいと思いましたが、自分のスマホの画面に合わないという方はここの数字を変えてみてください。

また、
,event.preventDefault()
これがないと、画面が固定されず、早いタップで拡大したり画面が動いたりして物凄くやり辛かったです。

……というわけでまだ容量を削減できなくはないが、遊びやすさを維持するならこの辺が落としどころかな、という感じです。


もし落下速度が速すぎて(遅すぎて)合わない方がいましたら、
setTimeout(Y,150)
ここの150を変えてください。大きくすれば落下速度が遅くなります。
更新日時:2026/02/03 03:35
(作成日時:2026/02/02 12:35)
コメント( 2 )
THEモアイ
THEモアイ
2月3日 3時23分

コード、多分先頭の<がコピペ漏れして抜けてしまっているかと思います。
あとTを3倍して.33と.66を1と2にすれば2byte縮まりそうに見えますが、ちゃんと読めてないしスマホ環境なんも分からんので副作用あるかもです

ranea
ranea
2月3日 3時45分

ご指摘ありがとうございます💦記事を修正いたしました。
<が抜けているという初歩的なミス……😂

ontouchstart="K=(T=3*event.touches[0].clientX/innerWidth)<1?-1:T>2?1:-6,event.preventDefault()"
こちらで試したところ2B削減した状態で正常に動きました!ありがとうございます!

他の削減案としては、スマホ操作向けに3種類の操作に絞ったことで、回転をk=-6ではなく元々ソフトドロップ用で割り当てられていたと思われるk=2にしてk+6の部分をk-4にすれば1byte削減できるかも……と思いつつまだ試せてません💦

THEモアイ
コメントするにはログインが必要です
シェア