Projet Android --- jeu de puzzle (ci-dessous)

Dans la continuité de l'article précédent, l'article précédent a complété le minutage dans le jeu et l'arrangement aléatoire automatique des fragments de programme. Cet article complétera les parties restantes (le mouvement des fragments et la logique de réussite du puzzle)

Le processus de mise en place est grosso modo : la dernière photo n'est pas affichée par défaut, mais elle existe bien.Cliquez sur l'image adjacente dans la zone vide (seule l'image dans la zone vide est cliquée et valide) puis réalisez le mouvement de l'image après en cliquant et l'échange de la zone vide. Après le deuxième coup, si la combinaison de l'image totale finale est la même que l'image finale donnée, une boîte de dialogue indiquant le succès du puzzle apparaîtra !

En fait, le résumé est un tableau de connaissances. Utilisez l'échange de valeurs de coordonnées du tableau pour montrer l'échange d'images, et utilisez le mouvement de l'image plusieurs fois (l'échange du nombre de tableaux) pour voir s'il est identique à l'image désignée finale importée (ordre numérique spécifié) !

La méthode d'implémentation spécifique : (les commentaires de code sont déjà très détaillés, et sont commentés pas à pas selon la logique, ce qui est facile à comprendre)

Si vous ne comprenez pas quelque chose dans la zone de commentaire, vous pouvez me laisser un message ou un message privé. Si l'article contient des erreurs de code, de logique ou d'écriture inexactes, veuillez me corriger. Je corrigerai et j'apprendrai à temps, merci !

Pour obtenir l'effet de cliquer sur les fragments :

//Représente la fonction de déplacement du bouton à l'emplacement spécifié, en échangeant l'image avec la zone 
    vide private void move(int imagebuttonId, int site) { 
//Jugez l'image sélectionnée dans quelle ligne et colonne, la méthode de jugement passe par le méthode du reste 
        int sitex=site/imageX; 
        int sitey=site%imageY; 
        //Obtenir les coordonnées de la zone vierge 
        int blankx=blankSwap/imageX; 
        int blanky=blankSwap%imageY; 
        //Deux conditions pour que les images se déplacent 
        // 1. Dans le même La valeur absolue de la soustraction du nombre de lignes et de colonnes est 1. 2. Dans la même colonne, la valeur absolue de la soustraction du nombre de lignes est 1 
        int x=Math.abs(sitex- blankx); 
        int y=Math.abs(sitey-blanky); 
        if ((x == 0&&y==1)||(y==0&&x==1)){ 
            //Trouver ce bouton mobile 
            ImageButton par id clickButton= findViewById(imagebuttonId); 
            clickButton.setVisibility(View.INVISIBLE) ; 
            // bouton pour afficher la zone vide
            ImageButton blackButton=findViewById(blankImgid); 
            //Définit la zone vide sur l'image 
            blackButton.setImageResource(image[imageIndex[site]]); 
            //Invisible entre les mouvements, après le mouvement, définit le contrôle pour qu'il soit visible 
            blackButton.setVisibility(View . VISIBLE); 
            //Enregistrer le processus de modification du sous-titre dans le tableau qui stocke l'emplacement de l'image 
            swap(site,blankSwap); 
            //La nouvelle mise à jour de la position de la zone vide est égale à la position du bouton de clic entrant 
            blankSwap=site; 
            blankImgid= ID de bouton d'image ; 
        }

Réalisez l'effet logique de juger si les débris se déplacent avec succès après plusieurs fois :

//Jugez si le puzzle est réussi 
    private void JudgeGameOver() { 
     boolean loop=true;//Définissez le bit de drapeau 
        for(int i=0;i<imageIndex.length;i++) { 
            if (imageIndex[i] != i ) { 
                loop = false; 
                break; 
            } 
        } 
            if(loop){ 
                //Le puzzle est réussi, arrêtez le minutage 
                handler.removeMessages(1); 
                //Une fois le puzzle réussi, il est interdit au joueur de continuer à déplacer le bouton 
                ib00 .setClickable(faux); 
                ib01.setClickable(faux) ; 
                ib02.setClickable(faux); 
                ib10.setClickable(faux);  
                ib11.setClickable(faux);
                ib12.setClickable(faux); 
                ib20.setClickable(false); 
                ib21.setClickable(false); 
                ib22.setClickable(false); 
                ib22.setImageResource(image[8]); 
                ib22.setVisibility(View.VISIBLE); 
                // popup Boîte de dialogue de réussite de l'utilisateur 
                AlertDialog.Builder builder=new AlertDialog.Builder(this); 
                builder.setMessage("Félicitations, le puzzle est réussi ! Votre temps est de "+time+" secondes").setPositiveButton("Confirmer",null); 
                builder .create().show(); 
            }

Code total Java :

package com.example.jigsaw ; 

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

importer android.annotation.SuppressLint ; 
importer android.media.Image ; 
importer android.os.Bundle ; 
importer android.os.Handler ; 
importer android.os.Message ; 
importer android.text.AlteredCharSequence ; 
importer android.view.View ; 
importer android.widget.Button ; 
importer android.widget.ImageButton ; 
importer android.widget.TextView ; 

la classe publique MainActivity étend AppCompatActivity { 
ImageButton ib00,ib01,ib02,ib10,ib11,ib12,ib20,ib21,ib22; 
Bouton de redémarrageBtn ; 
TextView timeTv ;
//定义每行每列图片的个数
private int imageX=3 ; 
    private int imageY=3 ; 
    //nombre total d'images 
    private int imgCount=imageX*imageY ; 
    //position de la zone vide 
    private int blankSwap=imgCount-1 ; 
    //initialise l'identifiant du bouton de la zone vide 
    private int blankImgid=R.id.pt_id_02x02 ; 

//Définir la variable de temps 
int time = 0 ; 
//Stocker le tableau de fragments pour la gestion unifiée 
    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} ; 
    // Déclare un tableau d'images Tableau d'indices, organiser aléatoirement ce tableau 
    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: "+time+" seconds"); 
         handler.sendEmptyMessageDelayed(1,1000); 
     } 
    } 
} ; 
    @Override 
    protected void onCreate(Bundle enabledInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 
        initView(); 
        //perturber les fragments 
        disruptRandpm(); 
        handler.sendEmptyMessageDelayed(1,1000); 
    } 
//perturber au hasard 
    le vide privé irrégulier disruptRandpm( ) { 
            imageIndex [i]=i; 
        } 
        //Spécifier 20 fois, sélectionner au hasard les valeurs correspondant aux deux indices à échanger 
        int rand1,rand2; 
        for(int j=0;j<20;j++){ 
            //Génère un indice au hasard, la valeur de 0-8 
            rand1=(int)(Math.random()*(imageIndex. length-1)); 
            //Le deuxième indice généré aléatoirement ne peut pas être le même que la première fois 
            do{ 
                rand2=(int)(Math.random()*(imageIndex.length-1)); 
                if(rand1! =rand2 ){ 
                    break; 
                } 
            }while (true); 
            //Échange les valeurs correspondantes sur les deux marques d'angle 
            swap(rand1,rand2); 
        } 
        //Arrangement aléatoire sur le contrôle spécifié 
        ib00.setImageResource(image[imageIndex[0] ]); 
        ib01.setImageResource(image[indeximage[1]]);
        ib02.setImageResource(image[indeximage[2]]);  
        ib10.setImageResource(image[imageIndex[3]]);
        ib11.setImageResource(image[indeximage[4]]); 
        ib12.setImageResource(image[indeximage[5]]); 
        ib20.setImageResource(image[indeximage[6]]); 
        ib21.setImageResource(image[indeximage[7]]); 
        ib22.setImageResource(image[indeximage[8]]); 
    } 
