Android 프로젝트 --- 직소 퍼즐 게임(on)

비슷한 미니게임을 접해보셨을텐데요 프로그램에 들어가면 사진이 순서없이 정렬이 됩니다 총 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://스키마 .android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="수직" 
    도구 :context=".MainActivity"> 

    <TextView 
        android:layout_marginTop="20dp" 
        android:textColor="#FF0000" 
        android:textSize="30sp" 
        android:layout_gravity="center" 
        android:id="@+id/pt_tv_time" @+id/pt_tv_time" 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        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" /> 
    <이미지 버튼 
        android:src="@drawable/pt_id_00x01"  
        android:padding="0dp"
        android:id="@+id/pt_id_00x01"
        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:layout_gravity="센터"
        android:orientation="horizontal">onClick="onClick"/> 
        <이미지 버튼
            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" 
            android:onClick=" onClick"/> 
            android:src="@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" 
            android:padding="0dp" 0dp" 
            android:id="@+id/pt_id_02x00"
            android :레이아웃_폭="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" 
            안드로이드 :layout_width="wrap_content"
            android:layout_height="wrap_content" 
            android:onClick="onClick"/>
    </LinearLayout>/LinearLayout> 
    <버튼 
        android:layout_marginTop="10dp"
        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" /> 
</선형 레이아웃>

활동 함수 구현 코드:

패키지 com.example.jigsaw; 

import androidx.annotation.NonNull; 
import androidx.appcompat.app.AppCompatActivity; 

import android.annotation.SuppressLint; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 
import android.view.View; 
import android.widget.Button; 
import android.widget.ImageButton; 
import android.widget.TextView; 

공개 클래스 MainActivity는 AppCompatActivity를 확장합니다 { 
ImageButton ib00,ib01,ib02,ib10,ib11,ib12,ib20,ib21,ib22; 
버튼 재시작Btn; 
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}; 
    //이미지 배열의 첨자 배열 선언, 배열을 무작위로 배열 
    private int[]imageIndex=new int[image.length]; 
Handler handler=new Handler(){ 
    @ 
    public void handleMessage(@NonNull Message msg) 재정 의 { 
     if (msg.what==1){ 
         time++; 
         timeTv.setText("시간: "+time+" 초"); 
         handler.sendEmptyMessageDelayed(1,1000); 
     } 
    } 
} ; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 
        initView();  
        / / 조각 
        방해ruptRandpm();
        handler.sendEmptyMessageDelayed(1,1000); 
    } 
// 무작위로 불규칙한 방해 
    private voidruptRandpm() { 
        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)); 
            //두 번째 무작위로 생성된 아래 첨자는 Same for와 비교할 수 없습니다. 처음 
            do{ 
                rand2=(int)(Math.random()*(imageIndex.length-1));
                if(rand1!=rand2){ 
                    break; 
                } 
            }while(true);  
            //두 모서리의 해당 값을 교환합니다 . 
            swap(rand1,rand2);
        } 
        // 지정된 컨트롤에 무작위로 배열 
        ib00.setImageResource(image[imageIndex[0]]); 
        ib01.setImageResource(image[imageIndex[1]]] ); 
        ib02.setImageResource(이미지[imageIndex[2]]); 
        ib10.setImageResource(이미지[imageIndex[3]]); 
        ib11.setImageResource(이미지[imageIndex[4]]); 
        ib12.setImageResource(이미지[imageIndex[5 ]]) ] ]]); 
        ib20.setImageResource(image[imageIndex[6]]); 
        ib21.setImageResource(image[imageIndex[7]]); 
        ib22.setImageResource(image[imageIndex[8]]); 
    } 
// 교환
    개인 무효 스왑(int rand1, int rand2) { 
        int temp=imageIndex[rand1]; 
        imageIndex[rand1] =imageIndex[rand2];
        imageIndex[rand2]=임시; 
    } 

    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(보기 보기) { 
    }

    public void restart(View view) { 
        //퍼즐 중단 

        handler.removeMessages(1); 
        //시간이 0으로 돌아가고 re⏲ 
        time=0; 
        timeTv.setText("시간: "+시간+"초"); 
        핸들러 . sendEmptyMessageDelayed(1,1000); 

    } 
} 
효과 스크린샷:

추천

출처blog.csdn.net/Abtxr/article/details/126157673