用Android Studio做一个超好玩的拼图游戏( 七 )


实现效果:
4、拼图游戏碎片位置切换
我们完成乱序后,这时候拼图碎片还不能移动,所以我们要设置点击事件,来移动拼图 。
拼图移动的规则也要注意一下:只有和空白区域在同一行或者同一列相邻的拼图才能移动,只要知道了这个逻辑,实现起来就不难了 。
|我们来编写九个图片按钮的()方法 |
|–|–|
这里因为九个id不同的点击事件的逻辑相同,所以我们使用 语句来编写,根据它们的id来执行移动,按照从左到右、从上到下的顺序进行了case设置 。移动我们定义了move()函数,将它单独封装成了一个方法,下面就会讲到 。点击事件的代码如下:
public void onClick(View view) {int id = view.getId();//九个按钮执行的点击事件的逻辑应该是相同的,如果有空格在周围,可以改变图片显示的位置,否则点击事件不响应switch (id) {case R.id.pt_ib_00x00:move(R.id.pt_ib_00x00,0);break;case R.id.pt_ib_00x01:move(R.id.pt_ib_00x01,1);break;case R.id.pt_ib_00x02:move(R.id.pt_ib_00x02,2);break;case R.id.pt_ib_01x00:move(R.id.pt_ib_01x00,3);break;case R.id.pt_ib_01x01:move(R.id.pt_ib_01x01,4);break;case R.id.pt_ib_01x02:move(R.id.pt_ib_01x02,5);break;case R.id.pt_ib_02x00:move(R.id.pt_ib_02x00,6);break;case R.id.pt_ib_02x01:move(R.id.pt_ib_02x01,7);break;case R.id.pt_ib_02x02:move(R.id.pt_ib_02x02,8);break;}}
|我们来编写九个图片按钮的move()方法 |
|–|–|
先定义变量,是每行的图片个数,是每列的图片个数,是图片的总数目,也就是9个 。是空白区域的位置,就是8,这里的位置我们还是按照从左到右、从上到下的顺序排列的,第一张图片的位置是0,对照九宫格应该理解了吧 。
就是空白区域的按钮id,我们这里直接固定了R.id.,就是第九个图片按钮,它一直是空白区域!
//每行的图片个数private int imageX = 3;//每列的图片个数private int imageY = 3;//图片的总数目private int imgCount = imageX*imageY;//空白区域的位置private int blankSwap = imgCount-1;//初始化空白区域的按钮idprivate int blankImgid = R.id.pt_ib_02x02;
定义完要用到的变量,我们来写move方法,这里我每句都写上了注释,这里就不再赘述了 。
强调几点:
可以移动的条件有两个:
1.在同一行,列数相减,绝对值为1,可移动
2.在同一列,行数相减,绝对值为1,可以移动两个参数: 是被选中的图片的id,site是该图片在9宫格的位置(0-8)将移动后的图片按钮设为不可见的,即显示为空白区域移动之前是不可见的,移动之后将图标按钮设置为可见进行移动后将改变角标的过程记录到存储图片位置的数组当中
/*表示移动指定位置的按钮的函数,将图片和空白区域进行交换*///imagebuttonId是被选中的图片的id,site是该图片在9宫格的位置(0-8)private void move(int imagebuttonId, int site) {//判断选中的图片在第几行,imageX为3,所以进行取整运算int sitex = site / imageX;//判断选中的图片在第几列,imageY为3,所以进行取模运算int sitey = site % imageY;//获取空白区域的坐标,blankx为行坐标,blanky为列坐标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)){//通过id,查找到这个可以移动的按钮ImageButton clickButton = findViewById(imagebuttonId);//将这个选中的图片设为不可见的,即显示为空白区域clickButton.setVisibility(View.INVISIBLE);//查找到空白区域的按钮ImageButton blankButton = findViewById(blankImgid);//将空白区域的按钮设置为图片,image[imageIndex[site]就是刚刚选中的图片,因为这在上面disruptRandom()设置过blankButton.setImageResource(image[imageIndex[site]]);//移动之前是不可见的,移动之后将控件设置为可见blankButton.setVisibility(View.VISIBLE);//将改变角标的过程记录到存储图片位置的数组当中swap(site,blankSwap);//新的空白区域位置更新等于传入的点击按钮的位置blankSwap = site;//新的空白图片id更新等于传入的点击按钮的idblankImgid = imagebuttonId;}}