本文阅读大约六分钟

Hi 大家好,欢迎大家关注我的星球【Hi Android】

本篇带来的是Android的一个小游戏:数独,虽然是个小游戏,但是也把老刘给算晕了,其实在Android中,有一小部分简单的小游戏是可以通过自定义View来完成的,所以今天我们也来实现一下吧,先给大家看一下预览:

从预览总我们可以看到如下的一些功能:

1.引导页,延迟1.5s后进入主页

2.主页上方有一个游戏规则的按钮点击可以跳转到游戏规则

3.主页上方有一个设置的按钮点击可以跳转到游戏设置

4.游戏上方有一个计时器

5.游戏中央是一个自定义的棋盘,并且数字是七彩的

6.游戏下方是1-9的数字按钮

7.设置中有多彩文字和智能提示的开关

大致的一些功能,当然你也可以增加一些其他的功能,这里因为项目比较繁琐,所以我会尽量沿着核心思路去讲解,其他的小UI什么的各位自己去处理一下,有兴趣可以在文章末尾下载源码。

好了,我们正文开始吧。

一.绘制九宫格

其实绘制九宫格和小九宫格相对来说是比较简单的,我创建了一个GameView,由于是九宫格,所以横竖都是9,那么我们可以将View的高宽都除以9得到的高宽就是每一个方块的高宽了

在onSizeChanged中计算出了方块的大小之后,绘制九宫格就变得极其简单了,在GameView的onDraw中,我们可以通过drawLine来绘制交叉的线条

可以看到,这个MAX_VALUES = 9,我们通过循环遍历调用canvasLine绘制横竖的线条,这样就实现九宫格了

for循环中的3是为了加深小九宫格的颜色,调用之后的效果如下:

这样,我们的一个基础棋盘就完成了,那么我们来看下canvasLine里到底做了什么

正常的写法只要第一个drawLine和第三个即可,我这里在高宽上都+1是为了有一个视觉的加深效果,到这里九宫格就完成了,那么接下来,我们要做的事情是什么呢?那就是绘制绘制数字了

二.绘制数字

绘制数字和绘制九宫格的写法是基本类似的,只是坐标比较难计算,我们来看下绘制数字的代码

在这段代码中,我们需要关心mGame这个对象和canvasNumberText这个函数

Game对象就是我们的数独逻辑计算类,我们所有关于数独计算都会在里面实现,先来看下canvasNumberText函数

这个函数有必要仔细的说明一下,首先是这个画笔的文本大小,这里我设置了方块高度的0.75f,再结合文字绘制居中效果,那么视觉会舒服很多,各位也可以对此稍微进行修改,然后是FontMetrics,这是绘制文本测量类,关于FontMetrics我建议大家去查阅一下相关的资料,实际上只是对字符以及基准线的一个绘测,我们就是通过基准线的界定来实现绘制文本几种的,并且这里有一个sp的保存,是为了之后设置中是否使用多彩文字,多彩文字的实现很简单,主要是在canvasNumberColor这个函数中,你定义九个颜色就好了

我们可以先运行一下看看效果

当然,我们还有Game类没有讲

三.Game逻辑类

Game类我要仔细的讲解,首先我定义了一个字符

//默认显示

private final String mDefData = "3600000000004230800000004200070460003820000014500013020001900000007048300000000045";

这个字符一共81个字节,对应的就是九宫格的81个小方块,其中0为未输入,一般的数独游戏都是按照规则随机的,但是我并不是很懂这个规则,所以只能写死了,接着我再定义一个二维数组来建立九宫格查询的索引列表

//装载数独

private int sudo[] = new int[9 * 9];

所以我们就可以实现如下的三个方法

这三个方法,首先是parsingStringChat,就是解析默认字符串到我定义的sudo索引数组中,这样我们就可以通过getCardNumber来索引到对应的字符了,这里的算法是 纵列 * 9 + 横列,打个比方,第三行的第六个,那么就是3 * 9 + 6 得出来的下标再去sudo中索引,就可以拿到对应的数字了,而getCardString这个方法只是为了方便文字的绘制,而去将0转换成空的一个方法,到了这里,基本的UI就完成了,我们接下来就要实现它的点击逻辑了