//交换
    échange vide privé (int rand1, int rand2) { 
        int temp=imageIndex[rand1] ; 
        imageIndex[rand1]=imageIndex[rand2] ; 
        imageIndex[rand2]=temp; 
    } 

    privé 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(Afficher la vue) { 
        int id=view.getId(); 
        switch (id){ 
            case R.id.pt_id_00x00 : 
                move(R.id.pt_id_00x00,0) ; 
                Pause; 
            cas R.id.pt_id_00x01 :
                déplacer(R.id.pt_id_00x01,1); 
                Pause;
                Pause; 
            cas R.id.pt_id_00x02 :
                déplacer(R.id.pt_id_00x02,2); 
                Pause; 
            cas R.id.pt_id_01x00 : 
                move(R.id.pt_id_01x00,3) ; 
                Pause; 
            cas R.id.pt_id_01x01 : 
                move(R.id.pt_id_01x01,4) ; 
                Pause; 
            cas R.id.pt_id_01x02 : 
                move(R.id.pt_id_01x02,5) ; 
                Pause; 
            cas R.id.pt_id_02x00 : 
                move(R.id.pt_id_02x00,6) ; 
                Pause; 
            cas R.id.pt_id_02x01 : 
                déplacer(R.id.pt_id_02x01,7) ; 
            cas R.id.pt_id_02x02 : 
                move(R.id.pt_id_02x02,8) ;
                break ; 
        } 
    } 
