Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android群英傳-拼圖游戲puzzle-6點吐槽

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

編輯:關於Android編程

一、緣由
經常寫文章,混了一些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。用常量表示,容易維護。


更多地方,就不吐槽了~

 

c.更改游戲設計,增加1個格子,大幅度改版的,暫時還在研究中~後續公開~

五、寫在最後
不少人讀過博主的“拼圖游戲系列文章”,也有部分人讀過博主的“Android群英傳”這本書。
雖說深入學習Android不久,作為一名有多年編程經驗的人來說,我還是吐槽一些比較好。
不好就是不好,理由都擺在那裡。
Android群英傳的作者,還需要加點油~
相關人士,看著辦~(*^__^*)
 
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved