当前位置: 移动技术网 > IT编程>移动开发>Android > Android实现九宫格拼图游戏

Android实现九宫格拼图游戏

2019年09月06日  | 移动技术网IT编程  | 我要评论

经常有同学问到,使用android能不能开发游戏呢?能开发那些游戏呢?由于操作系统和开发语言局限,一般开发安卓手机游戏,我们很少使用其自带语言开发。而是使用指定编译器和语言完成,能够使界面更流畅,用户体验感更好。但是对于一些常见小游戏,使用java语言开发运行,还是不在话下的,那在本篇博客中,我将给大家简单介绍一下,九宫格拼图游戏的开发过程,基本逻辑和思路我将在代码的注释中体现。

九宫格拼图游戏,相信大家小时候都玩过。大概逻辑是,将1张图采用3*3的方式,分成9部分,将第3行3列的小图取出,打乱剩余的8个部分的位置,然后开始游戏,将打乱的8个位置的图片通过左右挪动的方式复位,成功后,将第9张图归位,即游戏结束。

编程时同样采取了这个逻辑,将切割后的小图片存放入容器中,然后随机拜访,给每一张小图设置点击事件,点击后可根据所缺空隙进行挪动,直到全部正确归位为止,我引入了计时功能,可以记录完成游戏时间。

那么,接下来我们进入正题,开始编写代码:

首先编写拼图界面布局:

<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical">
 <textview
  android:id="@+id/text_time"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_gravity="center_horizontal"
  android:textsize="28sp"
  android:textstyle="bold"
  android:textcolor="#c00"
  android:text="耗时:0秒" />
 <linearlayout
  android:id="@+id/liner_first"
  android:layout_height="wrap_content"
  android:layout_width="wrap_content"
  android:orientation="horizontal"
  android:layout_gravity="center">
  <imagebutton
   android:id="@+id/btn_00x00"
   android:layout_height="wrap_content"
   android:layout_width="wrap_content"
   android:onclick="onclick"
   android:src="@mipmap/img_xiaoxiong_00x00"
   android:padding="0dp"
   />
  <imagebutton
   android:id="@+id/btn_00x01"
   android:layout_height="wrap_content"
   android:layout_width="wrap_content"
   android:onclick="onclick"
   android:src="@mipmap/img_xiaoxiong_00x01"
   android:padding="0dp"
   />
  <imagebutton
   android:id="@+id/btn_00x02"
   android:layout_height="wrap_content"
   android:layout_width="wrap_content"
   android:onclick="onclick"
   android:src="@mipmap/img_xiaoxiong_00x02"
   android:padding="0dp"
   />
 </linearlayout>
 <linearlayout
  android:id="@+id/liner_second"
  android:layout_height="wrap_content"
  android:layout_width="wrap_content"
  android:orientation="horizontal"
  android:layout_gravity="center">
  <imagebutton
   android:id="@+id/btn_01x00"
   android:layout_height="wrap_content"
   android:layout_width="wrap_content"
   android:onclick="onclick"
   android:src="@mipmap/img_xiaoxiong_01x00"
   android:padding="0dp" />
  <imagebutton
   android:id="@+id/btn_01x01"
   android:layout_height="wrap_content"
   android:layout_width="wrap_content"
   android:onclick="onclick"
   android:src="@mipmap/img_xiaoxiong_01x01"
   android:padding="0dp" />
  <imagebutton
   android:id="@+id/btn_01x02"
   android:layout_height="wrap_content"
   android:layout_width="wrap_content"
   android:onclick="onclick"
   android:src="@mipmap/img_xiaoxiong_01x02"
   android:padding="0dp" />
 </linearlayout>
 <linearlayout
  android:id="@+id/liner_third"
  android:layout_height="wrap_content"
  android:layout_width="wrap_content"
  android:orientation="horizontal"
  android:layout_gravity="center">
  <imagebutton
   android:id="@+id/btn_02x00"
   android:layout_height="wrap_content"
   android:layout_width="wrap_content"
   android:onclick="onclick"
   android:src="@mipmap/img_xiaoxiong_02x00"
   android:padding="0dp" />
  <imagebutton
   android:id="@+id/btn_02x01"
   android:layout_height="wrap_content"
   android:layout_width="wrap_content"
   android:onclick="onclick"
   android:src="@mipmap/img_xiaoxiong_02x01"
   android:padding="0dp" />
  <imagebutton
   android:id="@+id/btn_02x02"
   android:layout_height="wrap_content"
   android:layout_width="wrap_content"
   android:onclick="onclick"
   android:src="@mipmap/img_xiaoxiong_02x02"
   android:padding="0dp"
   android:visibility="invisible" />
 </linearlayout>
 <button
  android:id="@+id/btn_restart"
  android:layout_height="wrap_content"
  android:layout_width="wrap_content"
  android:onclick="restart"
  android:layout_gravity="center"
  android:text="重新开始" />
 <imageview
  android:id="@+id/iv_yuantu"
  android:layout_gravity="center_horizontal"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:src="@mipmap/yangtu" />
