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個格子,有個格子專門是“空”的,用來交換,騰位置的。
2.變數命名方式非主流。
private View mPopupView;
竟然用類似“匈牙利命名法”這種。
Java和Android開發,不都是“駝峰式命名”麼?
popupView就可以了。
另外,popupView也符合“約定優於配置”,Android自動提示也更舒服。
3.函式命名不準確。
返回的是DisplayMetrics,它包含的可不只是“螢幕的大小”。
因此,要麼自定義1個實體類,包裝螢幕大小。
要麼,就用getDisplayMetrics更好。
相比之下,類似程式碼的另外一個方法“獲得裝置密度”就更準確一點了,返回的是float,而不是DisplayMetrics。
這個就更準確一下。
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一個新物件,然後返回呢?
重構之後的程式碼:
5.變數作用域太大。
public class ImageUtil {
public GridItem gridItem;
}
定義了1個public欄位,實際上這個欄位只是“某個函式”的一個區域性變數,也沒有被其它類訪問。
因此,不應該定義單獨的欄位,也不應該是public的。
另外,ImageUtil是個工具類,既然沒有必要定義例項欄位,直接把方法定義成static更好。
而不是 new ImageUtil().method();
6.相同的字串,沒有提取成常量。
至少有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
經常寫文章,混了一些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
相關文章
- 自定義上傳圖片拼圖遊戲遊戲
- 前端菜鳥遊戲篇,拼圖遊戲!前端遊戲
- 吐槽visdom
- 對“主資料”的一點吐槽
- 微信小程式:拼圖遊戲微信小程式遊戲
- Android群英傳實踐過程參考文章薈萃Android
- 這幾天,半個獨立遊戲圈都在吐槽這家公司遊戲
- 功能測試吐槽
- 用 JavaScript 實現簡單拼圖遊戲JavaScript遊戲
- 如果吐槽能讓我開心,我想我會請假吐槽
- Rust開發遊戲三年後吐槽:上下文不靈活Rust開發遊戲
- 瘋狂吐槽 MAUI 以及 MAUI 入坑知識點UI
- Android實現拼圖解鎖Android圖解
- “遊戲公司”拼多多遊戲
- 拼圖解謎遊戲:步行者The Pedestrian mac版圖解遊戲Mac
- 吐槽“技術債務” - morethancoding
- 繼續吐槽一下
- 從業者的吐槽:10個遊戲圈朋友7個失業2個轉行遊戲
- win7如何玩三國群英傳2_win7玩三國群英傳2的步驟Win7
- 快遞315,三大頑疾成消費者吐槽熱點
- 完美世界教育首期遊戲吐槽大會 | 策劃給你綁好了,快來坐下“好好聊聊”遊戲
- 稅收漲3%,玩家多付10%?iOS遊戲集體漲價,遭臺灣玩家吐槽iOS遊戲
- 吐槽各大題庫的優劣
- Flutter 吐槽下BottomNavigationBarItem的問題.FlutterNavigation
- 3.15 資料庫吐槽大會資料庫
- 被炒了260年的無味“冷飯”——拼圖遊戲遊戲
- 匿名吐槽:初創團隊遊戲沒做完就沒錢了,我經常拿不到酬勞遊戲
- 吐槽Javascript系列一:slice()、substr()和 substring()JavaScript
- go語言的一些吐槽Go
- 吐槽一下Xcode中的PlaygroundXCode
- oidc-client.js踩坑吐槽貼clientJS
- 不幹啥,吐槽一下CloudflareCloud
- 被吐槽遊戲時長太短!?《瓦力歐製造》系列也許到了需要革新的時候了遊戲
- 遊戲市場一塊被忽視的拼圖——俄語區遊戲
- Quartz.Net 主要概念介紹和吐槽quartz
- 假如易立競吐槽程式設計師。。。程式設計師
- 開源!開源一個flutter實現的古詩拼圖遊戲Flutter遊戲
- 拼高薪、拼福利、拼補貼,上海遊戲大廠成熱門求職聖地?高薪遊戲求職
- 吐槽是門手藝,笑對需要勇氣