
###前提
オブジェクト指向を用いたテトリスの設計
ここで質問させていただいた者です。
この続きの質問です。これは見ても見なくても結構です。
ブロック4つを一まとまりにしたものをテトリミノと呼びます。
テトリミノは7種類あります。
テトリミノには回転軸がブロックの中心に存在するものと、交差点に存在する物の2種類あり、以下の図の赤い部分が回転軸です。
###質問内容
テトリミノのクラスの設計はどの様にするのが上手な設計でしょうか。
私は以下の様にテトリミノが存在する座標と、ミノの形を持つ二次配列を持たせる設計をしていました。
java
1int x = 3, y = 1; 2boolean[][] shape = new boolean[][] 3 { { true , true , false }, // ■■□ 4 { false, true , true }, // □■■ 5 { false, false, false } }; // □□□
この設計だと、例えば右回転をさせたいなら以下の様なアルゴリズムで簡単に処理することができます。
java
1// Boolean2次配列をコピー 2private boolean[][] copy( boolean[][] args ) 3{ 4 boolean[][] ret = new boolean[args.length][args[0].length]; 5 for( int x=0 ; x< args .length ; x++ ){ 6 for( int y=0 ; y< args[0].length ; y++ ){ 7 ret[y][x] = args[y][x]; 8 } 9 } 10 11 return ret; 12} 13 14// 右回転 15void rotateRight() 16{ 17 boolean[][] temp = copy( shape ); 18 for( int y = 0 ; y < shape.length ; y++ ){ 19 for( int x = 0 ; x < shape.length ; x++ ){ 20 shape[y][x] = temp[shape.length -x -1]y]; 21 } 22 } 23}
しかし、オブジェクト指向的な設計を目指すなら、ブロックを4つ持っていると言う方が良いですよね。
ブロックが保持する内容は以下の二通りが考えられますが、いずれも問題点があり、私には良い解決方法が見当たりません。
1.フィールドの中のどこに位置しているかを表す座標
この場合、回転させるという処理を書くのがすごく大変です。
2.回転軸からの相対座標(この場合、テトリミノが回転軸の座標を保持)
この場合、回転させる処理は簡潔に書けそうですが、回転軸がブロックの中心にあるものと、交差点にあるものにより、保持する内容が異なってしまいます。
いずれかの良い問題解決の方法、それがないならこの二つ以外に良い方法があれば教えてください。




回答5件
あなたの回答
tips
プレビュー