Android群英傳-拼圖遊戲puzzle-程式碼設計和實現
上個週末,3個小時總體上讀完了《Android群英傳》,本週主要在研究程式碼層次的設計和實現。
編譯安裝在手機上,玩了幾把,結合程式碼,一週時間才掌握了整體的思路。
大部分時間,其實花在了“重構”上。
重構的過程,就是學習和思考的過程。
本文,算是一篇學習總結,總體介紹下這款小遊戲的實現思路。
後面抽空,再改造下這個遊戲不合理的設計方式,即格子是N*N+1,而不是N*N個。
寫到快吐了:在寫過的幾百篇文章裡,其中有很多案例了,寫得次數越多,越發現很多流程和思路是一致的。
因此,很有必要把一些通用的知識總結下。寫清楚了,再介紹就清楚多了。
文章的名字初步定為“視覺化介面GUI應用開發總結:Android、iOS、Web、Swing、Windows開發等”,預計2015年12月7日之前發表。
程式碼講解
1.包結構
cn.fansunion.puzzle
--activity
GlobalConst.java 幾個全域性常量
MainActivity.java 遊戲的入口Activity
PuzzleActivity.java 拼圖遊戲過程的Activity
--adapter
MainGridViewAdapter.java 遊戲入口介面的Gridview的介面卡,可以理解成GridView的資料提供者
PuzzleGridViewAdapter.java拼圖介面的GridView的介面卡
--bean
GridItem.java 表格中的1個元素
--util
GameUtil.java 封裝了遊戲規則
ImageUtil.java 圖片處理工具
ScreenUtil.java 螢幕工具
2.基礎類講解
GameUtil.java
isMoveable:判斷圖片是否可以移動,或者稱為“能否和空格進行交換”,根據GridView中的position,判斷是否和空格是“相鄰”的就可以了。
swapItems:交換2個GridItem的位置,在判斷可以移動之後
isSuccess:判斷當前拼圖是否完成
getPuzzleGenerator:生成隨機的Item,就是把N*N個數字的位置,打亂
canSolve:判斷隨機生成的Item是否有解,即能否通過移動交換圖片,還原“原圖”。
(這個地方的設計,也比較坑。我目前認為,可以換種方式生成初始拼圖,即隨機交換空格和周邊的圖片N次。因為“交換是可逆的”,所以總是有解)
ImageUtil.java:把1個圖片,切成N*N個;放大圖片。
ScreenUtil.java:獲得螢幕的大小、密度。
GridItem.java:遊戲拼圖的核心Model,表格中的1項,id、圖片資源id、圖片資源,方便繪圖和遊戲規則實現。
MainGridViewAdapter.java和PuzzleGridViewAdapter.java:繼承android.widget.BaseAdapter,過載若干方法。
GlobalConst.java:一些常量,太簡單了吧。
3.遊戲的流程
遊戲入口MainActivity.java
核心流程:
a.設定主體介面
setContentView(R.layout.xpuzzle_main);
b.初始化其它介面,按鈕等
initViews();
c.資料介面卡
gridView.setAdapter(new MainGridViewAdapter(
MainActivity.this, bitmapList));
d.按鈕、介面等繫結事件
gridView.setOnItemClickListener
e.事件響應
重要事件
a.選擇遊戲難度,儲存到Type欄位中。給使用者一個“彈出對話方塊”選擇。
b.遊戲自帶若干圖片和使用系統圖片。
用表格展示的,Item點選監聽,最後1個圖片,表示選擇“本地相簿或者相機拍攝”,其它圖片就直接選擇了。
本地相簿和相機拍照,是2套類似的邏輯。使用者選擇之後,呼叫相簿相機回撥方法,儲存使用者選擇的圖片。
然後就進入到“拼圖遊戲主介面”了。
拼圖遊戲主介面PuzzleActivity.java
核心流程:
a.設定主體佈局
setContentView(R.layout.xpuzzle_puzzle_detail_main);
b.獲得使用者選擇的圖片,並切圖
getIntent().getExtras().getInt(GlobalConst.SELECT_PHOTO_ID);
c. 初始化其它Views
initViews();
d. 呼叫GameUtil生成遊戲初始資料,並啟動定時器。(寫到這裡突然發現,又不合理了,定時器,應該在程式全部初始化完成之後,再開啟。)
generateGame();
e.事件繫結。
// 返回按鈕點選事件
backButton.setOnClickListener(this);
// 顯示原圖按鈕點選事件
imageButton.setOnClickListener(this);
// 重置按鈕點選事件
restartButton.setOnClickListener(this);
// GridView點選事件(最重要的其實是這個),圖片可否移動,在能夠移動的情況下,需要“交換圖片、”“更新繪圖”、“更新步數”。
//在成功的情況下,後續處理(停止計時等)
4.資源
佈局、選單、字串,結合Java程式碼,很容易讀懂。
程式碼地址:
https://git.oschina.net/fansunion/puzzle
個人看法
目前的技術,入門,達到中級水平,能夠幹活和賺錢,還是比較容易的。
達到一定水平之後,想要繼續高深,就要看個人對技術的理解了。
至於重構、程式碼規範、遊戲設計,每個人都有自己的理解。
結合實際情況,再做具體考量。
編譯安裝在手機上,玩了幾把,結合程式碼,一週時間才掌握了整體的思路。
大部分時間,其實花在了“重構”上。
重構的過程,就是學習和思考的過程。
本文,算是一篇學習總結,總體介紹下這款小遊戲的實現思路。
後面抽空,再改造下這個遊戲不合理的設計方式,即格子是N*N+1,而不是N*N個。
寫到快吐了:在寫過的幾百篇文章裡,其中有很多案例了,寫得次數越多,越發現很多流程和思路是一致的。
因此,很有必要把一些通用的知識總結下。寫清楚了,再介紹就清楚多了。
文章的名字初步定為“視覺化介面GUI應用開發總結:Android、iOS、Web、Swing、Windows開發等”,預計2015年12月7日之前發表。
程式碼講解
1.包結構
cn.fansunion.puzzle
--activity
GlobalConst.java 幾個全域性常量
MainActivity.java 遊戲的入口Activity
PuzzleActivity.java 拼圖遊戲過程的Activity
--adapter
MainGridViewAdapter.java 遊戲入口介面的Gridview的介面卡,可以理解成GridView的資料提供者
PuzzleGridViewAdapter.java拼圖介面的GridView的介面卡
--bean
GridItem.java 表格中的1個元素
--util
GameUtil.java 封裝了遊戲規則
ImageUtil.java 圖片處理工具
ScreenUtil.java 螢幕工具
2.基礎類講解
GameUtil.java
isMoveable:判斷圖片是否可以移動,或者稱為“能否和空格進行交換”,根據GridView中的position,判斷是否和空格是“相鄰”的就可以了。
swapItems:交換2個GridItem的位置,在判斷可以移動之後
isSuccess:判斷當前拼圖是否完成
getPuzzleGenerator:生成隨機的Item,就是把N*N個數字的位置,打亂
canSolve:判斷隨機生成的Item是否有解,即能否通過移動交換圖片,還原“原圖”。
(這個地方的設計,也比較坑。我目前認為,可以換種方式生成初始拼圖,即隨機交換空格和周邊的圖片N次。因為“交換是可逆的”,所以總是有解)
ImageUtil.java:把1個圖片,切成N*N個;放大圖片。
ScreenUtil.java:獲得螢幕的大小、密度。
GridItem.java:遊戲拼圖的核心Model,表格中的1項,id、圖片資源id、圖片資源,方便繪圖和遊戲規則實現。
MainGridViewAdapter.java和PuzzleGridViewAdapter.java:繼承android.widget.BaseAdapter,過載若干方法。
GlobalConst.java:一些常量,太簡單了吧。
3.遊戲的流程
遊戲入口MainActivity.java
核心流程:
a.設定主體介面
setContentView(R.layout.xpuzzle_main);
b.初始化其它介面,按鈕等
initViews();
c.資料介面卡
gridView.setAdapter(new MainGridViewAdapter(
MainActivity.this, bitmapList));
d.按鈕、介面等繫結事件
gridView.setOnItemClickListener
e.事件響應
重要事件
a.選擇遊戲難度,儲存到Type欄位中。給使用者一個“彈出對話方塊”選擇。
selectedTypeTextView.setOnClickListener(
new OnClickListener() {
@Override
public void onClick(View v) {
// 彈出popup window
popupShow(v);
}
});
}
b.遊戲自帶若干圖片和使用系統圖片。
用表格展示的,Item點選監聽,最後1個圖片,表示選擇“本地相簿或者相機拍攝”,其它圖片就直接選擇了。
gridView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View view,
int position, long arg3) {
if (position == photoResourceIdArray.length - 1) {
// 選擇本地相簿 相機
showDialogCustom();
} else {
// 選擇預設圖片
Intent intent = new Intent(
MainActivity.this,
PuzzleMain.class);
intent.putExtra(GlobalConst.SELECT_PHOTO_ID, photoResourceIdArray[position]);
intent.putExtra(GlobalConst.TYPE, type);
startActivity(intent);
}
}
});
本地相簿和相機拍照,是2套類似的邏輯。使用者選擇之後,呼叫相簿相機回撥方法,儲存使用者選擇的圖片。
然後就進入到“拼圖遊戲主介面”了。
拼圖遊戲主介面PuzzleActivity.java
核心流程:
a.設定主體佈局
setContentView(R.layout.xpuzzle_puzzle_detail_main);
b.獲得使用者選擇的圖片,並切圖
getIntent().getExtras().getInt(GlobalConst.SELECT_PHOTO_ID);
c. 初始化其它Views
initViews();
d. 呼叫GameUtil生成遊戲初始資料,並啟動定時器。(寫到這裡突然發現,又不合理了,定時器,應該在程式全部初始化完成之後,再開啟。)
generateGame();
e.事件繫結。
// 返回按鈕點選事件
backButton.setOnClickListener(this);
// 顯示原圖按鈕點選事件
imageButton.setOnClickListener(this);
// 重置按鈕點選事件
restartButton.setOnClickListener(this);
// GridView點選事件(最重要的其實是這個),圖片可否移動,在能夠移動的情況下,需要“交換圖片、”“更新繪圖”、“更新步數”。
//在成功的情況下,後續處理(停止計時等)
gridView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View view,
int position, long arg3) {
// 判斷是否可移動
if (GameUtil.isMoveable(position)) {
// 交換點選Item與空格的位置
GameUtil.swapItems(
GameUtil.gridItemList.get(position),
GameUtil.blankGridItem);
// 重新獲取圖片
recreateData();
// 通知GridView更改UI
puzzleGridViewAdapter.notifyDataSetChanged();
// 更新步數
stepCount++;
stepCountTextView.setText("" + stepCount);
// 判斷是否成功
if (GameUtil.isSuccess()) {
// 將最後一張圖顯示完整
recreateData();
bitmapItemList.remove(TYPE * TYPE - 1);
bitmapItemList.add(lastBitmap);
// 通知GridView更改UI
puzzleGridViewAdapter.notifyDataSetChanged();
Toast.makeText(PuzzleMain.this, "拼圖成功!",
Toast.LENGTH_LONG).show();
gridView.setEnabled(false);
timer.cancel();
timerTask.cancel();
}
}
}
});
4.資源
佈局、選單、字串,結合Java程式碼,很容易讀懂。
程式碼地址:
https://git.oschina.net/fansunion/puzzle
個人看法
目前的技術,入門,達到中級水平,能夠幹活和賺錢,還是比較容易的。
達到一定水平之後,想要繼續高深,就要看個人對技術的理解了。
至於重構、程式碼規範、遊戲設計,每個人都有自己的理解。
結合實際情況,再做具體考量。
相關文章
- 用 JavaScript 實現簡單拼圖遊戲JavaScript遊戲
- Android實現拼圖解鎖Android圖解
- 自定義上傳圖片拼圖遊戲遊戲
- 微信小程式:拼圖遊戲微信小程式遊戲
- Android群英傳實踐過程參考文章薈萃Android
- Android黑白棋遊戲實現過程及程式碼解析Android遊戲
- 前端菜鳥遊戲篇,拼圖遊戲!前端遊戲
- 開源!開源一個flutter實現的古詩拼圖遊戲Flutter遊戲
- Python程式碼實現“FlappyBird”小遊戲PythonAPP遊戲
- canvas拼圖功能實現Canvas
- 圖形驗證碼設計實現
- 3D遊戲程式設計與設計4——遊戲物件與圖形基礎3D遊戲程式設計物件
- java實現人機猜拳遊戲的程式碼Java遊戲
- 設定Android程式圖示和程式標題Android
- Android AOP程式設計之雙擊攔截實現Android程式設計
- 遊戲UX設計:地圖設計的考量遊戲UX地圖
- Android實現買賣商品小遊戲Android遊戲
- 短視訊開發,Android和JS互調實現圖片傳遞AndroidJS
- C#滑動拼圖驗證碼實現筆記C#筆記
- go語言遊戲程式設計-Ebiten渲染一張圖片Go遊戲程式設計
- 基於Nuxt.js實現滑動拼圖驗證碼UXJS
- Vue.js 滑動拼圖驗證碼實現筆記Vue.js筆記
- 遊戲程式設計入門指南遊戲程式設計
- Autofac實現攔截器和切面程式設計程式設計
- 元件-實體-系統 (ECS \CES)遊戲程式設計模型元件遊戲程式設計模型
- C++實用程式設計——坦克大戰小遊戲C++程式設計遊戲
- 遊戲大地圖開發指南:遊戲外部空間設計遊戲地圖
- 《碼農群英傳》連載(一) —— Go 語言之父 Rob PikeGo
- 【乾貨】遊戲介面設計 (五)表現設計遊戲
- “遊戲公司”拼多多遊戲
- 使用svnClientAdapter程式設計控制上傳下載已經實現VNCclientAPT程式設計
- GameFi/NFT鏈遊合成遊戲系統技術程式設計開發程式碼示例GAM遊戲程式設計
- Android Annotation-讓你的程式碼和設計更加優雅(一)Android
- 幽默:遊戲程式設計與其他程式設計完全不同? - hillelogram遊戲程式設計
- 07:蘑菇的前身-蘑菇小方塊的實現#python遊戲程式設計#紅傘傘Python遊戲程式設計
- Android網路程式設計:Retrofit原始碼解析Android程式設計原始碼
- 拼圖解謎遊戲:步行者The Pedestrian mac版圖解遊戲Mac
- OutputStreamWriter介紹&程式碼實現和InputStreamReader介紹&程式碼實現
- “應對型遊戲”和“計劃型遊戲”的設計特點遊戲