//Représente la fonction de déplacement du bouton à l'emplacement spécifié, échangeant l'image avec la zone 
    vide private void move(int imagebuttonId, int site) { 
//Juge l'image sélectionnée dans quelle ligne et colonne, le jugement méthode est passée La méthode pour trouver le reste 
        int sitex=site/imageX; 
        int sitey=site%imageY; 
        //Obtenir les coordonnées de la zone vide 
        int blankx=blankSwap/imageX; 
        int blanky=blankSwap%imageY; 
        //Deux conditions pour que les images se déplacent 
        // 1. Dans la même ligne, la valeur absolue de la soustraction du nombre de colonnes est 1 ; 2. Dans la même colonne, la valeur absolue de la soustraction du nombre de lignes est 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); 
            // Trouver ce bouton mobile par id
            ImageButton clickButton=findViewById(imagebuttonId); 
            //Afficher le bouton dans la zone vide 
            ImageButton blackButton=findViewById(blankImgid); 
            //Définir la zone vide sur l'image 
            blackButton.setImageResource(image[imageIndex[site]]); 
            //Invisible entre les mouvements, après le déplacement, définissez le contrôle pour qu'il soit visible 
            blackButton.setVisibility(View.VISIBLE); 
            //Enregistrer le processus de modification de la marque d'angle dans le tableau qui stocke la position de l'image 
            swap(site,blankSwap); 
            //La mise à jour de la nouvelle position de la zone vide est égal à l'emplacement passé du bouton de clic 
            blankSwap=site; 
            blankImgid=imagebuttonId; 
        } 
//Jugez si le jeu de puzzle est terminé une fois le déplacement terminé 
        . JudgeGameOver(); 
    } 
//Jugez si le puzzle est réussi 
    private void JudgeGameOver() {
     boolean loop=true;//Définissez le drapeau  
        pour(int i=0;i <imageIndex. length; i++) {
            if (imageIndex[i] != i) { 
                loop = false; 
                break; 
            } 
        } 
            if(loop){ 
                //Le puzzle est réussi, arrêtez le minutage 
                handler.removeMessages(1); 
                // Une fois le puzzle réussi, il est interdit au joueur de continuer à déplacer le bouton 
                ib00.setClickable(false); 
                ib01.setClickable(false); 
                ib02.setClickable(false); 
                ib10.setClickable(false); 
                ib11.setClickable( faux); 
                ib12.setClickable(faux); 
                ib20.setClickable(faux); 
                ib21.setClickable(faux);
                ib22.setClickable(false); 
        ib10.setClickable(true);
                ib22.setImageResource(image[8]); 
                ib22.setVisibility(View.VISIBLE); 
                // 
                Félicitations 
                , le puzzle est réussi ! Votre temps est "+ temps +" secondes").setPositiveButton("Confirmer",null); 
                builder.create().show(); 
            } 
       // } 
    } 
//Jigsaw puzzle restart 
    public void restart(View view ) { 
        // le puzzle redémarre, permettant au joueur de déplacer les pièces 
        ib00.setClickable(true); 
        ib01.setClickable(true); 
        ib02.setClickable(true); 
        ib12.setClickable(true);

        ib11.setClickable(true); 
        ib20.setClickable(true); 
        ib21.setClickable(true); 
        ib22.setClickable(true); 
        //puzzle 
disrupt disruptRandpm(); 

        handler.removeMessages(1); 
        //time reset to 0 , et re-⏲ 
        time=0 ; 
        timeTv.setText("Time : "+time+" secondes" ); 
        handler.sendEmptyMessageDelayed(1,1000); 

    } 
} 
Effet de capture d'écran :

 

Je suppose que tu aimes

Origine blog.csdn.net/Abtxr/article/details/126228834
conseillé
Classement