ぷよぷよ作った

jgforceのタスク考えてて、そろそろ落ち物ゲームが欲しいなぁと。
さっと作れるのはテトリスぷよぷよなんだけど、テクニックが必要なのでリプレーが面白いという意味ではぷよぷよ


ということで一週間くらいでぷよぷよのcocos2d-html5版を作ろうかなぁと思ったんだけど、よく考えたら今週母親が来越する関係で一週間も時間とれなかったので、ぷよぷよのjgame.js版に切り替えて三日で作った。
こちら。
http://jgforce.com/play/57


プレーするのが面倒ならリプレー見てもらってもよし。
http://jgforce.com/play/57/tsugehara/753
一応「とことんぷよぷよ」と「ひとりでぷよぷよ」っぽいの二つに対応していて、リプレーの右はAI。


こんな感じ。画面がしょぼいのは仕様です。

ソースコードなど

ソースは公開されてるんで、jgforceにログイン後、http://jgforce.com/editgame/57/1 で見れる。
JavaScriptにして1200行くらい。TypeScriptの方はコメントとか含めて1500行くらい。


そんなにひどい作りはしてないつもり。一部jgame.jsが不完全なところを補うためのコードはある*1けど、十分ぷよぷよ作りの参考にはなると思う。
あくまで目的がjgforceの宣伝なのでライセンスはJG BY-SA(jgforceの中だけで使えるCC BY-SAみたいなやつ)。


ただ要望あれば普通にCC BYとかMITとかでも提供するんで適当に連絡してください。
調べてないけどSEGA辺りがライセンスちゃんと管理してるだろうから、商用目的でぷよぷよ使うの無理なんじゃないかとは思うけど。

AIについて

今回作ったAIはとてもAIと呼べる代物じゃなくて、とりあえず少ない列に回転させずにブロックを突っ込むというもの。
ただ作ってからの挙動見ると、ぷよぷよ通のAIってこのレベルだったんじゃねーかって気がしてきたw普通にぷよぷよ通のAIとやりあったらいい勝負しそう。はーピーと蛙くらいしかまともなAIが無い気がするし。


まともなAI組む時間がなかったのと、まともなAI組むと多分AIの思考コストが結構高くなって動作速度が心配だったのでちゃんと作ってないけど、ぷよ通レベルのAIだったら結構量産するの難しくない気がする。
ただ次ブロックや連鎖計算、まして相手側の状況なんか見るようにすると、処理する情報量が多くなりすぎてマシンスペックを大分要求すると思うんで、JavaScriptでどのレベルまでAI書けるかってのは難しいとこだなと。


誰か気が向いたらforkして俺々AI作ってみてください。
階段による4連鎖発火の効率を徹底的に追及したAI、辺りでも、十分初心者の練習台にはなると思う。

ぷよぷよ作ってて思ったこと

作ってて意外だなと思ったことが一個あって、ぷよぷよの肝は「操作感」なんだなと気付いた。
今回この気持ちいい操作感を追求する時間*2が全然読めてなかった。


ぷよぷよの基本システムはまあ1日2日で組めんだろと思ってて、その予想は当たってたんだけど、ほんとは操作感をああでもないこうでもないって調整する時間をもっとかけた方がいいんだと思う。


アクションパズル全般に言えることだと思うんだけど、どれだけ気持ちよく操作出来るかってのが多分すごく重要。
ぷよぷよ、特にぷよぷよ通はその仕上げが素晴らしかったんだなぁと。
当時の開発スタッフに敬礼したい気分ですわ。

作ってて気付いたjgforceへのフィードバック

このぷよぷよはjgforceで全部開発した。
単純にVisual Studioが重い俺にとって、現存するTypeScript開発環境ではjgforceがベストだったんで。
ステマっつーか普通に宣伝です。TypeScript開発者の人使ってね!飽きたらZIPで落としてローカルに移せばいいから!頼むよ!登録ユーザ10人とか、いくらなんでも開発者が可哀想だと思いませんか!?


はぁはぁ。
で、それはそれとして、jgforceで開発してたのでjgforceへのフィードバックがちょくちょく出たのでメモ。
jgame.jsへのフィードバックはBTSがあるのでそっち使ってるけど、jgforceへのフィードバックはBTSが無いので適当にここに書いておく。
codebreak;頑張ってくれんかのー。gitがあってBTSが無いとか残念すぎる。

  1. jgame.jsの問題かもだけどフルスクリーン表示がバグってる
  2. ファイルをソートしてもちゃんと保存されない
  3. typescriptServices.jsが時々バグるのでクリーンビルド必須
  4. 保存もプレビューも出来ないことがあって、何かと思ったらログインセッションが切れてた。ログインセッションの管理をもうちょいちゃんとする
  5. 乱数シードを複数保存したい。したいというか必須。ぷよぷよでいうと、ゲーム展開が違うとブロックの出現順序などが同じにならない、AIの思考が異なるなどの問題が出る
  6. リプレーはぷよぷよでも結構長くなるため等速で見るのがだるくなる。再生速度指定をサポートしたい


多分全部来週片づける。
うち乱数シードを複数保存したい問題が結構でかいんだけど、これはユーザ定義の入力イベントを保存する仕組みを作ることで対応しようと思う。
ユーザ定義データ保存出来るようにすれば、理論的にはオンラインゲームだろうとKinectからの入力信号だろうと対応できるようにはなるはずなので、まあついでにやっちゃうべって事で。




いやぁ、しかし久々のゲーム開発は楽しかった。
時間見つけてまたなんか作ろう。今度こそ俺企画のゲームを作ろう。

*1:PuyoWindowWrapperとBorderLabel

*2:正確には本家ぷよ通に操作感を合わせる時間