android拼图小游戏代码,Android实现拼图小游戏
###前言
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实现拼图小游戏相关推荐
- 拼图游戏代码html5,HTML5拼图游戏代码.doc
HTML5拼图游戏代码 sliding.html 拼图游戏 拼图游戏 简单 困难 返回菜单 Sliding.jsvar context = document.getElementById('puzzl ...
- android 游戏代码,Android小游戏实现代码
Android课程设计作品,一个小游戏,使用传感器控制小鲸鱼的游动,避免被水面上捕鲸船的鱼枪捕到,针对屏幕为800*480的屏幕设计. 主进程: package game.whale; import ...
- android 小白点代码,Android实现小圆点显示未读功能
####前言 以前我们实现这个功能都是用 BadgeView.java,大体就是将这个java类复制到自己的项目中,然后在项目中使用,今天讲的也是一款BadgeView,我将其封装称工具类Badget ...
- html5猜数字游戏代码,js猜数字小游戏的简单实现代码
复制代码 代码如下: 简易计算机 //获取随机数 function GetRandomNum(Min,Max) { var Range = Max - Min; var Rand = Math.ran ...
- python简单小游戏代码教程,Python简单小游戏代码
球球各位大神怎么用python写一个猜词小游戏的代码? key = input('请输入一个单词:')description = input('输入单词描述:')chance = 5mark = 5p ...
- android 多闹钟实现代码,Android编程实现闹钟的方法详解
Android编程实现闹钟的方法详解 发布时间:2020-09-30 10:18:02 来源:脚本之家 阅读:75 作者:Jacob-wj 本文实例讲述了Android编程实现闹钟的方法.分享给大家供 ...
- android添加文本框代码,Android输入框添加emoje表情图标的实现代码
前言 再次写聊天的时候才发现,代码积累是一件非常重要的事情,就如这篇博客的意图其实就是代码积累的目的,其实没什么难度,但是一件很琐碎的事情真的也需要时间去完成和调试,所以,获取你在写一个功能的时候会觉 ...
- python手机版做小游戏代码大全-python简单小游戏代码 怎么用Python制作简单小游戏...
1.Python猜拳小游戏代码: 2.import random #导入随机模块 3. 4.num = 1 5.yin_num = 0 6.shu_num = 0 7.while num <= ...
- python小游戏代码大全-python贪吃蛇游戏代码
本文实例为大家分享了python贪吃蛇游戏的具体代码,供大家参考,具体内容如下 贪吃蛇游戏截图: 首先安装pygame,可以使用pip安装pygame: pip install pygame 运行以下 ...
- python小游戏代码大全-python简单小游戏代码 怎么用Python制作简单小游戏
1.Python猜拳小游戏代码: 2.import random #导入随机模块 3. 4.num = 1 5.yin_num = 0 6.shu_num = 0 7.while num <= ...
最新文章
- Azure AI的又一里程碑,Neural TTS新模型呈现真人般情感饱满的AI语音
- java 本地通信_java – 本地JVM之间的通信
- 读javascript高级程序设计06-面向对象之继承
- Image-to-Image Translation with conditional Adversarial Networks ---- Pix-2-Pix
- 使用SharePoint 2010新增的文档集内容类型来管理文档
- appender log4j 扩展_Log4j扩展使用--输出地Appender
- python模块搜索原则_python 从小白开始 - 模块,包以及路径搜索
- 现代通信原理4.1:随机变量
- 小米便签产品级的源码
- 萝卜章,电子封条……区块链风口将至?
- 玩游戏学编程,寓教于乐:12个学习编程的游戏化平台
- 报数——约瑟夫环问题
- Unity动画系统详解1:在Unity中如何制作动画?
- Redis基础——数据类型详解
- 戰女神V、ef_latter、BaldrSky 注册表补丁
- HEIF 和 HEVC 研究
- SAP所有模块用户出口(User Exits)
- 互联网黑市分析:攻击敲诈勒索--TOMsInsight 2014.09.22
- 借壳上市的标准和条件
- 以json格式输出 bro(zeek)日志