つなげて消すのがグンペイだ! で有名なGunpey をJava のSwing を用いて再現してみました。 上下にパネルを入れ替えてラインを左から右につなげてライン消します。 パネルが最上部より出るか時間切れになるかでゲームオーバーです。 ゲームオーバーまでのスコアを競ってください。 一度に消すパネルの量が多ければ多いほど点数が高くなります。 詳細は参考のセクションをご参照ください。
こちらをご参照ください。 端的にいえばここからダウンロードできます。
Ubuntu などapt を使用できる場合にはターミナルでインストールすると良いでしょう。
$ sudo apt update
$ sudo apt install default-jdk -y
Gunpey.jar をダブルクリック、もしくはターミナルで
$ java -jar Gunpey.jar
とすることで実行できます。
コンパイルするためにはJava の種類をjre ではなくjdk でインストールしてください。 お好きなエディタで編集してしてから以下で実行。
$ javac -encoding UTF-8 *.java
$ java Gunpey
jar ファイルを作成したい場合には
$ jar cfe Gunpey.jar Gunpey *.class LICENSE
sounds ディレクトリを作成して以下のファイルを追加してください。
- bgm.mid : ゲームBGM
- swap.wav : パネル入れ替え時の音
- connect.wav : ライン結合時の音
- vanish.wav : ライン消去時の音
- panelup.wav : パネルせり上がり時の音
ゲームBGM はマルチプラットフォームでテストできておりません。 wav に関しては魔王魂様の効果音 を使わせていただきテストしました。 .gitignore で設定してGithub 上にはアップロードを控えさせていただいております。二次配布可能な音源などありましたら教えていただけますと幸いです。
クラスや変数のイメージは下図の通りです。
タイマを管理するクラス(TimeFlag.java)を作って大量生産しました。 設定時間が経過するとTimeFlag のprivate変数であるflagがtrueになります。
- gameTimer : ゲーム自体の制限時間のタイマ
- vanishTimer : パネルがつながれてから消えるまでのタイマ
- swapTimer : パネルの入れ替え時間のタイマ
- panelupTimer : 新しい列が出るまでの時間のタイマ
以下の3種類をパネルの配列として用意しました。
- normalPanel : 通常のパネル
- vanishPanel : 消滅中のパネル
- floatingPanel : 消滅中のパネルの上にあるパネル
normalPanel を緑色で表示、vanishPanel を黄色で表示、floatingPanel は緑色で位置をずらして表示します。
ラインがつながっているかどうかを判定するために、
- panelFlag : パネルの状態
- gridFlag : パネルの頂点の状態
を用意して再帰関数で処理しています。 左端から右へ伝搬させる処理と右端から左へ伝搬させる処理を両方行い、折り返して接続されているようなラインに対しても正確に判定します。
RankingData クラスを作成して、ranking/score.txt を読み書きしています。 ゲームオーバーになると、そのゲームでのスコアを追加、降順にソートされて格納し直します。ハイスコアを取り出したい場合にはソート済みの先頭のスコアを取り出してくる仕組みです。
プログラムが複雑になりそうでしたので以下を放置してます。
- Help のURL リンクの対応。
- 音出力にApplet を用いている(現在は非推奨)。
- グンペイホームページ :おそらくここが本家ページです。
- gunpey maniax :得点計算の参考にさせていただきました。
ソースコードはMIT License としました。 画像はPixabay で検索したものを使用させていただいております。 アイコンは公式を模倣した私の自作です。