ビスケットでつくる2048

ついに念願の2048を完成させることができました.メガネは98個です.若干本物と違う動きをしますが,このまま投稿します.

プログラムはここにあります.

まず必要な絵ですが,

空白を表す四角の他に,2から2048までのタイルが必要です.動かす方向をタッチで指示するための青い矢印4つと,実際にタイルを動かす操作を行う緑の矢印4つ.さらにボードの終わりを示すグレーの半円を用意しました(これは上と左が同じ絵,右と下が同じ絵で済ませています).


最初に並べておく絵はこのようになります.空白を16個,終わりを示す半円が各辺4個ずつ.指示用の矢印が4つです.


指示用の矢印をタッチすると,ある場所に操作用の矢印(緑)4つを生成します.この場合はちょうど

右から1列目と2列目の間にできます.それぞれの方向で,指示用の矢印が置かれる場所に近いところに指示用の矢印が置かれています.


この操作用の矢印は,矢印と反対に進みます.そして,タイルと空白が並んでいたら,その位置を入れ替えます.

また,同じ数が並んでいたら足したタイルを作ります.

動く様子をみてみましょう.


最初はこの状態で,右矢印をタッチします.

この位置に4つの操作用右矢印が生成されます.これは後ろに下がりながら,タイルを操作して行きます.

上から2行目では2を右に動かすことができます.それ以外はそのまま左に動きます.

同じように4も動かせますが,

このように右側に動かせなくなるまで引っ張っていきます.

さて,寄せるのと足すのはこんな感じで割と簡単に作れるのですが,その他に考えなければならないことが2つあります.

  1. 1回操作するたびに,空いている場所に2か4が新しく生成される.
  2. しかし,その操作で一つのタイルも動かなければ生成されない.

この2つはビスケットにとっては結構難しい問題です.まず,1回操作するたびと言ってますが,移動の操作が全て終わってからじゃないと生成できません.しかし,4つの矢印はバラバラに動いているので,動きが止まったことを判定するのは工夫が必要です.

任意の空白に2か4が生成されるというのはこのようにします.

ここでは,割れたメガネを使っています.割れたメガネはまだ不完全な仕様なので,将来のバージョンでは上位互換の機能に置き換わる予定です.赤丸は新しくタイルを1つ生成せよという命令の絵です.この絵がステージ上のどこかに一つあれば,それを削除して,空白を2か4に置き換えます.

ここで,最初の配置を見てみると


のように,赤丸が2つ置かれています.これによって,空白のどこかに2か4がランダムに置かれます.

矢印は後ろに下がってボードの終わりに来た時に消えます.


終わりの判定は,右辺と左辺とで違う絵を使いたかったですが,上・下とは一緒でもいいので,2種類の絵を使用しています.判定した後,青の矢印(タッチする矢印)の位置に小さい赤丸を1つ生成しています.赤丸を生成する場所はどこでもよいですが,ステージ上で1箇所固定された場所である必要があります.本来なら別の絵を用意してもいいのですが,ここでは絵を節約するために青の右矢印は一つしかないのでそれを使いました.

そして,

この上のメガネには,小さい赤丸が4個重なっています.これによって,4つの矢印がすべて終わりになったらを判定しています.小さい赤丸が4個重なると,大きな赤丸になるので,これは新しくタイルを生成する命令ということになります.

ところが,もう一つの問題,1つのタイルも動かなければ新しくタイルは生成されないというのがありました.これもビスケットではなかなかやっかいです.ビスケットは何かがある,というのを示すのは(割れたメガネのおかげで)楽に表現できますが,何かがないというのは簡単ではありません.この場合は「1つのタイルも動かなければ」というのですからなかなか難しいです.しかし,このルールのおかげで2048がとてもスリリングなゲームになっているので,これはなんとかしなければなりません.

そこで,使っているのが2つの星(黄色とオレンジ)です.

実は一番最初の,タッチした時のメガネの中に黄色の星も入っていました.

タッチすると,黄色の星が1つ作られます.

