承接上篇文章,上篇文章完成了游戏中的计时和进入程序碎片的自动乱序排列,本次文章将完成剩余的部分(碎片的移动和拼图的成功逻辑)

实现流程大概:默认最后一张照片不显示,但实际存在,点击空白区域相邻的图片(也只有该空白区域的图片被点击有效)然后实现图片点击后的移动和空白区域交换,进过数次移动之后若最终的总图片组合起来和给出的最终图片相同则弹出拼图成功的提示框!

其实总结就一个数组知识。用数组的坐标值交换来呈现图片的交换,用数次图片运动后(数次数组的交换)看是否与引入的最终指定图片(规定的数值顺序)是否相同!

具体实现方法:(代码注释已经非常非常详细了,并且是按照一步一步的逻辑步走注释的,很容易理解)

如果有不明白理解的评论区可以留言或者私信我,若文章有代码,逻辑,编写错误不准确还请各位指正,我及时改正学习,谢谢各位!

实现点击碎片的效果:

//表示移动指定位置的按钮的函数,将图片和空白区域交换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.在同一列,行数相减绝对值为1int x=Math.abs(sitex-blankx);int y=Math.abs(sitey-blanky);if((x == 0&&y==1)||(y==0&&x==1)){//通过id查找到这个可以移动的按钮ImageButton clickButton=findViewById(imagebuttonId);clickButton.setVisibility(View.INVISIBLE);//查看空白区域的按钮ImageButton blackButton=findViewById(blankImgid);//将空白区域设置图片blackButton.setImageResource(image[imageIndex[site]]);//移动之间不可见,移动之后,将控件设置为可见blackButton.setVisibility(View.VISIBLE);//将改变角标的过程记录到存储图片位置的数组当中swap(site,blankSwap);//新的空白区域位置更新等于传入的点击按钮的位置blankSwap=site;blankImgid=imagebuttonId;}

实现判断碎片数次移动之后是否成功的逻辑效果:

//判断拼图是否成功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();}

Java总代码:

package 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;public class MainActivity extends AppCompatActivity {
ImageButton ib00,ib01,ib02,ib10,ib11,ib12,ib20,ib21,ib22;
Button restartBtn;
TextView timeTv;
//定义每行每列图片的个数
private int imageX=3;private  int imageY=3;//图片总个数private int imgCount=imageX*imageY;//空白区域的位置private  int blankSwap=imgCount-1;//初始化空白区域的按钮idprivate 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(){@Overridepublic void handleMessage(@NonNull Message msg) {if (msg.what==1){time++;timeTv.setText("时间:"+time+" 秒");handler.sendEmptyMessageDelayed(1,1000);}}
};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();//打乱碎片disruptRandpm();handler.sendEmptyMessageDelayed(1,1000);}
//随机打乱不规则private void disruptRandpm() {for(int i=0;i<imageIndex.length;i++){imageIndex[i]=i;}//规定20次,随机选择两个角标对应的值进行交换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;}}while (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(image[imageIndex[4]]);ib12.setImageResource(image[imageIndex[5]]);ib20.setImageResource(image[imageIndex[6]]);ib21.setImageResource(image[imageIndex[7]]);ib22.setImageResource(image[imageIndex[8]]);}
//交换private void swap(int rand1, int rand2) {int temp=imageIndex[rand1];imageIndex[rand1]=imageIndex[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 view) {int id=view.getId();switch (id){case R.id.pt_id_00x00:move(R.id.pt_id_00x00,0);break;case R.id.pt_id_00x01:move(R.id.pt_id_00x01,1);break;case R.id.pt_id_00x02:move(R.id.pt_id_00x02,2);break;case R.id.pt_id_01x00:move(R.id.pt_id_01x00,3);break;case R.id.pt_id_01x01:move(R.id.pt_id_01x01,4);break;case R.id.pt_id_01x02:move(R.id.pt_id_01x02,5);break;case R.id.pt_id_02x00:move(R.id.pt_id_02x00,6);break;case R.id.pt_id_02x01:move(R.id.pt_id_02x01,7);break;case R.id.pt_id_02x02:move(R.id.pt_id_02x02,8);break;}}
//表示移动指定位置的按钮的函数,将图片和空白区域交换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.在同一列,行数相减绝对值为1int x=Math.abs(sitex-blankx);int y=Math.abs(sitey-blanky);if((x == 0&&y==1)||(y==0&&x==1)){//通过id查找到这个可以移动的按钮ImageButton clickButton=findViewById(imagebuttonId);clickButton.setVisibility(View.INVISIBLE);//查看空白区域的按钮ImageButton blackButton=findViewById(blankImgid);//将空白区域设置图片blackButton.setImageResource(image[imageIndex[site]]);//移动之间不可见,移动之后,将控件设置为可见blackButton.setVisibility(View.VISIBLE);//将改变角标的过程记录到存储图片位置的数组当中swap(site,blankSwap);//新的空白区域位置更新等于传入的点击按钮的位置blankSwap=site;blankImgid=imagebuttonId;}
//判断本次移动完成后,是否完成了拼图游戏judgeGameOver();}
//判断拼图是否成功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();}// }}
//拼图游戏重新开始public void restart(View view) {//拼图游戏重新开始,允许玩家移动碎片ib00.setClickable(true);ib01.setClickable(true);ib02.setClickable(true);ib10.setClickable(true);ib11.setClickable(true);ib12.setClickable(true);ib20.setClickable(true);ib21.setClickable(true);ib22.setClickable(true);//拼图打乱
disruptRandpm();handler.removeMessages(1);//时间重新归0,并且重新⏲time=0;timeTv.setText("时间:"+time+" 秒");handler.sendEmptyMessageDelayed(1,1000);}
}
截图效果:

Android项目---拼图小游戏(下)相关推荐

  1. Android项目---拼图小游戏(上)

    类似的小游戏大家肯定都接触过,进入程序,图片会无序排列,共九张乱序图片,需要移动到给出模板图片相同方为成功,在游戏进行的过程中会有时间在计时,当拼图成功时时间停止,点击重新开始,图片会重新打乱,时间重 ...

  2. android移动拼图小游戏的图片,利用ViewDragHelper轻松实现Android拼图游戏

    前言 最近一段时间看了一些介绍ViewDragHelper的博客,感觉这是一个处理手势滑动的神器,看完以后就想做点东西练练手,于是就做了这个Android拼图小游戏. 先上个效果图 demo.gif ...

  3. Android移动拼图小游戏

    XMl布局: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"androi ...

  4. android 美女拼图小游戏

    经过这十天的学习,感慨有许多 在第一天的实训中,了解到了两种容器:RelativeLayout(相对布局容器)和LinearLayout(线性布局容器),他们之间可以相互放,即容器能够存放容器,不过一 ...

  5. Android案例(1)——美女拼图小游戏

    视频地址: Android美女拼图小游戏 实现功能: (1)多个难度 第一关3*3. (2)倒计时 (3)图片切分 (4)图片位置变换 第一步: 在src下创建工具包com.imooc.game.ut ...

  6. android实现九宫格拼图小游戏

    贴一下效果图 接下来随便用一张图片就好 以下是全代码 自定义View GameView类 import android.content.Context; import android.graphics ...

  7. android自定义游戏闯关图,Android开发之儿时的回忆——拼图小游戏

    会写这篇文章完全是由于巧合,前几天路过天桥下的路边摊发现一个很熟悉的"老朋友",想必大家小时候也玩过这种滑块拼图吧. 儿时的印象--滑块拼图 哈哈,暴露年龄的东西,刚开始觉得很惊喜 ...

  8. Java项目之“拼图小游戏”

    文章目录 一.项目简介 二.游戏展示 三.程序设计 1. 创建游戏主界面( GameJFrame ) 2. 初始化界面 ( initJFrame ) 3. 初始化菜单 ( initJMenuBar ) ...

  9. JavaSE基础项目:拼图小游戏

    目录 学习资源: 源码和图片资源: 项目结构: 项目界面: 注册界面源码: 登录界面源码: 游戏界面源码: 学习资源: 视频资源: 黑马程序员拼图小游戏 源码和图片资源: 图片/源码资源: 百度网盘 ...

最新文章

  1. 三 volatile关键字
  2. c语言输入三个数判断等边三角形,随便输入三个数,看能否组成一个三角形
  3. win10 vscode 无法激活python 虚拟环境的解决办法
  4. 第十二周学习进度报告
  5. 通过asm动态构造class文件
  6. vtkpolydata图形着色
  7. react之路:使用immutable管理store中的数据
  8. 46 - 算法 - Leetcode-155-最小栈
  9. Ettus Research USRP B200/B210 simple case
  10. 移动端设备管理平台 atx server2实践
  11. VSeWSS更新文档
  12. Gradle、 Gradle Android Plugin 、 Build Tools之间关系
  13. python wps api_WPS API操作
  14. 问题记录-Access数据库运行查询语句需要输入参数
  15. 视频教程-java淘宝优惠券系统-Java
  16. 进阶项目(9)IIC通信协议程序设计讲解
  17. 无驱、代码自动植入:新一代软件保护锁——圣天诺LDK-HL
  18. win7计算机右边预览,如何在win7计算机上打开任务栏缩略图预览功能
  19. AXURE原型设计:数据可视化设计
  20. argc,**argv

热门文章

  1. Spine 实用技巧大全
  2. 企业为什么要上OA?
  3. php苹果支付订阅付费_比较订阅,按错误付费和咨询软件业务模型
  4. ideal springboot class not found 解决办法
  5. linkerd服务网格调研笔记
  6. MSSQLSERVER 2019修改数据库文件存放路径的简单实现
  7. 国外问卷调查所需准备
  8. sphinx在windows下的简单安装与使用
  9. Python爬虫 | 爬取高质量小姐姐照片
  10. 异步FIFO基本原理(基于Verilog的简单实现)