</linearlayout>

效果图如下:

接下来,我们编写拼图activity的逻辑代码:

import android.app.activity;
import android.app.alertdialog;
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 activity{
 private imagebutton button00,button01,button02,button10,button11,button12,button20,button21,button22;
 private button buttonrestart;
 private textview textview;
 private int imagex = 3;
 private int imagey = 3;
 private int imgcount = imagex * imagey;
 private int length = imgcount;
 private int blankswap = length - 1;
 private int blankimgid = r.id.btn_02x02;// 初始化时候空白区域的按钮id
 private int time;
 private boolean timeswitch = true;
 // 声明一个图片数组的下标数组,随机排列这个数组
 private int[] imageindex = new int[length];
 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, };
 handler handler = new handler() {
  // 为了更新时间用handler更新,其实就是textview.settext(时间)
  public void handlemessage(message msg){
   if (msg.what == 1) {
    textview.settext("时间:" + time);
    if (timeswitch){
     time++;
     handler.sendemptymessagedelayed(1,1000);
    }
   }
  };
 };
 @override
 protected void oncreate(bundle savedinstancestate) {
  super.oncreate(savedinstancestate);
  setcontentview(r.layout.activity_main);
  // 初始化这些控件
  button00 = (imagebutton) findviewbyid(r.id.btn_00x00);
  button01 = (imagebutton) findviewbyid(r.id.btn_00x01);
  button02 = (imagebutton) findviewbyid(r.id.btn_00x02);
  button10 = (imagebutton) findviewbyid(r.id.btn_01x00);
  button11 = (imagebutton) findviewbyid(r.id.btn_01x01);
  button12 = (imagebutton) findviewbyid(r.id.btn_01x02);
  button20 = (imagebutton) findviewbyid(r.id.btn_02x00);
  button21 = (imagebutton) findviewbyid(r.id.btn_02x01);
  button22 = (imagebutton) findviewbyid(r.id.btn_02x02);
  textview = (textview) findviewbyid(r.id.text_time);
  buttonrestart = (button) findviewbyid(r.id.btn_restart);
  handler.sendemptymessagedelayed(1,1000);
  random();
 }
 // 监听方法
 private void random() {
  timeswitch = true;
  for (int i = 0; i < imageindex.length; i++) {
   // 利用循环讲数组存入值为012345678
   imageindex[i] = i;
  }
  int rand1, rand2;
  for (int j = 0; j < 20; j++) {
   // math.random 0-1的随机数,乘以8就是0-8的随机数
   rand1 = (int) (math.random() * (length - 1));
   do {
    rand2 = (int) (math.random() * (length - 1));
    if (rand1 != rand2) {
     break;
    }
   } while (true);
   swap(rand1, rand2);
  }
  // 随机排列
  button00.setimagedrawable(getresources().getdrawable(image[imageindex[0]]));
  button01.setimagedrawable(getresources().getdrawable(image[imageindex[1]]));
  button02.setimagedrawable(getresources().getdrawable(image[imageindex[2]]));
  button10.setimagedrawable(getresources().getdrawable(image[imageindex[3]]));
  button11.setimagedrawable(getresources().getdrawable(image[imageindex[4]]));
  button12.setimagedrawable(getresources().getdrawable(image[imageindex[5]]));
  button20.setimagedrawable(getresources().getdrawable(image[imageindex[6]]));
  button21.setimagedrawable(getresources().getdrawable(image[imageindex[7]]));
  button22.setimagedrawable(getresources().getdrawable(image[imageindex[8]]));
 }
 public void swap(int rand1, int rand2){
  int temp = imageindex[rand1];
  imageindex[rand1] = imageindex[rand2];
  imageindex[rand2] = temp;
 }
 public void onclick(view view) {
  // id就是点击按钮的时候传过来的button的id
  int id = view.getid();
  // 通过id进行条件语句的执行
  switch (id) {
   case r.id.btn_00x00:
    move(r.id.btn_00x00, 0);
    break;
   case r.id.btn_00x01:
    move(r.id.btn_00x01, 1);
    break;
   case r.id.btn_00x02:
    move(r.id.btn_00x02, 2);
    break;
   case r.id.btn_01x00:
    move(r.id.btn_01x00, 3);
    break;
   case r.id.btn_01x01:
    move(r.id.btn_01x01, 4);
    break;
   case r.id.btn_01x02:
    move(r.id.btn_01x02, 5);
    break;
   case r.id.btn_02x00:
    move(r.id.btn_02x00, 6);
    break;
   case r.id.btn_02x01:
    move(r.id.btn_02x01, 7);
    break;
   case r.id.btn_02x02:
    move(r.id.btn_02x02, 8);
    break;
  }
 }
 // 点击的图片与空白区域的交换的方法
 public void move(int imagbtnid, int site) {
  int sitex = site / imagex;// site 为第几张图片
  int sitey = site % imagey;
  // 初始化空白处的坐标
  int blankx = blankswap / imagex;
  int blanky = blankswap % imagey;
  // 取绝对值
  int x = math.abs(sitex - blankx);
  int y = math.abs(sitey - blanky);
  // 两种情况要不是在同一行的不同列,要不就是在同一列的不同行
  if ( (x == 0 && y == 1) || (x == 1 && y == 0)) {
   // 定义新的imagebutton 等于我们传过来的图片buttonid
   imagebutton clickbutton = (imagebutton) findviewbyid(imagbtnid);
   clickbutton.setvisibility(view.invisible);
   // 定义一个新的图片按钮,然后findviewbyid空白控件的id
   imagebutton blankbutton = (imagebutton) findviewbyid(blankimgid);
   // 然后将图片按钮重新设置图片为我们传过来的第二个参数
   blankbutton.setimagedrawable(getresources().getdrawable(image[imageindex[site]]));
   // 但是,这个控件还是不可见的,设置为可见
   blankbutton.setvisibility(view.visible);
   swap(site, blankswap);
   // 将新的空白区域位置更新等于传过来的点击的按钮的位置
   blankswap = site;
   // 将新的空白区域的id更新为传过来的点击的按钮的id
   blankimgid = imagbtnid;
  }
  gameover();
 }
 // 如果重新开始,我们要还原被点击的图片按钮变成初始化的模样
 public void restore() {
  handler.removemessages(1);
  // 定义新的imagebutton 等于我们新的空白图片按钮id,并且设置可见,
  imagebutton clickbutton = (imagebutton) findviewbyid(blankimgid);
  clickbutton.setvisibility(view.visible);
  // 定义一个新的图片按钮,然后findviewbyid空白控件的id这个id就是我们初始化的时候设置隐藏的第九章图片
  imagebutton blankbutton = (imagebutton) findviewbyid(r.id.btn_02x02);
  // 但是,这个控件还是不可见的,设置为不可见可见
  blankbutton.setvisibility(view.invisible);
  blankimgid = r.id.btn_02x02;// 初始化时候空白区域的按钮id
  blankswap = length - 1;
 }
 // 判断拼图是否成功
 public void gameover() {
  boolean loop = true;
  for (int i = 0; i < imageindex.length; i++) {
   if (imageindex[i] != i) {
    loop = false;
   }
  }
  if (loop) {
   // 成功后,时间停止
   timeswitch = false;
   // 玩家拼图成功,禁止图像按钮移动
   button00.setclickable(false);
   button01.setclickable(false);
   button02.setclickable(false);
   button10.setclickable(false);
   button11.setclickable(false);
   button12.setclickable(false);
   button20.setclickable(false);
   button21.setclickable(false);
   button22.setclickable(false);
   button22.setimagedrawable(getresources().getdrawable(image[8]));
   button22.setvisibility(view.visible);
   handler.removemessages(1);
   alertdialog.builder builder = new alertdialog.builder(mainactivity.this);
   builder.setmessage("恭喜,拼图成功!您用的时间为" + time + "秒").setpositivebutton("确认", null);
   alertdialog dialog = builder.create();
   dialog.show();
  }
 }
 public void restart(view view) {
  time = 0;
  restore();
  textview.settext("时间:" + time);
  timeswitch = true;
  handler.sendemptymessagedelayed(1,1000);
  button00.setclickable(true);
  button01.setclickable(true);
  button02.setclickable(true);
  button10.setclickable(true);
  button11.setclickable(true);
  button12.setclickable(true);
  button20.setclickable(true);
  button21.setclickable(true);
  button22.setclickable(true);
  random();
 }
}

最后运行项目,就能够进行拼图游戏了!效果图如下:

好了,这就是拼图游戏了,在我的项目中,我将神仙姐姐的图片也进行了切隔操作,大家可以试试使用神仙姐姐图片进行编程,感谢您的阅读!

点击下载

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网