それからタイルが動いたり,足されたりするメガネには,
オレンジの星が生成されるようになっています.動いたらオレンジの星が1つ以上生成される.一つも動かなければオレンジの星は生成されないということです.


で,このメガネです.うえは,ステージ上の任意の場所に黄色の星とオレンジの星が1つずつあれば,両方消える,というものです.下は,オレンジの星は消えるです.ビスケットではメガネの左側に入っている絵が多いメガネを優先しますから,もし黄色があればその黄色は消えるし,あってもなくてもオレンジは消える,ということになります.

つまり,最終的に一つのタイルも動かなければオレンジの星は生まれないので,黄色の星が残ります.一つでも動けばそれによって黄色の星も消されるということになります.

そこで,さっきちらっと出した,小さな赤い丸が4つ重なると大きな赤い丸になる(のでタイルが生成される)ですが,もう一つメガネがありました.


これは,もしステージに黄色い星があったとき,小さい赤い丸が4つ重なると,大きな赤い丸は生成されずに両方とも消える,ということになっています.これで無事に一つのタイルも動かなければ,新しくタイルは生成されないという,恐怖のルールを作ることができました.

ここまでで,2048の面白さを損なわない範囲で近いゲームを作ることができました.しかし厳密さを求める人のためにもう少々.

実は,タイルが
– 4 – 2 – 2
と並んでいた時に右に寄せると,本物では2と2が繋がるだけなので
–    – 4 – 4
となりますが,このプログラムでは新しくできた4ととなりの4がもう一度反応してしまい
–    –    – 8
と2段階を一気に進んでしまいます.ちなみに逆の並び
– 2 – 2 – 4
のときは,どちらもきちんと
-   – 4 – 4
になります.

ゲームで遊んだみた感覚は,ほとんど同じなんですが1ステップだけで止めて,違う方向に寄せるというテクニックを使いたいことが2048を作るまでに2回ぐらいありました.それができない分若干難しくなっています.

これを解決するにはいくつかの方法が考えられると思いますが,たとえば,2+2で作られた4は暫定的な絵にして,もう他の4とは反応することができなくて,全てが終わった後で暫定的な4が本物の4に変わるという方法.暫定的な絵が動くというメガネと,暫定的から本物に変わるというメガネを追加しなければなりません.これは絵の種類(10種類)に比例するのでやりたくない改造です.もっとよい方法が見つかるかもしれません.

このバージョンでメガネが98個と書きました.その内訳を見てみると.

タッチすると操作用の矢印が4つ生まれる(4個)
操作用の矢印が後ろに進む(4個)
操作用の矢印がボードの端にいくと終わる(4個)

2から1024の10種類の絵に対して
寄せる(4個)
足す(4個)
で計80個 (2048のタイルはうごかない)

2か4のタイルの新規生成(2個)
動きが終了した判定(2個)
一つも動いていない判定(2個)

となりました.

さて,98個のメガネを作るにはどれだけの時間がかかるのか,ということですが,まず16まで作って色々と試してみました.そこには試行錯誤が必要で結構時間がかかりました.しかし,それ以降の単純に絵とメガネを増やす作業ですが.まずタイルの絵をざっと描いてしまって,その後各タイルにつき8つずつのメガネを作る部分ですが,単純作業の手順ができたところで,時間を測ってみました.最初の8つは2分7秒でしたが,次の8つは1分57秒と短縮できました.単純作業の手順とは,最初にメガネを8つ用意して,次に必要な空白を全部に入れて,次にタイルを入れて,足された後のタイルを入れて,最後に矢印を入れるという工程ですが.そんな感じで案外すぐに終わるのですよ.

この1年はビスケットのプログラミングテクニックが飛躍的に向上した年でもあります.プログラミング上のテクニックもずいぶんと蓄積されてきました.その分,ビスケットの仕様の不満な部分も見えてきましたので,そのあたり来年は少し改良できればと思います.

本年もお世話になりました.
みなさん,どうぞ良いお年を.

シェアする

  • このエントリーをはてなブックマークに追加

フォローする