安卓开发 从入门到转业 (四) 拼图游戏

时间改变的实现

在 MainActivity.java 中的 onCreate 函数中添加如下内容:

//一进来每隔1s就发一条空消息出去,接收到这个空消息并让TextView发生改变,形成计数器的效果
//延迟1s发送一条空消息:发送消息的编号是1,延迟时间为1000ms=1s
handler.sendEmptyMessageDelayed(1,1000);

之后在 onCreate 函数外添加如下内容:

//定义计数时间的变量
int time=0;

//消息通信机制,重写handleMessag方法用来接收消息,形成时间累计的效果
Handler handler=new Handler(){
    @Override
    public void handleMessage(@NonNull Message msg) {
        if(msg.what==1){
            time++;
            timeTv.setText("时间:"+time+"秒");
            handler.sendEmptyMessageDelayed(1,1000);
        }
    }
};

时间变化的情况有两种,一是当拼图游戏完成的时候时间要停止,二是重新开始的时候要重新计时,现在先实现点击重新开始按钮时重新计时:

public void restart(View view) {
    //中断之前的消息
    handler.removeMessages(1);
    //将时间重新归零并且重新开始计时
    time=0;
    timeTv.setText("时间:"+time+"秒");
    handler.sendEmptyMessageDelayed(1,1000);
}

拼图打乱显示

思路:通过数组的随机排位来使图片随机排列

首先声明一些变量:

//存放碎片的数组,便于统一管理
private int[]image={R.mipmap.img_00x00,R.mipmap.img_00x01,R.mipmap.img_00x02,R.mipmap.img_01x00,R.mipmap.img_01x01,R.mipmap.img_01x02,R.mipmap.img_02x00,R.mipmap.img_02x01,R.mipmap.img_02x02};

//声明一个图片数组的下标数组,随机排列这个数组
private int[]imageIndex=new int[image.length];

接下来写一个打乱的方法,使得 onCreate 一进入就显示打乱的数组。
首先打乱角标,接着把乱序的角标设置到ImageButton中,保证一进入就是打乱的状态,具体代码如下:

    //随机打乱数组中的元素,以不规则的形式进行图片显示
    private void disruptRandom() {
        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)); //Math.random()生成的是0—1之间的随机数,再乘以最大值减去最小值(即8-0),最后整体加上最小值0
            //第二次随机生成的角标不能和第一次相同,如果相同就不方便交换
            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[rand2]=imageIndex[rand1];
        imageIndex[rand1]=temp;
    }

碎片位置切换

碎片移动的条件:空白区域只能和向同行或者相同列上并且是相邻的图片进行移动,否则不能完成。

需要判断空白位置和其他图的位置是否在同一行或同一列中。

移动的过程写在 onClick 中:

    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;
        }
    }


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值