###前言

Android原生开发也可以实现一些简单的小游戏。今天给大家讲解一个Android实现拼图小游戏的知识。游戏拼图,在很多地方应该都是有讲解的了,不过,我今天要讲解的不同在于,我已经将这个拼图游戏功能封装都了一个类——Puzzle中,然后会讲解些在实现过程中需要注意的问题和心得。

今天设计内容:

1. `Puzzle`类的主要方法介绍

2. `Puzzle`在`MainActivity`中的应用

2.1 在游戏界面添加GridLayout布局

2.2 Puzzle在MainActivity中的使用

3. 需要注意的问题及心得

3.1 设置图片为方图,且不能太大

3.2 方块移动过程中不可操作

3.3 在图片上滑动手指,方块不移动

3.4 开局随机打乱图片时出现结束图

3.5 设置游戏生命周期

3.6 心得

4. 效果图和项目结构图

先来波效果图

![](/contentImages/image/20200309/oZrhcOnt7hMozkUP6UA.gif)

####一. Puzzle类的主要方法介绍

`Puzzle`作为一个拼图游戏封装类,具备以下几个重要方法:

```

/**初始化(所有参数设置完毕后才能执行)**/

public void init(Context context)

/**游戏结束的监听**/

public Puzzle setOnGameOverListener(OnGameOverListener listener)

/**设置拼图布局控件**/

public Puzzle setGridLayout(GridLayout gridLayout)

/**

* 设置拼图行列数

* @param count 行列数

* @return

*/

public Puzzle setCount(int count)

/**

* 设置拼图图片资源id

* @param imageId

* @return

*/

public Puzzle setImageId(int imageId)

/**是否响应手势玩游戏,默认不支持手势**/

public Puzzle setGestur(boolean gestur)

/**

* 游戏开局打乱次数

* @param difficulty 游戏开局打乱次数,需要大于等于MIN_DIFFICULTY_COUNT

* @return

*/

public Puzzle setDifficulty(int difficulty)

/**开始游戏**/

public void start()

/**

* 手势支持的方法,重写activity的onTouchEvent方法,并添加

* 到activity的dispatchTouchEvent方法中

* @param event 手势对象

*/

public boolean onTouchEvent(MotionEvent event)

```

####二. Puzzle在MainActivity中的应用

#####2.1 在游戏界面添加GridLayout布局

下面贴出`MainActivity`对应的布局文件`activity_main.xml`代码:

```

```

界面很简单,就是在其中布一个`GridLayout`,需要注意的是,这里`GridLayout`的行列不要做设置,应该在代码中动态设置(当然具体处理已经在`Puzzle`中实现,无需使用者操心),然后就是为了游戏体验更好,最好设置`GridLayout`宽度撑全屏,高度自适应。

#####2.2 Puzzle在MainActivity中的使用

下面让我们来看看`Puzzle`在`MainActivity`中的使用吧,废话不多讲,直接上`MainActivity`代码:

```

public class MainActivity extends AppCompatActivity{

private GridLayout mGridLayout;

private Puzzle mPuzzle;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

mGridLayout=findViewById(R.id.grid);

mPuzzle=new Puzzle();

//初始化设置

mPuzzle.setGridLayout(mGridLayout)//设置拼图布局(必须设置)

.setCount(3)//设置行列(可选,默认行列3x3)

.setImageId(R.mipmap.ic_test)//设置拼图图片资源id(必须设置)

.setGestur(true)//设置是否支持手势,默认为false,即不支持(可选)

.setDifficulty(50)//游戏开局图片打乱次数(可选)

//游戏结束的监听

.setOnGameOverListener(new Puzzle.OnGameOverListener() {

@Override

public void over() {

LogUtil.i("======游戏结束,over======");

ToastUtil.shortShow("游戏结束,over");

}

})

.init(MainActivity.this);//

//开始游戏

mPuzzle.start();

LogUtil.i("==1===欧,我的天啦,开局了======");

}

@Override

public boolean onTouchEvent(MotionEvent event) {

if(mPuzzle!=null){

return mPuzzle.onTouchEvent(event);

}

return false;

}

@Override

public boolean dispatchTouchEvent(MotionEvent event) {

if(mPuzzle!=null){

mPuzzle.onTouchEvent(event);

}

return super.dispatchTouchEvent(event);

}

}

```

这里需要注意的是:

- `mPuzzle`的`init()`方法要在初始化时最后一个执行

- 记得重写`MainActivity`的`onTouchEvent(MotionEvent event)`和 `dispatchTouchEvent(MotionEvent event)`方法,为的是支持手势操作

- 要想增加游戏难度,可以通过修改`Puzzle`的两个方法`setCount(int)`和`setDifficulty(int)`的参数,前一个方法是将图片切成多少块的设置,后一个方法是打乱的步数

####三.需要注意的问题及心得

#####3.1 设置图片为方图,且不能太大

这里我实现图片设置和切割用的是`Bitmap`,然后其中用到`Bitmap.create()`方法,如果图片过大,会出现

```

IllegalArgumentException : y + height must be

```

错误,由于拼图游戏整体图片布局采用正方形,即宽高相等,则你设置的图片最好也是方块。由于时间问题,我们对`Bitmap`相关做优化,大家有时间的话可以去优化下。

我做这个demo时,采用的样图尺寸是`720x720`的,仅作参考。

`Puzzle`拼图的实现,需要注意一些问题,接着开讲。

#####3.2 方块移动过程中不可操作

由于为了游戏的可观性,在图片移动过程中做了动画处理,为了防止动画执行期间操作图片切换,需要在动画开始和结束时设置布尔值,当界面状态处在动画执行期间,则点击图片或滑动图片失效

#####3.3 在图片上滑动手指,方块不移动

这是由于`GestureDetector`控制的是界面手势,而`GridLayout`控件对手势操作造成干扰,为了解决这个问题,我们可以重写`Activity`的`dispatchTouchEvent(MotionEvent event)`方法,并重写如下:

```

@Override

public boolean dispatchTouchEvent(MotionEvent event) {

if(mPuzzle!=null){

mPuzzle.onTouchEvent(event);

}

return super.dispatchTouchEvent(event);

}

```

这样在`GridLayout`上滑动时,小方块也可以移动了。

#####3.4 开局随机打乱图片时出现结束图

具体情况是,在开局的时候,我们会设置让图片小方块随机打乱,问题是有出现随机打乱后显示原图的情况。为了规避这个问题,我们需要在随机的时候做些处理:

- 随机时要生成正确的手势方向(图片不能划出越界)

- 随机生成的手势不能成对出现(即不能上次是向上滑动,第二次是向下滑动,这样会导致图片还原)

#####3.5 设置游戏生命周期

给游戏划分生命周期是为了更好的做逻辑处理(可不是为了装酷耍帅哦),我大体将游戏分为三个生命周期:

- 游戏未开始

- 游戏进行中

- 游戏已结束

在开局前,我们需要随机打乱顺序,所以这个段乱顺序的操作要在`游戏未开始`的生命周期中进行,打乱完毕后,将生命周期更新到`游戏进行中`状态。

然后在`游戏进行中`我们需要判断游戏是否结束,当然移动方块的动画操作包括禁止动画时操作界面的限制,都是在这个生命周期中处理。当判断出图片已经复原,则将游戏状态更新为`游戏已结束`

当`游戏已结束`时不需要做任何图片移动及数据交换的操作,在界面的表现就是游戏结束后点击和滑动都不起作用了。

#####3.6 心得

在处理游戏开局前随机打乱的问题上,弄了好一会,主要难点是要取一个随机方向,并且这个方向既要是有效的,又要不是成对出现的。若找不到就一直找,直到找到为止。

这里,我想了两种方式:

- 在集合中随机拿出一个item,然后递归找符合要求的,若不符合要求,则接着在剩余数据中随机找

- 直接打乱集合,然后遍历这个乱序集合,找到符合要求的item

####四.效果图和项目结构图

下面贴出游戏效果图和项目结构图

![](/contentImages/image/20200309/oZrhcOnt7hMozkUP6UA.gif)

![](/contentImages/image/20200309/ie172jsuDKB3FNWX95I.png)

ok,今天的内容就讲到这里了,谢谢大家。

