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

이전 글에 이어 이전 글에서는 게임 내 타이밍과 프로그램 조각의 자동 랜덤 배열을 완성했고, 나머지 부분(조각의 이동과 퍼즐의 성공 논리)은 이 글에서 완성하도록 하겠습니다.

구현 프로세스는 대충: 마지막 사진은 기본적으로 표시되지 않지만 실제로 존재합니다.빈 영역에서 인접한 그림을 클릭한 다음(빈 영역의 그림만 클릭하고 유효함) 이후에 그림의 움직임을 실현합니다. 클릭 후 빈칸 교체 2번째 이동 후 최종 총합 그림의 조합이 주어진 최종 그림과 같으면 퍼즐 성공 알림창이 뜬다!

사실, 요약은 지식의 배열입니다. 배열의 좌표값 교환을 이용하여 사진의 교환을 보여주고, 사진이동(배열수교환)을 여러번 이용하여 가져온 최종지정사진(숫자순서지정)과 동일한지 확인해보세요!

특정 구현 방법: (코드 주석은 이미 매우 상세하며 이해하기 쉬운 논리에 따라 단계별로 주석 처리됩니다.)

댓글 영역에서 이해하지 못하는 것이 있으면 메시지를 남기거나 개인 메시지를 남길 수 있습니다. 기사에 코드, 논리 또는 부정확한 작성 오류가 있는 경우 저를 수정하십시오. 제 시간에 수정하고 배우겠습니다. 감사합니다!

조각을 클릭하는 효과를 얻으려면:

