限られたサイズでゲームを作る
ゲームジャムでは、ゲームのバイナリやソースコードのサイズに制約を加えることも多い。13 キロバイト以内のブラウザ用ゲームを作る js13kGames 1 などが有名である。ゲームジャムではないが、古くマイコンの時代には、1 画面に収まるソースコードでゲームを作る 2 という投稿プログラムもあった。
様々なプログラミング言語で、短いコードを使って多彩な表現を行うための試みは、ゲームに限らず多くの分野で行われている。ggplot2 3 を用いて 280 文字以内で美しい幾何学模様を作る試み 4 や、SuperCollider 5 で 140 文字以内で作られた楽曲群 6、JavaScript の 140 文字以内で作られたジェネレーティブアートを集めたサイト Dwitter 7 もある。
短いコードで作られた作品は情報がギュッと詰まった感じが美しい。最低限の構成要素で最大限の効果を得る工夫が詰め込まれている。
Dwitter ではグラフィックスや音楽だけでなく、ゲームも投稿されている。例えば Crossy tortoise 8 という道路を横断するカメを操作するゲームは、ワンボタンゲームを 140 字で実現している。ただしスコアは無く、一度渡りきったらそこで終わりという簡潔な作りだ。
ゲームを名乗るからには、以下の要素は入れたい。
- スコアがある。
- ゲームオーバーがある。
- 難度が上昇する。
- できれば音も鳴る。
上記要素を入れたい場合、短いコード向けの妥当なレギュレーションはどうなるかを考えてみよう。
JavaScript256 文字以内で毎フレームのアップデート用関数を書く。
ゲーム向けに便利な関数を使えるようにするため、p5.js 9、Tone.js 10、lodash.range 11をライブラリとして導入する。
p5.mouseIsPressed (M), p5.mouseX (X), p5.mouseY (Y), p5.random() (R), Tone.synth.triggerAttackRelease() (N), _.range() (A)に 1 文字のエイリアスを与えて、短い文字数での関数呼び出しを許す。
変数 S はスコアを示し、画面上部に表示される。変数 T はゲーム開始からの経過フレーム数を示しており、難度調整などに利用する。
このレギュレーションに沿ったサンプルゲームをいくつか作ってみた 12(画像クリックでプレイ)。
サンプルゲームの一つである、クリックで車がジャンプするゲーム springcar のコードは以下になる。
clear(),
T || ((s = A(9).map((i) => [10 * i])), (y = v = 0)),
(d = 1 + T / 999),
s.map((u) => text("🔩", (u[0] = u[0] < 99 ? u[0] + d : -R(30)), 80)),
(y += v += (M ? 0.1 : 0.2) * d),
get(74, y)[3] + get(82, y)[3] > 0 && ((v = -1), (y = 72), S++, N(333, 0.1)),
y > 70 && v < 1 && M && ((v = -3), N(444, 0.2)),
y > 95 && ((S = y = T = 0), N(222, 0.5)),
text("🚗", 75, y);
これくらいのレギュレーションであればゲームを作成することはまだ容易である。もっと厳しいレギュレーションだと、一切の余計なライブラリを許さず JavaScript を含む HTML 全体のバイト数 226 バイトのポン 13も存在する。codegolf JS 14を参照するとこのような優れたコードを見ることができる。
このレギュレーションならばだいたい 1 時間くらいでなんらかのゲームを作ることはできる。もちろん 256 文字の制約は厳しく、ちょっと凝った動きを実装しようとするとあっという間に文字数があふれる。270 文字くらいのゲームができたときが悲しく、小手先のテクニックでは縮めきれないのでゲームシステムの方を縮小しなければいけないことがある。しかし 256 文字制約が無いと無限に演出を付けられるしゲームバランスもいじり放題になるし、それらを諦めるための縛りなのだから、悲しくても捨てることだ。
短時間でアウトプットが得られるという点で、サイズに制約を与えたゲーム開発はなかなか面白い。限られたサイズでゲームができているということは、その中のルールやメカニクスもかなり絞られているわけで、そのような制約の元できている面白いゲームは良質なアイデアの宝庫である。
ただ、自分で作る際のサイズ制約は、実際には単なる足かせにしかならず、早期の完成には寄与しない。なので純粋にサイズの制約を乗り越えるのが楽しい、という人にしかおススメはしない。サイズ圧縮のためのライブラリやテクニックは大量にある 15。これらを参照し、面白いと感じるかどうかで、あなたの適性を判断しよう。
1. js13kGames ↩
2. 歳末一画面プログラム祭りファイナル~千秋楽 ↩
3. ggplot2 ↩
4. Tiny Art in Less Than 280 Characters ↩
5. SuperCollider ↩
6. sc140 ↩
7. Dwitter ↩
8. Crossy tortoise ↩
9. p5.js ↩
10. Tone.js ↩
11. lodash.range ↩
12. jsgame256 ↩
13. PING - A Game in < 256 Bytes of HTML+JS ↩
14. codegolf JS ↩
15. js13kGames Resources ↩