四.点击逻辑

我们的点击逻辑思路很简答, 你点击后这个方块红色包裹,然后输入数字,即可,这里掺杂了一个只能提示的功能,所以变得复杂起来了,我们一步步来,首先,来看下这个触摸事件的代码

这段代码比较长,我们一个个来解释一下,首先是过滤事件,如果不是ACTION_DOWN,那么就按照系统事件下发就好了,如果是ACTION_DOWN,那么通过getXY再除以方块的高宽,就可以得到选择的方块的横纵位置了,然后是获取当前方块上的数字,这里我没有用到,继续往下看,绘制一个红色边框,因为有了他的X,Y,所以绘制起来比较简单

这里是否智能提示,如果打开了智能提示,那么我会将这个方块的已显示的数字数组通过接口传递出去,在主页面做逻辑处理,那么怎么计算已显示的数字数组呢?,这里还需要用到我们的Game对象

我定义了一个三维数组

//存储每个单元格已经不可用数据 x y data

private int userNo[][][] = new int[9][9][];

通过他,我可以传递x,y后获取到他所显示过的数组集合,也就是Game中的parsingAllUserNoNumber函数

parsingAllUserNoNumber就是遍历一遍所有的方块,最终的实现还是在parsingUserNoNumber中,我们来看下逻辑,首先定义一个长度为9的数组z,然后通过遍历横纵获取已显示的数字存储在z中,并且我们还需要计算小九宫格也不能有重复的,最终将0去除,得到的就是我们所传递方块的x,y的已显示数组,那么我们智能提示,就需要将这些给去除

我们在主页定义了九个按钮,这里我为了方便管理,直接定义了一个数组

private Button mView[] = new Button[9];

然后进行初始化

这里初始化后设置点击事件,我只要点击某一个按钮,就将对应的数字通过setNumberText传递给GameView绘制,并且设置了一遍全部显示,因为有可能因为智能提示导致有些按钮不显示

我们回到GameView中关于setNumberText函数

这里其实最终调用的还是Game对象中的refreshSudo,我们并不需要直接去绘制文本,只需要将我刚才定义的sudo数组对应坐标的字符修改后刷新View即可,这里还有一个内容就是检查游戏结束,我们每次输入文字都会检查一遍游戏的逻辑是否对应上了,然后游戏是否结束,不过这个逻辑比较复杂,我暂时还没有去实现,大家理解下思路即可,继续来看refreshSudo

这里就是将sudo更新一下并且重新计算显示数字的数组

到这里我们的基本逻辑就完成了,实际上最终比较核心的内容就是GameView和Game,其中GameView还比较简单,只是逻辑的中转,我们来看一下全部的Game代码;

五.Game

主要还是逻辑和思路,for循环太多,脑瓜子嗡嗡的叫呀,我们来看下最终的Gif预览吧

好的,有兴趣可以加入我的知识星球【Hi Android】 或者点击阅读原文加入

Android Developer 交流群:417046685 现在无限制加入,抓紧哦

源码下载可阅读原文在星球中 或者 加入QQ群

我们下期再见!

Android 数独游戏开发,强逻辑的梳理相关推荐

  1. android 手机九宫格解锁实验报告,Android数独游戏实验分析报告.pdf

    本科生实验报告 实验课程 Android 课程设计数独游戏 学院名称 信息科学与技术学院 专业名称 物联网工程 学生姓名 学生学号 指导教师 实验地点 实验成绩 二〇一五 年 十 月 二〇一五 年 十 ...

  2. Android拼图游戏的设计逻辑,从切图到交互动画,从关卡到倒计时,实例提高!

    Android拼图游戏的设计逻辑,从切图到交互动画,从关卡到倒计时,实例提高! 群英传的最后一章,我大致的看了一下这个例子,发现鸿洋大神也做过,就参考两个人的设计逻辑,感觉都差不多,就这样实现起来了 ...

  3. H5数独游戏开发——游戏中的事件处理

    假设你正在玩一款角色扮演游戏(RPG),主角走进了一家店铺,你用鼠标点击店铺里管家,这时屏幕显示一个待售物品菜单,然后你可以选购你需要的物品.那么,你知道从你点击鼠标的那一刻起,游戏是怎样响应的吗?让 ...

  4. android+Unity3D游戏开发之简单的物体运动

    android+Unity3D游戏开发之简单的物体运动 其实这篇也是转载的,真的感觉对于我们初学者来说很不错的,不信你看看嘛;原创链接:http://bbs.9ria.com/thread-98192 ...

  5. 《Android 3D游戏开发技术宝典——OpenGL ES 2.0》——2.8节本章小结

    本节书摘来自异步社区<Android 3D游戏开发技术宝典--OpenGL ES 2.0>一书中的第2章,第2.8节本章小结,作者 吴亚峰,更多章节内容可以访问云栖社区"异步社区 ...

  6. 《Android 3D游戏开发技术宝典——OpenGL ES 2.0》——2.4节文件I/O

    本节书摘来自异步社区<Android 3D游戏开发技术宝典--OpenGL ES 2.0>一书中的第2章,第2.4节文件I/O,作者 吴亚峰,更多章节内容可以访问云栖社区"异步社 ...

  7. H5数独游戏开发——游戏通关及重玩

    如何判断游戏是否通关?通关后如何重新开始游戏,让用户重玩?今天给大家详细介绍如何实现以上功能.先看一下数独游戏通关后的提示界面,截图如下: 首先,我们需要判断游戏是否通关,那么如何判断呢?有两个条件: ...

  8. 数独游戏开发——计时器实现

    设想一下,你正在玩一款RPG游戏,在河中被BOSS追杀,还有2分钟BOSS就追上你,屏幕显示倒计时,你必须拼尽全力在2分钟内游到岸上--好了,让我们回到现实中来,如何实现计时效果呢?我来给大家详细介绍 ...

  9. Android studio游戏开发就是这么简单:卡牌杀系列(核心UI篇:SufaceView的核心用法)

    Android studio游戏开发就是这么简单:卡牌杀系列(核心UI篇:SufaceView的核心用法) Android studio五年经验教你如何:花费了2周快速开发卡牌杀系类游戏,核心思路分享 ...

  10. 《Android 3D游戏开发技术宝典——OpenGL ES 2.0》——2.1节游戏中的音效

    本节书摘来自异步社区<Android 3D游戏开发技术宝典--OpenGL ES 2.0>一书中的第2章,第2.1节游戏中的音效,作者 吴亚峰,更多章节内容可以访问云栖社区"异步 ...

最新文章

  1. 机器学习的基础图表!
  2. 何新生—你是哪国人?
  3. hdu 4597 Play Game(记忆化搜索)
  4. Vue——[Props with type Object/Array must use a factory function to return the default value.]解决方案
  5. vbmsgbox引用变量_vba中MsgBox的参数及用法
  6. C# 无意间写了一段线程死锁的代码
  7. 【Leetcode | 9】217. 存在重复元素
  8. SQL - 将NULL设置为 NOT NULL
  9. Linux篇 | 用户、组和权限(一)
  10. 重读《JavaScript DOM编程艺术》(第一版)
  11. python编写个人信息查询_使用Python改写的身份证信息查询小程序
  12. AutoCAD自带CAD Express Tools实现停车位自动编序号
  13. chimera添加氨基序列
  14. lmdb.Error: 路径 : ϵͳ�Ҳ���ָ����·����解决办法
  15. springboot的最核心的27个注解详解
  16. Logical Databases逻辑数据库
  17. 超详细的ArcGIS生成格网知识汇总
  18. std::tr1::function and std::tr1::bind
  19. HDU 4509 湫湫系列故事——减肥记II
  20. java 图书馆管理系统(超低配版)

热门文章

  1. python按综合、销量排序抓取100页的淘宝商品列表信息
  2. matlab平衡小车数学模型PID,Simulink仿真
  3. Wind River workbench介绍
  4. snagit 注册码
  5. 主管都在用项目管理Excel表格模板管理项目
  6. dom影像图形成数字地形图_航测相关知识点——鲲鹏智汇承接航测相关任务
  7. Java IO流体系图(图)
  8. Android音视频【七】H265硬编解码视频通话
  9. 解决Linux连不上外国软件源或者软件源失效
  10. WordPress发布插件,WordPress定时采集伪原创发布插件