• 締切済み

Javaでテトリスを作成(OOPで)

JavaでGUIのテトリスを作成しているのですが、処理でちょっと困っています。 次のようにオブジェクト指向で作っているのですが、なにか違和感が感じます。 問題点があったら教えてください>< Field.java テトリス全体のmap どこにブロックがあるかを保持 Block.java テトリスのBlock(テトリミノ)のスーパークラス。このサブクラスでそのBlockの形を保持 TetrisProcess.java テトリスの処理をする。Blockの移動、移動できるかを確認。Threadをたてる。 Blockが落ちてくる処理なんですが、TetrisProcessからBlockに『次の形はなに?』と聞いて、Fieldに『次の形はこれだから、下(横)へ進める?』っていう処理を考えているのですがどうでしょうか?? 駄文、本当にごめんなさい・・・

みんなの回答

  • mpro-gram
  • ベストアンサー率74% (170/228)
回答No.1

Field と Block の関係がいまいちうまく機能分担してないというか分離しすぎというか、内包関係が必要なんじゃないかな? 個々のブロック位置情報は、個々のBlockの性質であり、Blockがpropatyとして持つべきなので、Field(というかmap?) 内に、ArrayListなどで、Block群を保持しておくのがいいと思う。 移動可否は、Fieldのメソッドで、ArrayList内データに総当たりして移動方向にいる物が無いことを確認という手順になる。個々のBlockは隣にいるBlockには関知しない。 TetrisProcessからは、Fieldへ「次を(下または横へ)移動させて」という命令(メソッド呼び出し)だけで、あとはField側メソッド内で、次が何か、移動可能かの判定もして、Block位置書き換え(=移動)もField側で完了させます。 こうすることで、TetrisProcess側は、どこに何があるかも知らない(Blockのことは知らない)けど、thread機能(と、マウス操作も)に専念してFieldに対して次々移動命令を発するだけとなり、 Field側は、それを受けて、内部のBlock群情報を検索して必要が有れば変更するだけとなり、 OOP的に表現すれば「TetrisProcessに対してBlock群情報の隠蔽」と「機能(Block移動)とデータ(Block群データ)のカプセル化」ができると思います。 あと、view 機能(表示画面描画機能)をどこに持たせるか、別にするか、でMVC的にクラス構成できるんじゃないかな?

関連するQ&A