Android實戰開發——拼圖遊戲
阿新 • • 發佈:2020-07-12
時間改變的實現
在 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
中: