- masatoshi
- Mar 9, 2018
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
簡単なパズルゲームの紹介でした。
Comments
Add your comment