はじめに
2018年6月10日の部内ハッカソンで「リア充(数学)爆発しろ」というゲームを作りました。右から関数が流れてくるので左から演算子を作用させて0にする、ナブラ演算子ゲームとシューティングを合わせたようなゲームです。本記事はそのハッカソンの参加記になります。
メンバー
xxkiritoxx(プログラム)
tako(プログラム)
nambatsu(雑用)
Hinaruhi(雑用)
ちなみに我々のチームの名前は「生命科学基礎」です。理由は僕が生命科学基礎第二1の単位を落としたからです。
開発経緯
最初は作るゲームのテーマが全然決まらなかったので、まずジャンルを決めようという話になりました。シューティングなら実装が軽そうだなあと思ったのでシューティングに決めました。というか僕がゴリ押しました
アイデアを生み出すには完全に自由であるよりも制約があった方がよい、というのはよく知られた話です。ジャンルを決めたことでイイ案が上がってくる、あるいは自分でイイ案が思いつくといいなあと考えておりました。
今回のハッカソンのテーマは「かえる」と「ます」です。
「ます」・・・Math・・・数学+シューティング・・・
数字を撃って四則演算させるのは?それはあまりにありきたりだなあ・・・
じゃあ演算子を撃って関数を消すのは・・・?
・・・
コレだ!!!!!!!!!!!!!!!!!!!!!!!!!!
というのを一瞬で思いついたのでコレで行くことにしました。我ながらいいアイデアだと思いました。
ルールは上に書いた通り「関数に演算子を作用させて消す」というものです。ただし「消す」とは関数をにすることを指します。また、ナブラ演算子ゲームの方式をマネして、定数倍は無視することにしました(例えばの導関数は本来ですが、本ゲームではとして扱います)。
しかしこのアイデアは一筋縄ではいきません。僕は自動微分(あとで知ったんですがこういうのは一般的に数式微分というらしいです・・・)(関数をコンピュータに渡すと微分してくれるアルゴリズム)を実装したことがないので、登場させる関数や演算子を適当に制限する必要がありました。
最終的に登場する関数はの5種類、登場する演算子はの4種類に決めました。これらの関数は微分や極限の計算が(有限通りを全て書き出せるという意味で)容易だからです。
例えばは階導関数を綺麗に書き表す方法が存在しないのでボツになりました。演算子も当初は不定積分も考えていましたが、例えばを回積分したものが綺麗に書けないのでボツになりました(それ以外にも問題はありますが)。
こうしてゲーム内容を決めて我々は当日に望むことにしたのであった・・・
ちなみに開発環境はDXライブラリです。理由は僕が使えるからです。(は?)
当日
とてもつらい頼むから朝9時に集合させるな
— ✞キリト✞ (@unko08658932) 2018年6月9日
言い訳をするとGoogle Code JamのRound3が前日の深夜にあったんですよ。僕はすぐ撤退したんですけど(は?)
睡眠が全然足りないので朝からオレンジ魔剤と「Kickstart」という最近出たエナジードリンクを1本ずつ飲んで開発開始しました。とはいってもチーム開発の経験が皆無なのと、シューティングで「自機」「敵」「自機の弾」あたりを何人かで分散して書くとかえってつらそうだと思い、その辺の処理は全て自分1人で書くことにしました。プログラム担当のtako君にはとりあえずタイトルとリザルトを作ってもらうことにし、残りの2人にはリソースをかき集めてもらうことにしました。
12時頃には大体のクラス作成が完了し、13時半頃にはネックだと思っていた「関数を微分する」という関数の実装が完成(有限通りなのでラクでしたが、この関数だけで40行も使っていました)。しかし「画像を表示して動かす」といった目に見える進捗が無かったので、チームメンバーは(大丈夫かよ・・・)という様子でした。僕自身も結構焦っていました。
お昼は歌志軒に行き、Kickstartをもう1本キメて進捗再開。nambatsu君が集めてくれた画像を読み込んで実際に動かしてみる。・・・これは我ながら結構面白いゲームだ。まだ時間もあるしこのままの勢いで作ったらイケる。そう思いました。この時点で15時半頃でしたので、あとはゲームとしての体裁を整えるのに間に合うかという時間勝負になりました。
Kickstartをもう1本キメていろいろ修正し、バグを取ったらゲーム部分は4時頃に大体完成しました。あとはtako君が作ったタイトルやリザルトとmergeするだけ・・・なのですが、ここでgitに不慣れなためにアクシデント発生。コンフリクトするのは予測していたが、それを解消してプッシュしようとしてもなぜか出来ない。というかそもそもプッシュ自体が出来ない。土壇場でこれは非常に困ってしまいました。
仕方がないのでプッシュはせずにそのまま自分のPCだけでゲームを完成させ、完成品はUSBで共有することに。この決断に時間を使い過ぎたせいでBGMやSEを付けるヒマが無くなってしまいました。残念。
ゲーム概要
十字キーで左のオタクを動かしてXキーで弾(演算子)を選んでZキーで発射
使える演算子はの4種類
登場する関数はの5種類
関数を撃ち漏らして左に行ってしまうと上のHPバーが減り、0になってしまったら終了
1つ関数を0にするたびに得点が4点ずつ増えていき最終的に60点以上になったら得単
関数を発散させたり振動させたりしちゃうと以降は各種演算子が効かなくなって左に流れるまで黙って見ることしか出来ない
をに飛ばすと・・・?
ちなみに
あのゲーム、自機の弾や敵を動的にメモリ確保したり解放したりしてるんですけど実はゲーム終了時に画面に存在している敵と弾のメモリは解放していないので長時間プレイすると爆発します
— ✞キリト✞ (@unko08658932) 2018年6月11日
それとタイトルとリザルト画面は「文字の大きさを変更する」という処理(重い)を毎Fごとに2回ぐらいやっているのでタイトルで放置しても爆発します
— ✞キリト✞ (@unko08658932) 2018年6月11日
感想
— ✞キリト✞ (@unko08658932) 2018年6月10日やったぜ。
他のチームがアイデアもプロいし実装もプロいチームばっかだったのでアイデア賞を貰えたことが未だに信じられません。
反省点としては僕自身がgitに不慣れだったので多大に迷惑をかけたのと、それ以外にもチームでの分担があまり上手く出来なかった点でしょうか。特にHinaruhi君にはこれといった仕事を振ることが出来ず、それが個人的に結構な後悔になっています。
あとはやっぱり音を付けたかったですね。多分あるのと無いのでは全然違うと思います。
チームの皆さんは本当にありがとうございました。