【Java】テトリス制作

2018年10月25日

ゲーム制作3作品目はJavaFXとSwingでテトリスを作成してみたいと思います。

当初は中級編として、作りこむ予定でしたが、個人的に早く3Dの勉強やUnityの勉強をしたくなってきたので、今回も初級編として、軽く作るくらいにしときます。

今回使用するツール類は下記です。
・Java9(プログラム制作。JavaFX&Swing)
・Eclipse(Java統合開発環境)

外部リソースとしての効果音や画像などは一切使用しません。

使用ライブラリ
nompor-lib-alpha-1.1.4.jar

今回からは、この自己満ライブラリのソースもgitで全公開していきます。未完成クラスも多いですが、SwingとJavaFXの勉強になる部分もあるかもしれないので、興味あれば見てってください。

ライブラリソース
java-nompor-lib

需要はないでしょうが、ライブラリのJavadocも公開しました。・・・まあjavadocコメントが全く書かれてないのでどんなメソッドが定義されているかくらいしかわかりませんw

ライブラリJavadoc
Javadoc

SwingとJavaFXを使用しますが、これらはライブラリのクラスでラップした上で利用しますので、元の処理を見たい場合はライブラリのソースをご参照下さい。

今回のゲームの最終完成版は一般的にメジャーなゲームであるテトリスということなので、ふりーむでの公開はしません。
ソースと実行ファイルを含めてすべてgitにアップしておくのでご自由にプレイなり改造なりしていただいて構いません。

記事の内容は、ゲーム処理の部分を中心にやっていきます。毎回画面遷移やタイトル画面、リソース読み込みの記事などを書いても無駄なので。



1.大まかな仕様決め

画面はタイトル画面とゲーム画面のみとします。タイトル画面はゲーム開始と終了のみのシンプルな内容とします。

ゲーム(テトリス)の仕様
テトリスとは特定のブロックで構成された塊をフィールドに配置して、ラインを揃えて消していくゲームです。もちろん皆さんご存知でしょう。おなじみのテトリスのことなので、どんな仕様なのかは大体予想はつくかもしれません。

では、どこまで実装するかです。ということで、今回実装する仕様をまとめました。

・フィールドの広さは20×10
・操作はキーボードのみ
・回転は右回転左回転を実装し、回転に関する細かい調整はしないものとする
・自由落下の実装
・左右移動、高速落下の実装
・テトリミノはI,S,Z,L,J,O,Tの一般的な形のみ
・テトリミノが設置され、横一列のブロックが隙間なく揃ったラインは削除
・ハードドロップの実装(一瞬で下まで落下させる)
・ホールドの実装(テトリミノのキープ)
・ネクストテトリミノを表示(3、4手分表示)
・降ってくるテトリミノは完全ランダムではなく7種一巡とする
・フィールドの上2ライン内にブロックが存在した場合はゲームオーバー

ゲーム内のエフェクト、得点計算、Tスピン、自由落下速度の高速化など、その他もろもろは実装しません。

2.フィールドとブロックの表示

フィールドの表示、ブロックの表示を実装してみます。

3.テトリミノの定義と出現、落下の実装

テトリミノの定義と出現、落下を実装します。

4.テトリミノの左右移動、回転、高速落下の実装

テトリミノの左右移動、高速落下を実装していきます。

5.移動可能判定、配置完了判定、ライン削除判定

面倒くさい判定系の処理を実装します。ここが終わればテトリスは完成したも同然!

6.ハードドロップ、ホールド、ネクストテトリミノの表示を実装

今回の実装内容はなくても、テトリスとしては完成していますが、もう少し便利な機能を実装してみました。

制作した感想など

今回は初めてテトリスを作ってみましたが、そこまで難しくはなかったですね。

まあ1時間とかで作ってる方も普通にいるようですしね。アルゴリズムは結構適当なので無駄が多いと思います。

作りこんではいないので、テトリスをよく知る方がプレイするとイラッとする挙動もありそうですね。ていうか普段テトリスをしない自分でさえイラっとする挙動があります。(回転とか回転とか・・・・)

今回制作したゲームのプレイ動画

前回制作したアクションゲームはLinuxで動きませんでしたが、今回はJavaFX、Swingの両方が動くということもあり、動作するようになっています。動作確認はWin10、Win7、Ubuntu18、CentOS6で行いました。CentOS6以外はJavaFXで動作しました。Macは未確認。多分動くと思う。

今回のソースはこちらにうpしています。


今後の予定ですが、Javaは一旦休んで、C++でDirectX(D2D,D3D中心)の勉強をやっていくつもりです。その際勉強したことを自分用のメモとして記事で残していこうと思います。

これを勉強する理由は3Dについて少し勉強しておきたいというのもありますが、ほとんどは勉強して自己満足したいだけです。3Dのテストゲームもここで一本作っときたいと思います。

あとはUnityの勉強と絵も描かんといかんが、もうこれはガチでゲーム制作する時に一緒にやっていくのでいいや。