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

 

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

Additional Images




Comments

Add your comment

user-symbol

Stay in touch

Get Practical Tips For Business and Developers.

Learn about PieceX Community Needs for Source Code Projects.

Be the First to Know PieceX Newest Free Community Code Projects.