ロゴ ロゴ

コンソールで遊べるsnake_game【C++/ncurses】

はじめに

Den3GameJamでスネークゲームを作りました。

つくったのは一か月くらい前ですが、今更GitHubにあげてブログも書きます。

制作環境

言語:C++

制作時間:デバック含めて10時間くらい

リンク

http://github.com/5jikinoko/Snake_Game

リンクからクローンしてコンパイルして遊んでみてください。

ルールとか仕様はREADMEに書いてるので、ブログでは制作した感想を書きます。

制作同期

大学の授業でncursesというコンソールでスクリーン制御・非同期入力ができるライブラリを使いました。
これを使えばコンソールゲームを簡単に作れそうだと思ったので、復習も兼ねてncursesでコンソールゲームを作ることにしました。

コンソールゲームで『つなぐ』というお題について考えたとき思いついたのがスネークゲームです。昔1000円くらいのゲーム機で遊んだことが印象に残ってたかも。

実装

今年の3月に作ったマインスイーパーではマス目の状態をただの数字で管理していたので、コードを読んでてわからりずらいという反省点がありました。なので今回は素直に列挙体を使いました。

今回はqueueでヘビの尻尾の位置を、2次元配列でマス目が空かヘビの体か卵かを、vectorで卵の位置を管理しました。

2次元配列はヘビの進行方向に何があるかチェックするときと、卵を新しく置くときどのマスが空かチェックするのに使いました。

queuにはヘビの次の頭の位置をpushしていって、尻尾を消すときにpopするといった使い方をしました。

vectorは卵の位置を管理しますが、これは必要なかったです。初めは2次元配列なしで実装しようとしたのですが、卵とヘビの位置の走査するより2次元配列があった方が速いと気づき2次元配列を使いました。queueにはヘビの尻尾の位置がどこか管理する役割が残ったのですが、卵の位置の配列はいりません。むしろ2次元配列使った方が速いです。あとで修正してcommitします。

プログラムで苦労した点はヘビの体の間隔を開けたことです。
間隔がないとUターンを繰り返し続けたとき、ヘビの軌跡がわからなくなるので、間隔を作りました。そのせいでヘビが1つ進むと半角2文字分描画する必要があります。結果、ヘビの位置と描画の関係がわかりずらくなり、プログラムが複雑になりました。

また、プログラムの定値オブジェクトを書き換えることで、縦横のサイズ・卵の数・ヘビの初期サイズを変更できるようにしました。数値いじって遊んでみてください。改善点ですけど、コマンドライン引数を受け取れるようにした方がいいですね。あとで修正してcommitします。

おわりに

ncursesの使用の理解がまだ足りなかったことと、実装法をふわっと考えただけでコーディングに取り掛かってしまったことで、無駄な修正を繰り返してしまいました。ちゃんと実装法を考えてからとりかかろうというのが今回の反省です。

ゲーム自体はちゃんと遊べるものができました。

コメント入力

関連サイト