コマを用意したので、次は並べていきます。
ソースコードはこちらに公開しています。
https://github.com/et79
GameView へメンバーを追加
今後のコーディングのために、以下のクラスメンバーを追加します。
メンバ | 補足 |
---|---|
gridRect | 外枠のサイズを表す |
emptyPosIdx | 空セルの位置を保持する |
pieces | コマを持つアレー |
isInit | 最初の描画であることを表すフラグ |
private RectF gridRect = new RectF( // 外枠
gridOrg.x,
gridOrg.y,
gridOrg.x + gridWidth,
gridOrg.y + gridWidth );
private int emptyPosIdx = -1; // 空白セルの位置
// コマ保持アレー
private ArrayList<Piece> pieces = new ArrayList<Piece>(16);
// 最初の描画フラグ
private boolean isInit = true;
GameView コンストラクタでコマのインスタンスを生成
コマのインスタンスを生成し、piecesアレーに格納します。
背景色も少し変えています。
そして、15ゲームの最初の空白セルの位置を15、右下に設定します。
// コンストラクタ
public GameView(Context context){
super(context);
setBackgroundColor(Color.parseColor("#d0d0d0"));
// コマを生成
for( int i = 0; i < 16; i++ )
{
Piece piece = new Piece( paint, this, i );
pieces.add(i, piece);
}
// 最初の空白は、最後のセル
emptyPosIdx = 15;
}
コマをシャッフルするメソッド
を用意します。
pieces には、位置と並び順を合わせてコマを格納しています。piecesをシャッフルし、アレーのインデックスをコマの位置インデックスに詰め直すことで、シャッフル完了です。
// コマをシャッフル
private void shufflePieces(){
// コマアレーをシャッフル
Collections.shuffle(pieces);
// シャッフルしたアレーのIdxを、コマの位置にセット→位置のシャッフル完了
for( int i = 0; i < 16; i++ ) {
pieces.get(i).setPosIdx(i);
if( pieces.get(i).numIdx == 15 )
emptyPosIdx = i;
}
}
座標からどのマスかを取得するメソッド
唐突な感じはありますが、座標から位置インデックスを算出するメソッドを用意しておきます。タップした時に、タップしたところにあるコマを判別し、開いているマスに動かすためです。
// 座標がどの位置に該当するか算出
private int getPosIdx(Point point){
int oneWidth = gridWidth/4;
// 座標を1セルの幅で割った時の商が、x,y 座標のセルの位置に該当
int xPos = ( point.x - gridOrg.x ) / oneWidth;
int yPos = ( point.y - gridOrg.y ) / oneWidth;
return xPos + yPos * 4;
}
コマを動かせるか?チェックメソッド
動かそうとした位置インデックスにあるコマが、実際に動かせるか?をチェックします。左右上下に空白セルがあれば、動かせるっていうコトにします。
上下マスの位置インデクスは、位置インデックス±4になります。
左右は±1。で、左右については位置インデックスが端だった場合、±で行が変わってしまうので、注意が必要です。
// コマを動かせるか、チェック
// 該当位置の上下左右に、空白セルがあれば、true
private boolean isPieceMoveAble(int posIdx) {
// 上下をチェック
if( posIdx - 4 == emptyPosIdx ||
posIdx + 4 == emptyPosIdx )
return true;
// 右をチェック(コマが右端にいる場合は除外)
if( posIdx % 4 != 3 && posIdx + 1 == emptyPosIdx )
return true;
// 左をチェック(コマが左端にいる場合は除外)
if( posIdx % 4 != 0 && posIdx - 1 == emptyPosIdx )
return true;
return false;
}
長くなってしまったので、今日はここまでにします。
ってか、力尽きました。。明日も仕事だし。。
ちょっと、注意力散漫で書いたので、明日見直します。
そして、この投稿を書きながら、録画していた映画を見てました。
最高でした。むっちゃ、泣けます。涙は出なかったんですけどね。これがアメリカの日常なのでしょうか。戦争の現実。集団的自衛権、大丈夫なんでしょうか。まずは理解する所から、始めないと・・・。
生きてこそですよね。なんだかんだ言ったって、生きてないと。。家族との時間を、大切にしようと思いました。
ちなみに、この映画はシアター092っていうTOKYO MX2の番組で、CMなしでやっていました。CMなしって、どういうことなんですかね…。慈善活動??スポンサーがつかなかったのかな?ナゾです。TOKYO MX、5時に夢中と言い、気になります。
コメント