Android プロジェクト --- ジグソー パズル ゲーム (上)

似たようなミニゲームに触れたことがあるはずです. プログラムに入ると、絵が乱雑に配置されます. 全部で 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="horizo​​ntal"> 
    < 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=" 
        horizo​​ntal"> <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="horizo​​ntal"> 
        <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); 

    } 
}
効果のスクリーンショット:

おすすめ

転載: blog.csdn.net/Abtxr/article/details/126157673