猫が箱を並べるゲーム(第一回3時間耐久プログラミングコンテスト優勝作品) 製作者 MASA ジャンル パズルゲーム テーマ 猫、立方体 ルール・操作方法 上下カーソルキーで猫を上下に動かして、Zキーを押すと猫がいる行のブロックを右にひとつ押し出します。このとき、右端のブロックは消滅して左端には新しいブロックがランダムで供給されます。そして、その後ブロックの消去判定が実行されます。 ブロックの消去条件は、縦の列に4つ以上同じ色のブロックが並んだとき、その並んでいるブロックを消去します。ブロックが消去されている間の1秒間はブロックを操作することができません。また、押した部分とは関係のない列のブロックも一緒に消去されます。つまり、ブロックを押したときに消去条件を満たしているブロックは全て消去されます。ブロックがひとつ消去されるごとに1点が入ります。 ブロックを消去した後の隙間は自動では埋まらないので、Xキーを押して再充填を行う必要があります。再充填するときには、上からランダムな色のブロックが降ってきます。再充填を行うと、ブロックが一段落下するのに1秒かかり、全てのブロックが落下しきりフィールド内に隙間が完全になくなるまでブロックの操作はできません。 更新履歴 2008年12月22日12時30分 テーマが与えられて、製作開始 15時30分 完成 21時ごろ このドキュメント作成 お約束 D言語1.038で作られています SDL(Simple Media Layer),SDL_image,SDL_ttf,SDL_mixer,SDL_gfx,OpenGLを使っています。 フォントにVLゴシックを使っています。 落書き テーマに”猫、立方体”と与えられて、「猫のほうは別にゲーム内容を考えた後にいくらでも組み込めるから立方体を何とかしよう」と考え、とりあえず立方体の絵を描き始める。それで、色を決めるときに「RGB三色作るか」と思って三色作成。それで、JOIの連鎖の問題を思い出して「箱を積み上げる落ちものパズルにしよう。猫は箱を落とす役、猫車でいいや」と思ってコードを書き始める。 それで、コードを書いていて箱のクラスと枠のクラスを作成しているときに「箱をスムーズに落として積み重ねる処理なんて三時間で間に合わない」と思って、現在の枠が初めから全部箱で埋まっているスタイルに変更。 次に、プログラムのメインになると思ったブロックの消去判定の作成をJOI予選で書いたコードを思い出しながら作成開始。書き始めたときは縦、横、斜めのどれかで4つそろえたら消すという方針を考えていたが、書いていて「横の判定は配列の都合で面倒、斜めなんてもってのほか」と思ったので縦の判定だけにした。 その消去処理のデバッグ中、Zを押すと消去条件を満たしている場所のブロックが見えなくなるようにするという機能を作り、Before-Afterを見比べるためにXキーで見えないブロックを見えるように戻すという形でデバッグを進めた。それで、Zキーで消した後の隙間の部分が絵としてきれいだったのでそれを勝手に埋めないという方針にして、「縦に押さないのなら横にスライドさせよう」と思って横にブロックを押すというスタイルが誕生。このあたりで一旦立ち止まり、どういうゲームにするかを考えるために猫の絵を描いて落ち着かせた。ブロックでRGBを使っていたので黒猫。黒猫ということでまた猫車のことを考えたが描いている時間がなさそうだったのと、すでに書いた猫の顔が右端にあったのでこれ以上右に猫車は描けないという理由で諦めた。 猫の絵が書き終わった後は猫をカーソルとして使うことと、横に押すシステムの作成の開始。押したブロックが右端と左端でループすると考えてみたが特に理由もなく没にした。 そして、ブロックの隙間を埋めるために上からブロックを降らせるシステムの作成。これ自体は大きな滞りなく進んだが、アニメーションもなしにいきなりブロックが埋まると本当にちゃんとブロックが落下しているのかどうかわからなくて不安になり、落下アニメーションの作成を決意。また、ブロックが突然消えるのも気持ちが悪かったのでこれもアニメーションさせることにした。 ブロックを消すほうはアルファ値を下げてだんだん薄れさせていくという形で、すぐに完成。消している間にブロックを押されるのは気持ちが悪かったので消えるアニメーション中はブロックを押すのを禁止しておいた。 次にブロックを落下させるアニメーション。すぐにできると思ったがなぜかうまく行かず、いろいろいじっても埒が明かなかったのでクールダウンのために制限時間や得点、タイトル画面を作成。これで消えるアニメーションの操作不可能時間と制限時間を絡ませて何かのバランスになると思いつく。 そのあたりを実装し終えた後落下アニメーションに再挑戦。犯人が型のキャストではないかとうすうす予感していたのだが、そこを叩こうとするとコンパイルエラーがでたので暫く置いておいたが、いよいよそこ以外に犯人がいないということになって、キャスト文を書く場所を変えたら見事に通った。 その後は落下中の操作不能をつけることで何かのゲームバランスになると思ったので実装。 最後に10分強余ったのでハイスコア機能を作って、テストプレイで何故か100点をたたき出したところで時間終了。