AndroidStudio・簡単なスライドパズル

TextViewを使った簡単な15パズルの雛形作ってみた

まずは.xmlをデザインします。

LinearLayout でこんな感じのコードを16個作ります。

<TextView
                android:id="@+id/amin_text_1"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_margin="5dp"
                android:layout_weight="1"
                android:background="@android:color/black"
                android:clickable="true"
                android:gravity="center_vertical|center_horizontal"
                android:onClick="onNumberTextTapped"
                android:tag="7"
                android:text="5"
                android:textAppearance="@style/TextAppearance.AppCompat.Button"
                android:textColor="@android:color/white"
                android:textSize="36sp"
                android:textStyle="bold" />

こんな感じになるまで頑張ってみてください。

数字入れてるけどここは空でも大丈夫です、見た目を確認したいだけなので。

 

今度はクラスに処理を書きます、ちょっと長いですがご容赦ください。

public class MainActivity extends AppCompatActivity {

    Random random = new Random();

    public TextView[] numberText = new TextView[16];    //テキストビュー
    public TextView clearText;      //クリアの文字が書いてあるテキスト invisible

    //タップする textView の ID
    private int[] textId = {R.id.amin_text_1, R.id.amin_text_2, R.id.amin_text_3, R.id.amin_text_4,
            R.id.amin_text_5, R.id.amin_text_6, R.id.amin_text_7, R.id.amin_text_8,
            R.id.amin_text_9, R.id.amin_text_10, R.id.amin_text_11, R.id.amin_text_12,
            R.id.amin_text_13, R.id.amin_text_14, R.id.amin_text_15, R.id.amin_text_16, };

    private int[] shokiNumber = new int[16];    //ランダム値を入れていく箱
    private int[] number = new int[36];        //盤面を表すための箱
    private int randomNumber;       //ランダムナンバー
    private int randomCheck;        //被っていないかをチェックする変数
    private int count;      // shokiNumber の要素を盤面に入れていく変数

    private int clearCheck;     //クリア判定チェック 16 になればクリア

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // TextViewの接続
        for (int i = 0; i < numberText.length; i++) {
            numberText[i] = (TextView)findViewById(textId[i]);
            numberText[i].setId(i);     // id を数値に置き換える;
        }
        clearText = (TextView)findViewById(R.id.amin_txv_clear);

        //number と shokiNumber 配列の初期値を -1 に設定 // 0 ~ 5, 6の倍数, 11, 17, 23, 29, 31 ~ 35 は枠外として扱う
        for (int i = 0; i < number.length; i++) number[i] = -1;
        for (int i = 0; i < shokiNumber.length; i++ ) shokiNumber[i] = -1;

        // shokiNumber にランダムな数値を入れていく処理
        for ( int i = 0; i < shokiNumber.length; i++ ) {
            randomCheck = 0;        //チェックを0にする
            randomNumber = random.nextInt(16);      // 0 ~ 15 までの数値をランダムに取り出す

            //数字が被っていないかをチェックする、被っている数字がなければ randamCheck をカウントする。
            for ( int j = 0; j < shokiNumber.length; j++ ) if ( shokiNumber[j] != randomNumber )randomCheck++;

            //盤面に入れるための配列を格納
            if (randomCheck == 16) shokiNumber[i] = randomNumber;   //被りがなかったら++
            else i--;       //1つでも被っていたらやり直し
        }

        //盤面の配列 7 ~ 10, 13 ~ 16, 19 ~ 22, 25 ~ 28 に数値を格納していく
        //使用部分を 0 にする
        for (int i = 0; i < 4; i++ ) {
            for (int j = 7; j < 11; j++ ) {
                number[j + i * 6] = shokiNumber[count];
                count++;
            }
        }

        // TextView に配列の要素を格納していく、0には何も入れない
        for ( int i = 0; i < numberText.length; i++ ) {
            if (shokiNumber[i] != 0 ) numberText[i].setText(String.valueOf(shokiNumber[i]));
            else if (shokiNumber[i] == 0) {
                numberText[i].setText("");
                numberText[i].setBackgroundColor(Color.TRANSPARENT);
            }
        }
        
    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);

        for (int i = 0; i < numberText.length; i++) numberText[i].setHeight(numberText[0].getWidth());      // 高さを横幅と同じサイズにする
    }

    public void onNumberTextTapped (View view) {

        clearCheck = 0;

        String str = (String)view.getTag();
        int tag = Integer.parseInt(str);

        //上下左右を調べる
        if (number[tag] != 0) {
            // 右
            if (number[tag + 1] == 0) {
                numberText[view.getId() + 1].setText(String.valueOf(number[tag]));
                numberText[view.getId()].setText("");
                number[tag + 1] = number[tag];
                number[tag] = 0;
                numberText[view.getId() + 1].setBackgroundColor(Color.BLACK);
                numberText[view.getId()].setBackgroundColor(Color.TRANSPARENT);
            // 左
            } else if(number[tag - 1] == 0) {
                numberText[view.getId() - 1].setText(String.valueOf(number[tag]));
                numberText[view.getId()].setText("");
                number[tag - 1] = number[tag];
                number[tag] = 0;
                numberText[view.getId() - 1].setBackgroundColor(Color.BLACK);
                numberText[view.getId()].setBackgroundColor(Color.TRANSPARENT);
            // 上
            } else if (number[tag - 6] == 0) {
                numberText[view.getId() - 4].setText(String.valueOf(number[tag]));
                numberText[view.getId()].setText("");
                number[tag - 6] = number[tag];
                number[tag] = 0;
                numberText[view.getId() - 4].setBackgroundColor(Color.BLACK);
                numberText[view.getId()].setBackgroundColor(Color.TRANSPARENT);
            // 下
            } else if (number[tag + 6] == 0) {
                numberText[view.getId() + 4].setText(String.valueOf(number[tag]));
                numberText[view.getId()].setText("");
                number[tag + 6] = number[tag];
                number[tag] = 0;
                numberText[view.getId() + 4].setBackgroundColor(Color.BLACK);
                numberText[view.getId()].setBackgroundColor(Color.TRANSPARENT);
            }
        }

        //クリア判定
        for (int i = 0; i < numberText.length; i++) {
            if (numberText[i].getText().toString().equals(String.valueOf(i + 1))) clearCheck++;        // 正しいところに正しい数字が入って入れば +1
        }

        if ( clearCheck >= 15 ) {
            for(int i = 0; i < numberText.length - 1; i++) {
                numberText[i].setClickable(false); //クリアしたら押せなくなる
                numberText[i].setBackgroundColor(Color.argb(150, 0, 0, 0)); //半透明にする
                clearText.setVisibility(View.VISIBLE);      //クリアテキストを表示
            }
        }
    }
}

 

コードが出来たら起動、問題なければこんな感じに表示されます。

 

数字をタップして動けば成功です。

アニメーションや音の記述はないので、お好みでカスタマイズしてみてください。

 

数字を並べるアルゴリズムを入れてないので、クリア出来ない時がありますw

 

簡単なパズルゲームの紹介でした。

記事のサブ画像




コメント

コメントを追加

user-symbol

Stay in touch

ビジネスおよび開発者向けの実用的な最新情報をご希望ですか?

ソースコードプロジェクトに対するPieceXコミュニティのニーズについてご提供します。

PieceXの最新の無料コミュニティコードプロジェクトをいち早くお知らせします。