欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android实现九宫格拼图游戏

程序员文章站 2022-11-22 21:53:13
经常有同学问到,使用android能不能开发游戏呢?能开发那些游戏呢?由于操作系统和开发语言局限,一般开发安卓手机游戏,我们很少使用其自带语言开发。而是使用指定编译器和语言...

经常有同学问到,使用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>

效果图如下:

Android实现九宫格拼图游戏

接下来,我们编写拼图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();
 }
}

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

Android实现九宫格拼图游戏

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

点击下载相关项目代码

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