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


这是定义的的代码:
//定义发送和处理消息的对象handlerHandler handler = new Handler(){@Override//重写handleMessage方法,根据msg中what的值判断是否执行后续操作public void handleMessage(Message msg) {if (msg.what==1) {time++;timeTv.setText("时间 : "+time+" 秒");//指定延时1000毫秒后发送参数what为1的空信息handler.sendEmptyMessageDelayed(1,1000);}}};
这是在方法里面定义的一条消息
handler.sendEmptyMessageDelayed(1,1000);
我们来看下运行效果:
除此之外,我们还需要在重新开始游戏后进行重新计时,这里又要怎么实现呢?
这里我们只需要在方法里面先停止的消息发送,保证时间不会再继续+1了,然后将时间重新归0,显示当前时间,最后每隔1s发送参数what为1的消息msg,这样就实现了重新开始计时,代码如下:
/* 重新开始按钮的点击事件*/public void restart(View view) {//停止handler的消息发送handler.removeMessages(1);//将时间重新归0,并且重新开始计时time = 0;timeTv.setText("时间 : "+time+" 秒");//每隔1s发送参数what为1的消息msghandler.sendEmptyMessageDelayed(1,1000);}
点击重新开始后的实现效果:
至此,我们的计时功能就实现了!
3、拼图游戏打乱显示
首先定义一个image数组,里面存放每张碎片(九宫格图片)的id,int型数组是可以存放图片的id的,但是不能存放图片,注意这个区别 。
//将每张碎片的id存放到数组中,便于进行统一的管理,int型数组存放的肯定是int型变量private int[]image = {R.mipmap.img_xiaoxiong_00x00,R.mipmap.img_xiaoxiong_00x01,R.mipmap.img_xiaoxiong_00x02,R.mipmap.img_xiaoxiong_01x00,R.mipmap.img_xiaoxiong_01x01,R.mipmap.img_xiaoxiong_01x02,R.mipmap.img_xiaoxiong_02x00,R.mipmap.img_xiaoxiong_02x01,R.mipmap.img_xiaoxiong_02x02};
再声明一个数组,它来存放上面图片数组的下标,一共九张图片,所以下标为0-8,它存储的也就是0-8 。我们为了让上面九张图片被打乱,所以,这里的下标等下会被打乱 。
//声明上面图片数组下标的数组,随机排列这个数组,九张图片,下标为0-8private int[]imageIndex = new int[image.length];
|下面我们写一个函数( ),来实现进入游戏拼图就打乱显示的效果|
|-------------------------------------------|–|
先给下标数组每个元素赋值,下标是i,值就为i,就是[i] = i 。
//给下标数组每个元素赋值,下标是i,值就为ifor (int i = 0; i < imageIndex.length; i++) {imageIndex[i] = i;}
然后进行20次for循环,随机选择两个角标对应的值进行交换 。先定义两个角标rand1和rand2,
rand1 = (int)(Math.()*(.-1));这里我来重点解释一下:
Math.()产生的随机数为0~1之间的小数 此处说的0~1是包含左不包含右,即包含0不包含1!
ps:我在这里卡了2h至少,因为这个小细节点没注意到,所以一定不能想当然,要查资料以求准确 。
Math.()的值域为[0,1),然后.-1就是8其实,*8那就是[0,8),再int取整最终值域为{0,1,2,3,4,5,6,7},因为int取整只会取整数位,不会四舍五入!
再用do-while循环实现了rand2的生成,之所以在do-while里面生成rand2,是为了判断二次生成的角标和第一次是否相同,不同则break立刻跳出循环,执行swap交换;若第二次生成的与第一次相同,则重新进入do-while循环生成rand2,这部分代码如下:
//规定20次,随机选择两个角标对应的值进行交换int rand1,rand2;for (int j = 0; j