android拼图小游戏代码,Android实现拼图小游戏相关推荐

  1. 拼图游戏代码html5,HTML5拼图游戏代码.doc

    HTML5拼图游戏代码 sliding.html 拼图游戏 拼图游戏 简单 困难 返回菜单 Sliding.jsvar context = document.getElementById('puzzl ...

  2. android 游戏代码,Android小游戏实现代码

    Android课程设计作品,一个小游戏,使用传感器控制小鲸鱼的游动,避免被水面上捕鲸船的鱼枪捕到,针对屏幕为800*480的屏幕设计. 主进程: package game.whale; import ...

  3. android 小白点代码,Android实现小圆点显示未读功能

    ####前言 以前我们实现这个功能都是用 BadgeView.java,大体就是将这个java类复制到自己的项目中,然后在项目中使用,今天讲的也是一款BadgeView,我将其封装称工具类Badget ...

  4. html5猜数字游戏代码,js猜数字小游戏的简单实现代码

    复制代码 代码如下: 简易计算机 //获取随机数 function GetRandomNum(Min,Max) { var Range = Max - Min; var Rand = Math.ran ...

  5. python简单小游戏代码教程,Python简单小游戏代码

    球球各位大神怎么用python写一个猜词小游戏的代码? key = input('请输入一个单词:')description = input('输入单词描述:')chance = 5mark = 5p ...

  6. android 多闹钟实现代码,Android编程实现闹钟的方法详解

    Android编程实现闹钟的方法详解 发布时间:2020-09-30 10:18:02 来源:脚本之家 阅读:75 作者:Jacob-wj 本文实例讲述了Android编程实现闹钟的方法.分享给大家供 ...

  7. android添加文本框代码,Android输入框添加emoje表情图标的实现代码

    前言 再次写聊天的时候才发现,代码积累是一件非常重要的事情,就如这篇博客的意图其实就是代码积累的目的,其实没什么难度,但是一件很琐碎的事情真的也需要时间去完成和调试,所以,获取你在写一个功能的时候会觉 ...

  8. python手机版做小游戏代码大全-python简单小游戏代码 怎么用Python制作简单小游戏...

    1.Python猜拳小游戏代码: 2.import random #导入随机模块 3. 4.num = 1 5.yin_num = 0 6.shu_num = 0 7.while num <= ...

  9. python小游戏代码大全-python贪吃蛇游戏代码

    本文实例为大家分享了python贪吃蛇游戏的具体代码,供大家参考,具体内容如下 贪吃蛇游戏截图: 首先安装pygame,可以使用pip安装pygame: pip install pygame 运行以下 ...

  10. python小游戏代码大全-python简单小游戏代码 怎么用Python制作简单小游戏

    1.Python猜拳小游戏代码: 2.import random #导入随机模块 3. 4.num = 1 5.yin_num = 0 6.shu_num = 0 7.while num <= ...

最新文章

  1. Azure AI的又一里程碑,Neural TTS新模型呈现真人般情感饱满的AI语音
  2. java 本地通信_java – 本地JVM之间的通信
  3. 读javascript高级程序设计06-面向对象之继承
  4. Image-to-Image Translation with conditional Adversarial Networks ---- Pix-2-Pix
  5. 使用SharePoint 2010新增的文档集内容类型来管理文档
  6. appender log4j 扩展_Log4j扩展使用--输出地Appender
  7. python模块搜索原则_python 从小白开始 - 模块,包以及路径搜索
  8. 现代通信原理4.1:随机变量
  9. 小米便签产品级的源码
  10. 萝卜章,电子封条……区块链风口将至?
  11. 玩游戏学编程,寓教于乐:12个学习编程的游戏化平台
  12. 报数——约瑟夫环问题
  13. Unity动画系统详解1:在Unity中如何制作动画?
  14. Redis基础——数据类型详解
  15. 戰女神V、ef_latter、BaldrSky 注册表补丁
  16. HEIF 和 HEVC 研究
  17. SAP所有模块用户出口(User Exits)
  18. 互联网黑市分析:攻击敲诈勒索--TOMsInsight 2014.09.22
  19. 借壳上市的标准和条件
  20. 以json格式输出 bro(zeek)日志

热门文章

  1. 怎么把IE地址栏搜索引擎变为百度搜索,而不安装百度搜霸等插件呢?
  2. 18.Consent 实现思路介绍
  3. USB转换PS2接线原理
  4. JS仿写刮刮乐小例子
  5. scp在命令行中带密码远程拷贝文件
  6. ECMAScript标准简介
  7. 计算机求和怎样操作,电脑求和怎么操作
  8. 创建图层-只是保存lyr,此路不通
  9. 对PVP手游产品《王者荣耀》的一些思考
  10. albedo diffuse specular