//지정된 위치에서 버튼을 이동시켜 여백 영역과 이미지를 교환하는 기능을 나타냅니다. 
    private void move(int imagebuttonId, int site) { 
//행과 열이 있는 선택된 이미지를 판단하는데, 판단 방법은 나머지 방법 
        int sitex=site/imageX; 
        int sitey=site%imageY; 
        //빈 영역의 좌표 
        가져오기 int blankx=blankSwap/imageX; 
        int blanky=blankSwap%imageY; 
        //이미지가 이동하기 위한 두 가지 조건 
        // 1. 같은 열에서 행수 빼기 절댓값은 1 2. 같은 열에서 행수 빼기 절댓값은 1 
        int x=Math.abs(sitex- blankx); 
        int y=Math.abs(sitey-blanky); 
        if ((x == 0&&y==1)||(y==0&&x==1)){ 
            //이 이동 가능한 버튼 
            ImageButton 찾기 by id clickButton= findViewById(imagebuttonId); 
            clickButton.setVisibility(View.INVISIBLE) ; 
            // 빈 영역을 보기 위한 버튼
            ImageButton blackButton=findViewById(blankImgid); 
            //빈 영역을 이미지로 설정 
            blackButton.setImageResource(image[imageIndex[site]]); 
            //이동 사이에 보이지 않고 이동 후 컨트롤이 보이도록 설정 
            blackButton.setVisibility(View . VISIBLE); 
            // 
            이미지 
            위치를 저장하고 있는 배열에 자막을 변경하는 과정을 기록 
            합니다 
            . 이미지버튼아이디; 
        }

여러 번 후에 파편이 성공적으로 이동하는지 판단하는 논리적 효과를 실현하십시오.

//퍼즐 성공 여부 판단 
    private void JudgeGameOver() { 
     boolean loop=true;//플래그 비트 정의 
        for(int i=0;i<imageIndex.length;i++) { 
            if (imageIndex[i] != i ) { 
                loop = false; 
                break; 
            } 
        } 
            if(loop){ 
                //퍼즐 성공, 타이밍 중지 
                handler.removeMessages(1); 
                //퍼즐 성공 후 플레이어는 버튼을 계속 움직일 수 없습니다. 
                ib00 .setClickable(false); 
                ib01.setClickable(false); 
                ib02.setClickable(false); 
                ib10.setClickable(false);  
                ib11.setClickable(false);
                ib12.setClickable(false); 
                ib20.setClickable(false); 
                ib21.setClickable(false); 
                ib22.setClickable(false); 
                ib22.setImageResource(image[8]); 
                ib22.setVisibility(View.VISIBLE); 
                // 팝업 사용자 성공 대화 상자 
                AlertDialog.Builder builder=new AlertDialog.Builder(this); 
                builder.setMessage("축하합니다. 퍼즐이 성공했습니다! 남은 시간은 "+time+"초입니다.").setPositiveButton("확인",null); 
                builder .create().show(); 
            }

자바 전체 코드:

패키지 com.example.jigsaw; 

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

import android.annotation.SuppressLint; 
import android.media.Image; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 
import android.text.AlteredCharSequence; 
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;
//정해진 行每列图片的个数
private int imageX=3; 
    private int imageY=3; 
    //총 이미지 개수 
    private int imgCount=imageX*imageY; 
    //빈 영역의 위치 
    private int blankSwap=imgCount-1; 
    //빈 영역의 버튼 id 초기화 
    private int blankImgid=R.id.pt_id_02x02; 

//시간 변수 정의 
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(){ 
    @Override
    public void handleMessage(@NonNull Message msg) { 
        for(int i=0;i<imageIndex.length;i++){
     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( ) { 
            imageIndex [i]=i; 
        } 
        //20번 지정, 2개의 첨자에 해당하는 값을 무작위로 선택하여 교환 
        int rand1,rand2;
        for(int j=0;j<20;j++){ 
            //0-8의 값으로 무작위로 첨자를 생성합니다. 
            rand1=(int)(Math.random()*(imageIndex.length-1)); 
            // 임의로 생성된 두 번째 첨자는 첫 번째와 같을 수 없습니다. 
            do{ 
                rand2=(int)(Math.random()*(imageIndex.length-1)); 
                if(rand1!=rand2){ 
                    break; 
                } 
            } true); 
            //두 개의 첨자에 해당 값을 
            교환 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(이미지[imageIndex[4]]); 
        ib12.setImageResource(이미지[imageIndex[5]]); 
        ib20.setImageResource(이미지[imageIndex[6]]); 
        ib21.setImageResource(이미지[imageIndex[7]]); 
        ib22.setImageResource(이미지[imageIndex[8]]); 
    } 
// 
    전용 무효 스왑(int rand1, int rand2) { 
        int temp=imageIndex[rand1]; 
        이미지인덱스[rand1]=이미지인덱스[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(보기 보기) { 
        int id=view.getId(); 
        switch (id){ 
            case R.id.pt_id_00x00: 
                move(R.id.pt_id_00x00,0); 
                부서지다; 
                부서지다; 
            케이스 R.id.pt_id_00x02:
            케이스 R.id.pt_id_00x01:
                move(R.id.pt_id_00x01,1); 
                부서지다;
                move(R.id.pt_id_00x02,2); 
                부서지다; 
            케이스 R.id.pt_id_01x00: 
                이동(R.id.pt_id_01x00,3); 
                부서지다; 
            케이스 R.id.pt_id_01x01: 
                이동(R.id.pt_id_01x01,4); 
                부서지다; 
            케이스 R.id.pt_id_01x02: 
                이동(R.id.pt_id_01x02,5); 
                부서지다; 
            케이스 R.id.pt_id_02x00: 
                이동(R.id.pt_id_02x00,6); 
                부서지다; 
            케이스 R.id.pt_id_02x01: 
                이동(R.id.pt_id_02x01,7); 
            케이스 R.id.pt_id_02x02: 
                이동(R.id.pt_id_02x02,8);
                break; 
        } 
    } 
//버튼을 지정된 위치로 이동시켜 빈 영역과 이미지를 교환하는 기능을 
    나타냄 private void move(int imagebuttonId, int site) { 
//행과 열이 있는 선택된 이미지를 판단, 판단 method is pass 나머지를 찾는 방법 
        int sitex=site/imageX; 
        int sitey=site%imageY; 
        //빈 영역의 좌표 구하기 
        int blankx=blankSwap/imageX; 
        int blanky=blankSwap%imageY; 
        //두 가지 조건 for images to move 
        // ​​1. 같은 행에서 열 수 빼기 절댓값은 1, 2. 같은 열에서 행 수 빼기 절댓값은 1 
        int x= Math.abs(sitex-blankx); 
        int y=Math.abs(sitey-blanky); 
        if((x == 0&&y==1)||(y==0&&x==1)){ 
            clickButton.setVisibility(View.INVISIBLE); 
            // id로 이동 가능한 버튼 찾기
            ImageButton clickButton=findViewById(imagebuttonId); 
            //빈 영역의 버튼 보기 
            ImageButton blackButton=findViewById(blankImgid); 
            //빈 영역을 이미지로 설정 
            blackButton.setImageResource(image[imageIndex[site]]); 
            //Invisible 이동 사이 이동 후 컨트롤이 보이도록 설정 
            blackButton.setVisibility(View.VISIBLE); 
            //코너 마크를 이미지 위치를 저장하는 배열로 변경하는 과정 기록 
            swap(site,blankSwap); 
            //업데이트 새로운 빈 영역의 위치가 전달된 위치와 같음 클릭 버튼의 위치 
            blankSwap=site; 
            blankImgid=imagebuttonId; 
        } 
//이동이 완료된 후 직소 퍼즐 게임이 완료 
되었는지 판단 
        JudgeGameOver() 
    ; 직소 퍼즐이 성공했습니다 
    private void JudgeGameOver() {
     boolean loop=true;//플래그 정의 
                ib21.setClickable(false); 
        for(int i=0;i <imageIndex.length; i++) {
            if (imageIndex[i] != i) { 
                loop = false; 
                break; 
            } 
        } 
            if(loop){ 
                //퍼즐이 성공하면 타이밍을 멈춥니다 
                . handler.removeMessages(1); 
                //퍼즐이 성공하면 플레이어는 버튼을 
                계속 이동 
                하는 
                것이 
                금지 
                됩니다 
                . 
                ib20.setClickable(false) 
                ;setClickable(false); 
                ib22.setImageResource(image[8]); 
                ib22.setVisibility(View.VISIBLE); //AlertDialog.Builder 
                builder 
                =new AlertDialog.Builder(this); 
                builder.setMessage( "축하합니다. 퍼즐 성공했습니다! 시간은 "+time+"초입니다.").setPositiveButton("Confirm",null); 
                builder.create().show(); 
            } 
       // } 

    } 
//퍼즐 게임이 다시 시작 됩니다. 
    public void restart(View view) ) { 
        //직소 퍼즐이 다시 시작되어 플레이어가 조각을 이동할 수 
        있습니다. 
        ib00.setClickable(true); ib01.setClickable(true); 
        ib02.setClickable(true); 
        ib10.setClickable(true);
        ib11.setClickable(true); 
        ib20.setClickable(true); 
        ib21.setClickable(true); 
        ib22.setClickable(true); 
        //퍼즐 중단 
ruptRandpm(); 

        handler.removeMessages(1); 
        //시간을 0으로 재설정 , 그리고 re-⏲ 
        time=0; 
        timeTv.setText("Time: "+time+" seconds"); 
        handler.sendEmptyMessageDelayed(1,1000); 

    } 
} 
스크린샷 효과:

 

추천

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