Android群英传-拼图游戏puzzle-6点吐槽
一、缘由
经常写文章,混了一些C币。最近在深入学习Android应用开发,就从商城里买了一本《Android群英传》。
这本书的内容,不是纯粹的入门那种,分几个章节,重点讲解Activity、动画等。
最后一章是2个小游戏的实例,其中1个是拼图游戏。
认真研究了下作者的代码,有不敢苟同的地方,特意吐槽几句。
二、游戏相关资料
游戏名称:拼图、移动拼图、滑动拼图、Pullze
在搜索过程中,搜到了“华容道”和“数字推盘游戏”。
数字推盘游戏(n-puzzle)是一种智力游戏,常见的类型有十五数字推盘游戏和八数字推盘游戏等。也有以图画代替数字的推盘游戏。可能Noyes Palmer Chapman在1874年发明十五数字推盘,但Sam Loyd则在1891年也宣称为其发明。
八数字推盘(又名重排九宫)则可能由Henry Ernest Dudeney发明,并且Martin Gardner在科学人寻求更快的解答。也有人认为重排九宫是传统中国游戏,来自洛书,并且为华容道的祖先。
游戏规则:游戏者要移动板上的方块,让所有的方块顺着数字的次序排列。
在看了“数字推盘游戏”的介绍之后,我发现“拼图游戏”的本质就是“数字推盘游戏”。
我们设计的图片推盘游戏,背后的表示就是“数字”,“按顺序排放”。
三、6点吐槽
1.游戏的核心设计,非常坑。
问了下作者,他是根据自己的理解,设计的这个游戏。
我严重怀疑,他没有玩过“实物版”的“移动拼图游戏”,反正我是玩过了。
因此,我特意严重吐槽下他的游戏设计。
游戏设计不给力,导致技术设计和实现,很让人着急啊。
没有太大问题的话,我打算改造下,实现标准的“移动拼图游戏”,然后分享出来。
他的游戏界面
N*N个格子,其中1个是“空”的,实际上只是“图片”没有展示,并不是严格意义上的“空格子”。
实物版的游戏界面
N*N+1个格子,有个格子专门是“空”的,用来交换,腾位置的。
2.变量命名方式非主流。
private View mPopupView;
竟然用类似“匈牙利命名法”这种。
Java和Android开发,不都是“驼峰式命名”么?
popupView就可以了。
另外,popupView也符合“约定优于配置”,Android自动提示也更舒服。
3.函数命名不准确。
public static DisplayMetrics getScreenSize(Context context) {
DisplayMetrics metrics = new DisplayMetrics();
WindowManager windowManager = (WindowManager) context.getSystemService(
Context.WINDOW_SERVICE);
Display display = windowManager.getDefaultDisplay();
display.getMetrics(metrics);
return metrics;
}
返回的是DisplayMetrics,它包含的可不只是“屏幕的大小”。
因此,要么自定义1个实体类,包装屏幕大小。
要么,就用getDisplayMetrics更好。
相比之下,类似代码的另外一个方法“获得设备密度”就更准确一点了,返回的是float,而不是DisplayMetrics。
/**
* 获取屏幕density(密度)
*
* @param context context
* @return density 屏幕density
*/
public static float getDeviceDensity(Context context) {
DisplayMetrics metrics = new DisplayMetrics();
WindowManager windowManager = (WindowManager) context.getSystemService(
Context.WINDOW_SERVICE);
windowManager.getDefaultDisplay().getMetrics(metrics);
return metrics.density;
}
这个就更准确一下。
ImageUtil有个方法
public void createInitBitmaps(int type, Bitmap photoSelected,Context context);
从函数的名字,我们很可能想到,返回的是1个对象,但结果是void。直接取名initBitmaps更好,初始化对象。
另外,ImageUtil是工具类,而“Bitmap photoSelected”这种命名方式,体现了业务场景,但实际上纯粹的工具方法,连“业务工具方法”都不算,
为啥要这么命名呢?
函数的命名和作用,和业务无关,就更容易通用,在其它项目中使用,才能起到“工具函数”的作用。
4.代码重复
还是上面的代码,getDeviceDensity的代码前3行和getScreenSize函数的前4行是一样的。
而且,从“windowManager.getDefaultDisplay().getMetrics(metrics);”这里可以看出,第2个函数还不是“复制-粘贴”修改的。
这里,我有个疑问,获得DisplayMetrics对象,为什么是传入一个新的对象,而不是getMetrics在内部new一个新对象,然后返回呢?
重构之后的代码:
/**
* 获取屏幕相关参数
*
* @param context context
* @return DisplayMetrics 屏幕宽高
*/
public static DisplayMetrics getDisplayMetrics(Context context) {
DisplayMetrics metrics = new DisplayMetrics();
WindowManager windowManager = (WindowManager) context.getSystemService(
Context.WINDOW_SERVICE);
Display display = windowManager.getDefaultDisplay();
display.getMetrics(metrics);
return metrics;
} /**
* 获取屏幕density(密度)
*
* @param context context
* @return density 屏幕density
*/
public static float getDeviceDensity(Context context) {
DisplayMetrics metrics =getDisplayMetrics(context);
return metrics.density;
}
5.变量作用域太大。
public class ImageUtil {
public GridItem gridItem;
}
定义了1个public字段,实际上这个字段只是“某个函数”的一个局部变量,也没有被其它类访问。
因此,不应该定义单独的字段,也不应该是public的。
另外,ImageUtil是个工具类,既然没有必要定义实例字段,直接把方法定义成static更好。
而不是 new ImageUtil().method();
6.相同的字符串,没有提取成常量。
// 选择默认图片
Intent intent = new Intent(
MainActivity.this,
PuzzleMain.class);
intent.putExtra("picSelectedID", mResPicId[position]);
intent.putExtra("mType", mType);
startActivity(intent);
至少有2个地方,使用了"picSelectedID"。用常量表示,容易维护。
更多地方,就不吐槽了~
四、代码
a.我自己初步重构的-
https://git.oschina.net/fansunion/puzzle
b.Android群英传-原版拼图游戏
https://github.com/xuyisheng/AndroidHeroes/tree/master/13.实例提高/XPuzzle
c.更改游戏设计,增加1个格子,大幅度改版的,暂时还在研究中~后续公开~
五、写在最后
不少人读过博主的“拼图游戏系列文章”,也有部分人读过博主的“Android群英传”这本书。
虽说深入学习Android不久,作为一名有多年编程经验的人来说,我还是吐槽一些比较好。
不好就是不好,理由都摆在那里。
Android群英传的作者,还需要加点油~
相关人士,看着办~(*^__^*)
参考资料
数字推盘游戏
http://baike.baidu.com/link?url=qO5ShCCBQavlEn35RepADpAAl_OZ8CuNjYul6QK_v23hB2XtnFXfSoaHvO043ruLY8hzWedi8lLiH1EaOA_P0K
书籍《Android群英传》,作者博客:http://blog.csdn.net/eclipsexys
作者的拼图专栏:http://blog.csdn.net/column/details/android-puzzle.html
Android群英传-拼图游戏puzzle-6点吐槽的更多相关文章
- Android群英传-拼图游戏puzzle-代码设计和实现
上个周末,3个小时总体上读完了<Android群英传>,本周主要在研究代码层次的设计和实现. 编译安装在手机上,玩了几把,结合代码,一周时间才掌握了整体的思路. 大部分时间,其实花在了 ...
- Android群英传帝落篇——程序人生,路漫漫其修远兮,吾将上下而求索!
Android群英传帝落篇--程序人生,路漫漫其修远兮,吾将上下而求索! 当写这篇博客的时候,自2016-02-22到现在5.2号,一晃眼,也㓟两个多月就过去了,我才将这本书看完,虽然写笔记花了很大的 ...
- Android群英传笔记——摘要,概述,新的出发点,温故而知新,可以为师矣!
Android群英传笔记--摘要,概述,新的出发点,温故而知新,可以为师矣! 当工作的越久,就越感到力不从心了,基础和理解才是最重要的,所以买了两本书,医生的<Android群英传>和主席 ...
- Android群英传笔记——第十二章:Android5.X 新特性详解,Material Design UI的新体验
Android群英传笔记--第十二章:Android5.X 新特性详解,Material Design UI的新体验 第十一章为什么不写,因为我很早之前就已经写过了,有需要的可以去看 Android高 ...
- Android群英传笔记——第十章:Android性能优化
Android群英传笔记--第十章:Android性能优化 随着Android应用增多,功能越来越复杂,布局也越来越丰富了,而这些也成为了阻碍一个应用流畅运行,因此,对复杂的功能进行性能优化是创造高质 ...
- 【Android群英传】学习笔记(一)
本系列博客为笔者在学习<Android群英传>的学习总结 Android相关工具镜像连接:http://www.androiddevtools.cn/ Dalvik与ART Dalvik包 ...
- Android群英传笔记——第九章:Android系统信息和安全机制
Android群英传笔记--第九章:Android系统信息和安全机制 本书也正式的进入尾声了,在android的世界了,不同的软件,硬件信息就像一个国家的经济水平,军事水平,不同的配置参数,代表着一个 ...
- Android群英传笔记——第八章:Activity与Activity调用栈分析
Android群英传笔记--第八章:Activity与Activity调用栈分析 开篇,我们陈述一下Activity,Activity是整个应用用户交互的核心组件,了解Activity的工作模式,生命 ...
- Android群英传笔记——第七章:Android动画机制和使用技巧
Android群英传笔记--第七章:Android动画机制和使用技巧 想来,最 近忙的不可开交,都把看书给冷落了,还有好几本没有看完呢,速度得加快了 今天看了第七章,Android动画效果一直是人家中 ...
随机推荐
- Vue文件封装日历组件
封装就是要具有灵活性,样式自适应,调用的时候传入props就可以变成自己想要的样式. 效果展示网址:https://1963331542.github.io/ 源代码: <template> ...
- HDU-2844 Coins 多重背包 物品数量二进制优化
题目链接:https://cn.vjudge.net/problem/HDU-2844 题意 给你一些不同价值和一定数量n的硬币. 求用这些硬币可以组合成价值在[1 , m]之间的有多少. 思路 多重 ...
- ansible 定义主机用户和密码
定义主机组用户和密码 [webservers] ansible[01:04] ansible_ssh_user='root' ansible_ssh_pass='AAbb0101' [root@ftp ...
- python_三级字典
data = { "北京":{ "昌平":{ "沙河":["oldboy","test"], &qu ...
- pytorch 7 optimizer 优化器 加速训练
import torch import torch.utils.data as Data import torch.nn.functional as F import matplotlib.pyplo ...
- JavaScript 常见创建对象的方式
JavaScript 有哪几种创建对象的方式? javascript创建对象简单的说,无非就是使用内置对象或各种自定义对象,当然还可以用JSON:但写法有很多种,也能混合使用. (1)对象字面量的方式 ...
- shell 测试命令
一.使用 test 命令可以对文件.字符串等进行测试,一般配合控制语句使用. 1.字符串测试 test str1 = str2 //测试字符串是否相等 test str1 != str2 //测试字符 ...
- LaTeX 图片色偏解决方法
本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50327113 在LaTeX的编辑模式中 ...
- Springboot2本地锁实践
在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交…. 下面我们利用 ...
- Java String内存释放
Java String内存释放 这是一个坑,Java对于String对象,不进行内存的回收: 处理大数据量的时候,少用String. 与JDK有关系:jdk1.6环境下,内存只占用10M,jdk1.8 ...