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 :