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

时间: 2024-10-20 16:57:48

Android群英传-拼图游戏puzzle-6点吐槽的相关文章

Android群英传-拼图游戏puzzle-代码设计和实现

上个周末,3个小时总体上读完了<Android群英传>,本周主要在研究代码层次的设计和实现.  编译安装在手机上,玩了几把,结合代码,一周时间才掌握了整体的思路.  大部分时间,其实花在了"重构"上.  重构的过程,就是学习和思考的过程.    本文,算是一篇学习总结,总体介绍下这款小游戏的实现思路.  后面抽空,再改造下这个游戏不合理的设计方式,即格子是N*N+1,而不是N*N个.    写到快吐了:在写过的几百篇文章里,其中有很多案例了,写得次数越多,越发现很多流程和思

Android群英传笔记——摘要,概述,新的出发点,温故而知新,能够为师矣!

Android群英传笔记--摘要.概述,新的出发点,温故而知新.能够为师矣! 当工作的越久,就越感到力不从心了,基础和理解才是最重要的,所以买了两本书,医生的<Android群英传>和主席的<Android开发艺术探索>.主要是再全面点的把自己所学的知识消化,这样也就不枉自己天天熬夜学习了,如今群英传快看完了.准备又一次再看一遍,同一时候把笔记以博客的形式记录下来,这样或许更加的深刻,然后再消磨一下主席的那本书,这本书有视频解说,更加好,所以估计以后应该非常少再写其它的博客,只是工

Android群英传笔记——第十二章:Android5.X 新特性详解,Material Design UI的新体验

Android群英传笔记--第十二章:Android5.X 新特性详解,Material Design UI的新体验 第十一章为什么不写,因为我很早之前就已经写过了,有需要的可以去看 Android高效率编码-第三方SDK详解系列(二)--Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能 这一章很多,但是很有趣,也是这书的最后一章知识点了,我现在还在考虑要不要写这个拼图和2048的案例,在此之前,我们先来玩玩Android5.X的新特性吧!

对不起!我来晚了!——《Android群英传》出版祭

对不起!我来晚了!--<Android群英传>出版祭 历时将近一年,我的第一本书终于就要出版了,虽然经历种种曲折,历经磨难,最终还是赶在八月份的尾巴上,修成正果. 首先,要向大家道歉,本来预计是在6月份上市的书,一拖再拖,直到现在才得以出版,让不少朋友一等再等,这里,向这些朋友的耐心,狠狠的点个赞. 写书之前 其实,当官杨主编第一次找我写书的时候,其实我是,是想拒绝的,我跟女朋友讲,我拒绝,因为,其实我还只是一个非常普通的开发者--但女朋友对我讲,写书,不一定是要有多么响的名声,用心去写,把自

Android群英传笔记——第八章:Activity与Activity调用栈分析

Android群英传笔记--第八章:Activity与Activity调用栈分析 开篇,我们陈述一下Activity,Activity是整个应用用户交互的核心组件,了解Activity的工作模式,生命周期和管理方式,是了解Android的基础,本节主讲 Activity的生命周期与工作模式 Activity调用栈管理 一.Activity Activity作为四大组建出现平率最高的组件,我们在哪里都能看到他,就让我们一起先来了解一下他的生命周期 1.起源 Activity是用户交互的第一接口,他

《Android群英传》勘误

<Android群英传>勘误 我的新书<Android群英传>刚刚上市不久,希望大家多多支持.本篇为本市的勘误,由于时间仓促,书中难免会存在一些错误,特在此列出这些勘误,也希望广大读者发现错误后,及时在本文评论中贴出来,我将收录到下次的修订中,感谢大家的支持和包容~~ 前言-资源与勘误 --都会上传到Github代码分享平台供大家 frok,下载-- -----> --都会上传到Github代码分享平台供大家 fork,下载-- 本书特色 本书各个章节之间并没有严格的 递近

Android群英传笔记系列一view的介绍

学习完第一行代码后,继续学习Android群英传,希望能坚持下去,好好学习完这本书,并及时做好相关笔记,巩固相关知识: 一. View的介绍: 1`.我们先来看下view树结构: 2.树结构内容: a.viewparent是整棵树的核心,它统一调度和分配所有的交互管理事件. b.控件分为viewgroup和view两种控件,viewgroup作为父控件可以包含多个vie       w控件. c.我们知道在使用控件前都要通过findViewById的方法来实例化控件,那么在树结构中,实际上表现为

Android群英传笔记——第四章:ListView使用技巧

Android群英传笔记--第四章:ListView使用技巧 近期也是比較迷茫.可是有一点点还是要坚持的,就是学习了.近期离职了,今天也是继续温习第四章ListView,也拖了事实上也挺久的了,listview可谓是老牌大将了,非常多的应用场景都要使用它,他也是我们用得最多的控件之中的一个了,尽管如今出来了一个RecyclerView,可是ListView的地位一时半会儿还是撼动不了的.这就促使我们更加应该去把他掌握了 一.Listview经常使用优化技巧 我们一步步来把ListView学习好

Android群英传笔记——第九章:Android系统信息和安全机制

Android群英传笔记--第九章:Android系统信息和安全机制 本书也正式的进入尾声了,在android的世界了,不同的软件,硬件信息就像一个国家的经济水平,军事水平,不同的配置参数,代表着一个android帝国的强弱,所以厂商喜欢打配置战,本节就要是讲 Android系统信息的获取 PackageManager的使用 ActivityManager的使用 Android安全机制 一. Android系统信息的获取 由于android手机的开源性,手机的配置各种各样,那些优化大师之类的东西