1. 程式人生 > 實用技巧 >Android實戰開發——拼圖遊戲

Android實戰開發——拼圖遊戲

時間改變的實現

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 中: