其中 move 函数具体实现过程:
/*表示移动指定位置的按钮的函数:将图片和空白区域进行交换*/
private void move(int imageButtonId, int site) {
//判断选中的图片在第几行,取整来判断
int sitex=site / imageX;
//判断选中的图片在第几列,趋于来判断
int sitey=site % imageY;
//获取空白区域的坐标
int blackx=blackSwap / imageX;
int blacky=blackSwap % imageY;
//可以移动的条件
//1.在同一行,列数相减绝对值为1,可以移动;2.在同一列,行数相减绝对值为1,可以移动。
int x=Math.abs(sitex-blackx);
int y=Math.abs(sitey-blacky);
if((x==0&&y==1)||(x==1&&y==0)){
//通过id查找到这个可以移动的按钮
ImageButton clickButton=findViewById(imageButtonId);
//该可移动按钮不在显示图片
clickButton.setVisibility(View.INVISIBLE);
//查找空白区域的按钮
ImageButton blackButton=findViewById(blackImgid);
//将空白按钮设置为显示图片
blackButton.setImageResource(image[imageIndex[site]]);
//移动之前是不可见的,移动之后将控件设置为可见
blackButton.setVisibility(View.VISIBLE);
//上面的交换并没有存在数组之中,要调用swap函数,将改变角标的过程记录在存储图片位置的数组当中
swap(site,blackSwap);
//新的空白区域位置更新
blackSwap=site;
blackImgid=imageButtonId;
}
}
目前为止效果展示:
拼图成功的条件
每次拼图结束之后,要判断一下当前拼图顺序是否满足正确顺序。
这里是判断存放图片角标的数组的顺序。
/*判断拼图是否成功*/
private void judgeGameOver() {
boolean loop=true; //定义标志位
//对存放图片角标的数组imageIndex进行判断
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);
AlertDialog dialog = builder.create();
dialog.show();
}
}
游戏重新开始
现在需要将拼图重新打乱,重新打乱的函数 disruptRandom() 在前面已经写好,直接引用即可。
但是之前游戏成功已经禁止拼图继续移动,所以将打乱之前要恢复按钮可以移动的功能,同时还要还原被点击图片初始化的样子,具体代码如下:
/*重新开始按钮的点击事件*/
public void restart(View view) {
//将状态还原
restore();
//将拼图重新打乱
disruptRandom();
//中断之前的消息
handler.removeMessages(1);
//将时间重新归零并且重新开始计时
time=0;
timeTv.setText("时间:"+time+"秒");
handler.sendEmptyMessageDelayed(1,1000);
}
private void restore() {
//拼图游戏重新开始,允许玩家重新触碰按钮
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);
//还原被点击的图片按钮变成初始化的模样
//最后一次选中的空白区域显示出来
ImageButton clickButton=findViewById(blackImgid);
clickButton.setVisibility(View.VISIBLE);
//定义一个新的图片按钮,设置为第九个,让其隐藏(默认隐藏第九张图片)
ImageButton blackBtn=findViewById(R.id.pt_ib_02x02);
blackBtn.setVisibility(View.INVISIBLE);
//初始化空白区域的按钮id
blackImgid=R.id.pt_ib_02x02;
blackSwap=imageCount-1;
}
}