似たようなミニゲームに触れたことがあるはずです. プログラムに入ると、絵が乱雑に配置されます. 全部で 9 つのランダムな絵があります. 与えられたテンプレートと同じ絵に移動する必要があります.成功. ゲーム中に時間があります. パズルが成功すると時間が止まります, クリックして再開, 絵が再びスクランブルされ、時間が再びカウントされます!
実装手順:1.ジグソーパズルの描画、2.ジグソーパズルのスクランブル設定、3.ジグソーパズルの断片位置の切り替え、4.ジグソーパズルの成功条件、5.ジグソーパズルの再開
今回はステップ1とステップ2のみ実施
実装プロセスで使用される知識の一部であるハンドラースレッドメカニズムは時間測定に使用され、画像の無秩序な配置の実現原理は、それらを数値形式で記述し、それらをペアで交換して対応する上に配置することですコントロール!
対応するコメントはコード セグメントに作成されています. わからないことがありましたら, コメント欄にメッセージを残すか, プライベート メッセージを送信してください. 記事の内容に誤りがある場合は, ご容赦ください.私と私を修正してください!
コードは以下のように表示されます:
xml パズル レイアウト コード:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas .android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" ツール:context=".MainActivity"> <TextView android:layout_marginTop="20dp" android:textColor="#FF0000" android:textSize="30sp" android:layout_gravity="center" android:id="@+id/pt_tv_time" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="0dp" android:text="時間:0" /> <LinearLayout android:layout_marginTop="20dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/pt_line1" android:layout_gravity="center" android:orientation="horizontal"> < ImageButton android:src="@drawable/pt_id_00x00" android:padding="0dp" android:id="@+id/pt_id_00x00" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onClick" /> <ImageButton android:src=" Android:id="@+id/pt_id_00x01" android:layout_gravity="center" Android:layout_width="wrap_content" Android:layout_height="wrap_content" Android:onClick="onClick"/> <ImageButton Android:src="@drawable/pt_id_00x02" Android:padding="0dp" Android:id="@+id /pt_id_00x02" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onClick"/> </LinearLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:id= "@+id/pt_line2" android:orientation=" horizontal"> <ImageButton Android:src="@drawable/pt_tv_01x00" Android:padding="0dp" Android:id="@+id/pt_id_01x00" Android:layout_width="wrap_content" Android:layout_height="wrap_content" Android:onClick="onClick"/> <ImageButton Android:src="@drawable/pt_tv_01x01" Android:padding="0dp" Android:id="@+id/pt_id_01x01" Android:layout_width="wrap_content" Android:layout_height= 「wrap_content」 アンドロイド:onClick="onClick"/> <ImageButton Android:src="@drawable/pt_tv_01x02" @drawable/pt_tv_01x02" android:padding="0dp" Android:id="@+id/pt_id_01x02" Android:layout_width="wrap_content" Android:layout_height="wrap_content" Android:onClick="onClick"/> </LinearLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/pt_line3" android:layout_gravity="center" android:orientation="horizontal"> <ImageButton android:src="@drawable/ p1" アンドロイド: パディング =0dp" アンドロイド:id="@+id/pt_id_02x00" android :layout_width="wrap_content" android:layout_height="wrap_content" Android:onClick="onClick"/> <ImageButton Android:src="@drawable/p2" Android:padding="0dp" Android:id="@+id/pt_id_02x01" Android:layout_width="wrap_content" Android:layout_height= "wrap_content" android:onClick="onClick"/> <ImageButton android:src="@drawable/p3" android:padding="0dp" android:id="@+id/pt_id_02x02" android:layout_width="wrap_content" android :layout_height="wrap_content"/LinearLayout> <Button android:layout_marginTop="10dp" Android:onClick="onClick"/> </LinearLayout> android:layout_gravity="center" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/pt_btn_restart" android:onClick="restart" android:text="重新開始"/> < ImageView android:layout_gravity="center" android:layout_marginTop="10dp" android:src="@drawable/yuantu" android:id="@+id/pt_iv" android:layout_width="210dp" android:layout_height="210dp" /> </LinearLayout>
アクティビティ関数の実装コード:
パッケージcom.example.jigsaw; import androidx.annotation.NonNull; androidx.appcompat.app.AppCompatActivity をインポートします。 android.annotation.SuppressLint をインポートします。 android.os.Bundle をインポートします。 android.os.Handler をインポートします。 android.os.Message をインポートします。 android.view.View をインポートします。 android.widget.Button をインポートします。 android.widget.ImageButton をインポートします。 android.widget.TextView をインポートします。 public class MainActivity extends AppCompatActivity { ImageButton ib00,ib01,ib02,ib10,ib11,ib12,ib20,ib21,ib22; ボタン restartBtn; TextView timeTv; //定义時間的变量 int time = 0; //フラグメントの配列を一元管理用に格納 private int[]image={R.drawable.pt_id_00x00,R.drawable.pt_id_00x01,R.drawable.pt_id_00x02, R.drawable.pt_tv_01x00, R.drawable.pt_tv_01x01, R.drawable.pt_tv_01x02, R.drawable.p1, R.drawable.p2, R.drawable.p3}; // 配列された画像配列の添字の配列を宣言するrandom This array private int[]imageIndex=new int[image.length]; Handler handler=new Handler(){ @Override public void handleMessage(@NonNull Message msg) { if (msg.what==1){ time++; timeTv . setText("Time: "+time+" seconds"); handler.sendEmptyMessageDelayed(1,1000); } } }; @Override / / フラグメント の中断を中断します。 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); handler.sendEmptyMessageDelayed(1,1000); } // 不規則な プライベートをランダムに中断します void interruptRandpm() { for(int i=0; i< imageIndex.length;i++){ imageIndex[i]=i; } //20回指定し、2つの添字に対応する値をランダムに選択して交換する int rand1,rand2; for(int j=0;j<20; j++){ // 0 ~ 8 の値の添え字をランダムに生成します rand1=(int)(Math.random()*(imageIndex.length-1)); // ランダムに生成された 2 番目の添え字は Same for と比較できません初めて do{ rand2=(int)(Math.random()*(imageIndex.length-1)); if(rand1!=rand2){ break; } } while ( true); //2 つのコーナーで対応する値を交換します swap(rand1,rand2); // 指定したコントロールにランダムに配置 ib00.setImageResource (image[imageIndex[0]]); ib01.setImageResource(image[imageIndex[1]]); ib02.setImageResource(image[imageIndex[2]]); ib10. setImageResource(image[imageIndex[3]]); ib11.setImageResource(image[imageIndex[4]]); ib12.setImageResource(image[imageIndex[5]]); ib20.setImageResource(image[imageIndex[6]]); ib21.setImageResource(image[imageIndex[7]]); ib22.setImageResource(image[imageIndex[8]]); } int temp=imageIndex[rand1]; imageIndex[rand1] =imageIndex[rand2]; //交換 private void swap(int rand1, int rand2) { imageIndex[rand2]=temp; } private void initView() { ib00=findViewById(R.id.pt_id_00x00); ib01=findViewById(R.id.pt_id_00x01); ib02=findViewById(R.id.pt_id_00x02); ib10=findViewById(R.id.pt_id_01x00); ib11=findViewById(R.id.pt_id_01x01); ib12=findViewById(R.id.pt_id_01x02); ib20=findViewById(R.id.pt_id_02x00); ib21=findViewById(R.id.pt_id_02x01); ib22=findViewById(R.id.pt_id_02x02); timeTv=findViewById(R.id.pt_tv_time); restartBtn=findViewById(R.id.pt_btn_restart); } public void onClick(View ビュー) { } public void restart(View view) { //パズル中断 handler.removeMessages(1); //時間を 0 にリセットし、再⏲ time=0; timeTv.setText("Time:" +time+" seconds"); handler.sendEmptyMessageDelayed(1,1000); } } 効果のスクリーンショット: