Android群英傳-拼圖遊戲puzzle-6點吐槽

小雷FansUnion發表於2015-12-05
一、緣由
  經常寫文章,混了一些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

相關文章