类似的小游戏大家肯定都接触过,进入程序,图片会无序排列,共九张乱序图片,需要移动到给出模板图片相同方为成功,在游戏进行的过程中会有时间在计时,当拼图成功时时间停止,点击重新开始,图片会重新打乱,时间重新开始计时!
实现步骤:1.拼图游戏绘制,2.拼图游戏打乱设置,3.拼图游戏碎片位置切换,4.拼图成功条件,5.拼图游戏重新开始
本次只实现步骤1和步骤2
实现过程中用到的部分知识,时间计时用到handler线程机制,图片的无序排列实现原理是将其以数值形式写入,然后以两两数值进行交换在放在对应的控件上!
已在代码段中进行了对应的注释,如果有不明白的可以评论区留言或者私信,若文章内容有错误不足,还请各位包涵,指正!
代码如下:
xml拼图布局代码:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity"> <TextView android:layout_marginTop="20dp" android:textColor="#FF0000" android:textSize="30sp" android:layout_gravity="center" android:id="@+id/pt_tv_time" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="时间:0" /> <LinearLayout android:layout_marginTop="20dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/pt_line1" android:layout_gravity="center" android:orientation="horizontal"> <ImageButton android:src="@drawable/pt_id_00x00" android:padding="0dp" android:id="@+id/pt_id_00x00" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onClick"/> <ImageButton android:src="@drawable/pt_id_00x01" android:padding="0dp" android:id="@+id/pt_id_00x01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onClick"/> <ImageButton android:src="@drawable/pt_id_00x02" android:padding="0dp" android:id="@+id/pt_id_00x02" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onClick"/> </LinearLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/pt_line2" android:layout_gravity="center" android:orientation="horizontal"> <ImageButton android:src="@drawable/pt_tv_01x00" android:padding="0dp" android:id="@+id/pt_id_01x00" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onClick"/> <ImageButton android:src="@drawable/pt_tv_01x01" android:padding="0dp" android:id="@+id/pt_id_01x01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onClick"/> <ImageButton android:src="@drawable/pt_tv_01x02" android:padding="0dp" android:id="@+id/pt_id_01x02" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onClick"/> </LinearLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/pt_line3" android:layout_gravity="center" android:orientation="horizontal"> <ImageButton android:src="@drawable/p1" android:padding="0dp" android:id="@+id/pt_id_02x00" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onClick"/> <ImageButton android:src="@drawable/p2" android:padding="0dp" android:id="@+id/pt_id_02x01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onClick"/> <ImageButton android:src="@drawable/p3" android:padding="0dp" android:id="@+id/pt_id_02x02" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onClick"/> </LinearLayout> <Button android:layout_marginTop="10dp" android:layout_gravity="center" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/pt_btn_restart" android:onClick="restart" android:text="重新开始"/> <ImageView android:layout_gravity="center" android:layout_marginTop="10dp" android:src="@drawable/yuantu" android:id="@+id/pt_iv" android:layout_width="210dp" android:layout_height="210dp"/> </LinearLayout>
activity功能实现代码:
package com.example.jigsaw; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import android.annotation.SuppressLint; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.View; import android.widget.Button; import android.widget.ImageButton; import android.widget.TextView; public class MainActivity extends AppCompatActivity { ImageButton ib00,ib01,ib02,ib10,ib11,ib12,ib20,ib21,ib22; Button restartBtn; TextView timeTv; //定义时间的变量 int time = 0; //存放碎片的数组,便于进行统一的管理 private int[]image={R.drawable.pt_id_00x00,R.drawable.pt_id_00x01,R.drawable.pt_id_00x02, R.drawable.pt_tv_01x00,R.drawable.pt_tv_01x01,R.drawable.pt_tv_01x02,R.drawable.p1,R.drawable.p2,R.drawable.p3}; //声明一个图片数组的下标数组,随机排列这个数组 private int[]imageIndex=new int[image.length]; Handler handler=new Handler(){ @Override public void handleMessage(@NonNull Message msg) { if (msg.what==1){ time++; timeTv.setText("时间:"+time+" 秒"); handler.sendEmptyMessageDelayed(1,1000); } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); //打乱碎片 disruptRandpm(); handler.sendEmptyMessageDelayed(1,1000); } //随机打乱不规则 private void disruptRandpm() { 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)); //第二次随机生成的角标,不能和第一次相同 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[rand1]=imageIndex[rand2]; imageIndex[rand2]=temp; } private void initView() { ib00=findViewById(R.id.pt_id_00x00); ib01=findViewById(R.id.pt_id_00x01); ib02=findViewById(R.id.pt_id_00x02); ib10=findViewById(R.id.pt_id_01x00); ib11=findViewById(R.id.pt_id_01x01); ib12=findViewById(R.id.pt_id_01x02); ib20=findViewById(R.id.pt_id_02x00); ib21=findViewById(R.id.pt_id_02x01); ib22=findViewById(R.id.pt_id_02x02); timeTv=findViewById(R.id.pt_tv_time); restartBtn=findViewById(R.id.pt_btn_restart); } public void onClick(View view) { } public void restart(View view) { //拼图打乱 handler.removeMessages(1); //时间重新归0,并且重新⏲ time=0; timeTv.setText("时间:"+time+" 秒"); handler.sendEmptyMessageDelayed(1,1000); } } 效果截图: