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

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

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

点击下载相关项目代码

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

Android实现九宫格拼图游戏的更多相关文章

  1. html5 canvas合成海报所遇问题及解决方案总结

    这篇文章主要介绍了html5 canvas合成海报所遇问题及解决方案总结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. Html5 video标签视频的最佳实践

    这篇文章主要介绍了Html5 video标签视频的最佳实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  3. HTML5在微信内置浏览器下右上角菜单的调整字体导致页面显示错乱的问题

    HTML5在微信内置浏览器下,在右上角菜单的调整字体导致页面显示错乱的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

  4. ios – containerURLForSecurityApplicationGroupIdentifier:在iPhone和Watch模拟器上给出不同的结果

    我使用默认的XCode模板创建了一个WatchKit应用程序.我向iOSTarget,WatchkitAppTarget和WatchkitAppExtensionTarget添加了应用程序组权利.(这是应用程序组名称:group.com.lombax.fiveminutes)然后,我尝试使用iOSApp和WatchKitExtension访问共享文件夹URL:延期:iOS应用:但是,测试NSURL

  5. Ionic – Splash Screen适用于iOS,但不适用于Android

    我有一个离子应用程序,其中使用CLI命令离子资源生成的启动画面和图标iOS版本与正在渲染的启动画面完美配合,但在Android版本中,只有在加载应用程序时才会显示白屏.我检查了config.xml文件,所有路径看起来都是正确的,生成的图像出现在相应的文件夹中.(我使用了splash.psd模板来生成它们.我错过了什么?这是config.xml文件供参考,我觉得我在这里做错了–解决方法在config.xml中添加以下键:它对我有用!

  6. ios – 无法启动iPhone模拟器

    /Library/Developer/CoreSimulator/Devices/530A44CB-5978-4926-9E91-E9DBD5BFB105/data/Containers/Bundle/Application/07612A5C-659D-4C04-ACD3-D211D2830E17/ProductName.app/ProductName然后,如果您在Xcode构建设置中选择标准体系结构并再次构建和运行,则会产生以下结果:dyld:lazysymbolbindingFailed:Symbol

  7. Xamarin iOS图像在Grid内部重叠

    heyo,所以在Xamarin我有一个使用并在其中包含一对,所有这些都包含在内.这在Xamarin.Android中看起来完全没问题,但是在Xamarin.iOS中,图像与标签重叠.我不确定它的区别是什么–为什么它在Xamarin.Android中看起来不错但在iOS中它的全部都不稳定?

  8. 在iOS上向后播放HTML5视频

    我试图在iPad上反向播放HTML5视频.HTML5元素包括一个名为playbackRate的属性,它允许以更快或更慢的速率或相反的方式播放视频.根据Apple’sdocumentation,iOS不支持此属性.通过每秒多次设置currentTime属性,可以反复播放,而无需使用playbackRate.这种方法适用于桌面Safari,但似乎在iOS设备上的搜索限制为每秒1次更新–在我的情况下太慢了.有没有办法在iOS设备上向后播放HTML5视频?解决方法iOS6Safari现在支持playbackRat

  9. 使用 Swift 语言编写 Android 应用入门

    Swift标准库可以编译安卓armv7的内核,这使得可以在安卓移动设备上执行Swift语句代码。做梦,虽然Swift编译器可以胜任在安卓设备上编译Swift代码并运行。这需要的不仅仅是用Swift标准库编写一个APP,更多的是你需要一些框架来搭建你的应用用户界面,以上这些Swift标准库不能提供。简单来说,构建在安卓设备上使用的Swiftstdlib需要libiconv和libicu。通过命令行执行以下命令:gitclonegit@github.com:SwiftAndroid/libiconv-libi

  10. Android – 调用GONE然后VISIBLE使视图显示在错误的位置

    我有两个视图,A和B,视图A在视图B上方.当我以编程方式将视图A设置为GONE时,它将消失,并且它正下方的视图将转到视图A的位置.但是,当我再次将相同的视图设置为VISIBLE时,它会在视图B上显示.我不希望这样.我希望视图B回到原来的位置,这是我认为会发生的事情.我怎样才能做到这一点?编辑–代码}这里是XML:解决方法您可以尝试将两个视图放在RelativeLayout中并相对于彼此设置它们的位置.

随机推荐

  1. Flutter 网络请求框架封装详解

    这篇文章主要介绍了Flutter 网络请求框架封装详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. Android单选按钮RadioButton的使用详解

    今天小编就为大家分享一篇关于Android单选按钮RadioButton的使用详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

  3. 解决android studio 打包发现generate signed apk 消失不见问题

    这篇文章主要介绍了解决android studio 打包发现generate signed apk 消失不见问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  4. Android 实现自定义圆形listview功能的实例代码

    这篇文章主要介绍了Android 实现自定义圆形listview功能的实例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  5. 详解Android studio 动态fragment的用法

    这篇文章主要介绍了Android studio 动态fragment的用法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  6. Android用RecyclerView实现图标拖拽排序以及增删管理

    这篇文章主要介绍了Android用RecyclerView实现图标拖拽排序以及增删管理的方法,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下

  7. Android notifyDataSetChanged() 动态更新ListView案例详解

    这篇文章主要介绍了Android notifyDataSetChanged() 动态更新ListView案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

  8. Android自定义View实现弹幕效果

    这篇文章主要为大家详细介绍了Android自定义View实现弹幕效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  9. Android自定义View实现跟随手指移动

    这篇文章主要为大家详细介绍了Android自定义View实现跟随手指移动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. Android实现多点触摸操作

    这篇文章主要介绍了Android实现多点触摸操作,实现图片的放大、缩小和旋转等处理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部