)

NomoLog

Log of my life and program

週末を2048に費やした結果...

Posted in JavaScript Tagged as

おらあああああ!!見ろやああああ!!!!

2048

わけわからないと思うので説明します。

2048とは?

鬼シンプルで中毒性の高いゲーム。 ルールを説明するのが面倒臭いので詳細はこちらをご参照くだせえ。

ちなみにこのゲームはオープンソースで公開されていて、だれでも自由に改変してオリジナルの2048を創ることができるのだ。

これまでの経緯

上でも書いたとおり2048は中毒度MAXなとっても面白いゲームである。僕も例にもれず2ヶ月くらい前に知ってからすきま時間を見つけてはポチポチ遊んでいた。

さて、この週末僕は風邪を引いてしまってダウンしていた。熱は引いてきているもののまだゲリピー状態である。 そんな状態であるから特にやることもないため、布団の中で一人2048に勤しんでいたのである。 必死こいてハイスコアを目指すがなかなか取ることができない。大体4096のパネルを作って頭打ちである。 しかもこのゲームは作業ゲーかつ運ゲーである。かなりいい感じに進めていてもタイルの出現場所が悪いとそこで積むし、 ゲームオーバーしたらまた何度も作った4096タイルを長時間かけて作りなおす作業の繰り返しである。 途中経過を保存しておけたらこんな無駄な苦労しなくて済むのになあ…イライラしながらそんなことを考えていたら、悪魔が僕に囁いた。

僕悪魔「だったらよ、付けちまおうぜセーブボタンとロードボタン」

僕天使「いやいやそんなんダメだろちゃんと同じルールの元で解かなきゃ」

僕悪魔「いいんだよ何も結果をでっち上げるわけじゃないお前が進めたとこまでを保存するだけさ」

僕天使「しかしそんなことしたらゲームがつまらなk

僕悪魔「黙れ下痢便野郎」

僕は悪魔と暗黒魔術の契約をした。

JavaScriptという名の暗黒魔術

そんなわけで早速取り掛かった。全部作るのは面倒臭いので既存のwebサービスの2048にJavaScriptで処理を加えてわっしょいする作戦で行くことにした。 web版2048は全てフロント側で処理が完結しているため行けそうだった。当初はブックマークレットとして実装しようとしたが文字数制限があるしjQueryとかも使いたかったので(どちらもブックマークレットで解決可能ではあるが)やり慣れてるChromeExtensionとして実装することにした。 まずはセーブ機能から取り掛かった。こっちはすぐにできた。HTMLからタイルの場所や数字、スコアはすぐにとれた。問題はロードである。

web版2048ではGameManagerというクラスのインスタンスを立ててそこで全てのデータを管理しているのだが、そのインスタンスに外からだとアクセスできないのである! なぜもっと早くこのことに気づかなかったのか。アホである。

僕は絶望の淵へと追いやられた。せっかくコード書いたのになんてことだ。もう一から2048作るしか無いのか…?

いや諦めるのはまだ早い。多少強引ではあるが手は残っている。

DeveloperToolsで2048のJavaScriptの適当(GameManager.prototype.move()の冒頭らへんがよさげ)な箇所にブレークを貼り、止まったらコンソールからGameManagerのインスタンスを直接いじる

これだ!これこそがこの状況において残された最善手である! もちろんインスタンスをちまちま手でいじっていては日が暮れてしまうのでその部分はコードにまとめた。こんな感じ。

1
2
3
4
self.grid.cells=[];
self.grid.build();
self.grid.cells[0][0] = new Tile({'x':0,'y':0},4);
self.grid.cells[0][1] = new Tile({'x':0,'y':1},2);

(selfはGameManagerのインスタンスのこと)上の例だとグリッドに1行1列目に4, 2行1列目に2のタイルが現れる。だからこれを編集すればぶっちゃけ好きな様に好きなタイルを配置できてしまう。 しかし僕はそんなことはしない、いくら悪魔と契約したとはいえ魂まで売り渡すようなことはできない。

上で実装したセーブ機能で保存した内容をこの形式で出力してやればめでたくロードができるようになったので僕はこの途中経過保存機能を用いて2048を楽しむことにした。その結果…

最強の果てに待っていたもの

うぉぉぉおおおおお!!!

2048

これである。まあぶっちゃけやればやるほど上がっていく。もう超楽しい。ドーピング状態。向かう所敵なし。唯我独尊。

この時僕は完全に調子に乗っていた。そして僕は, ここでも悪魔の囁きに耳を傾けてしまった。

僕悪魔「そういえば世界記録ってどれくらいなのかな?」

確かにそうだ、ていうか今の俺なら世界記録とか全然目じゃない、ぶっ倒して俺がギネスに載ってやる!

(チートしておいて何を言っているんだという感じだが、当時の僕はあくまでルールは守った上でゲームをしているつもりだった。このゲームの運要素による不幸を排除しているだけのつもりだった)

僕「よーしぐぐってみよう!’2048 世界記録’…っと。ん?何だこのページは?」

2048の得点計算方法と理論上の最高得点

上記サイトから引用

2048

台無しである。なんなのだろうか?それまで僕を包んでいた全能感は一気に消え去り、僕はぐったりとうなだれた。 理論上の最高得点を示してくれたことは嬉しい、それはそれで有益な情報だった。しかしなんということだろう。2048がオープンソースなのをいいことに最高得点が出るようチューニングした2048をこの人は作ってしまったのである。この画像を見せられたら、誰だってチートだと思うだろう。誰も自力で解いたなんて思わない。でも、それは自分にも言えることだった。僕が冒頭でひけらかした画像も、所詮はチートなのである。いや、もはやチートかどうかなど関係ない。2048がオープンソースでいくらでも自分でチューニングできる以上、いかに画像が本物だと主張してもチートである可能性は排除できないのだ。

それを悟ってしまった瞬間、このゲームはただの自己満足だったのだと気づいてしまった。そして僕は、そっとブラウザを閉じた…

出会い、そして別れ

子供の頃、なぜミュウツーを公式のバトルで使えないのか、なぜサンダーボルトが禁止カードなのか納得できなかった。だって両プレイヤーがそれらを使えればそれは不公平ではないのだから。

僕は強いモンスターや珍しいモンスターが好きだった。だからそれらのモンスターを対戦で使えないのは不満だった。

プロアクションリプレイを使って緑のミュウツーや青いミュウを作ったりした。最高にカッコ良かった。レベル5のミュウやミュウツーを大切に育てた。パラメータのドーピングはしなかった。だってそんなことしたらポケモンがつまらなくなっちゃうから。

思えば今回の2048にも通ずる箇所があったように思う。僕は僕なりの正義を持ってチートしたのだ。決して2048の楽しみを損なうような真似はしていない。

しかしそんなことは、全くチートをしていない人たちからすれば関係ないんだね。勝負は同じ土俵で戦うからみんな熱中するんだ。チートなんてドーピングと一緒だ。最強になった後の数瞬は気分がいいけど、その後はろくなもんじゃない。

今回そのことが学べて本当に良かった。子供の頃と同じ過ちを再び繰り返すところだった。戒めとして、本日をもって2048は卒業するよ、この二度と破れないであろうハイスコアを思い出に…

まとめ

今月からはバージョンアップしたマリオカートをやるぞ!!新しいキャラとコースが増えてるので楽しみ!うひょ〜\(^o^)/

Comments