張國(guó)榮
摘要:App Inventor是一個(gè)可視化,開源免費(fèi)的編程工具,能夠簡(jiǎn)單快捷地創(chuàng)建Android平臺(tái)上的拼圖游戲APP。利用逆序數(shù)的奇偶性能夠判斷拼圖游戲的解是否存在,保證每一次隨機(jī)游戲都是能夠完成的。改進(jìn)傳統(tǒng)的九宮格布局設(shè)置,拓展到四行三列拼圖的布局;采用微數(shù)據(jù)庫(kù)技術(shù),保存游戲玩家的最新紀(jì)錄,從而增加了游戲的多樣性和可玩性。
關(guān)鍵詞:拼圖游戲;Android;App Inventor;逆序數(shù);奇偶性;微數(shù)據(jù)庫(kù)
中圖分類號(hào):TP319? ? ? 文獻(xiàn)標(biāo)識(shí)碼:A? ? ? 文章編號(hào):1009-3044(2019)03-0096-04
Abstract: App Inventor is a visual, free open-source programming tool, which allows the user to create a jigsaw puzzle application for Android platform. The inverse ordinal number can be used to judge whether the solution of jigsaw puzzle exists or not, and ensure that every random game is solvable. Different from the traditional Nine-palace layout, the game uses four rows and three columns layout, and uses micro-database technology to keep the records of game players. The game is more diverse and fun.
Key words:Jigsaw puzzle game; Android; App Inventor; reverse order number; parity; micro-database
1 概述
拼圖游戲是一款經(jīng)典的休閑智力游戲,點(diǎn)擊屏幕上與空格相鄰的小圖片,交換空格和被點(diǎn)擊小圖片,直到最終恢復(fù)完整的大圖片,能夠以越少的點(diǎn)擊次數(shù)完成越成功。常見的拼圖游戲有3行3列的九宮拼圖和4行4列的十五子棋。
App Inventor是一款由Google公司開發(fā)的在線開放編程工具軟件,用于在Android平臺(tái)上構(gòu)建移動(dòng)應(yīng)用。利用基于Web的圖形化用戶屏幕生成器,可以設(shè)計(jì)應(yīng)用的外觀,然后像玩拼圖玩具一樣,將“塊”語言拼裝在一起,來定義應(yīng)用的行為。用App Inventor來創(chuàng)建一個(gè)拼圖游戲APP,無需編寫傳統(tǒng)枯燥的代碼,只是通過拼裝一個(gè)個(gè)預(yù)設(shè)好的圖形化積木塊來實(shí)現(xiàn)App開發(fā),避免了復(fù)雜的語法錯(cuò)誤,從而使得軟件開發(fā)變得前所未有的輕松和有趣。
2 拼圖游戲APP的設(shè)計(jì)
拼圖游戲可以多行多列,常見的是3行3列的九宮格游戲[1-2],也有4行4列的十五子棋游戲,這里對(duì)傳統(tǒng)游戲進(jìn)行改進(jìn),采用了4行3列的拼圖布局設(shè)置。
2.1設(shè)計(jì)思路
1)首先準(zhǔn)備拼圖素材。選擇一幅圖片,如圖1,寬高大小裁剪成240 像素*320像素, 再通過圖形處理軟件將這副完整圖片切分成4行3 列, 形成12個(gè)80 像素*80 像素的小圖片,選用前面的11張小圖,第12張小圖片不采用,使得大圖片的右下角留出一個(gè)空格,便于游戲中小圖片的移動(dòng)。
2)游戲運(yùn)行后, 玩家可以看到完整的大圖片,單擊開始游戲按鈕,游戲開始,11個(gè)小圖片被隨機(jī)打亂,打亂的過程需要確保大圖一定可以通過移動(dòng)小圖片恢復(fù)。
3)玩家單擊與空格相鄰的小圖片可以移動(dòng)小圖片的位置,并判斷大圖片是否已經(jīng)恢復(fù)完成。
4)拼圖成功會(huì)彈出一個(gè)對(duì)話框,如果創(chuàng)造了新的紀(jì)錄,將會(huì)提示保留。
5)游戲過程可以選擇退出游戲,也可以選擇重新開始游戲。
圖2是游戲的流程圖,邏輯結(jié)構(gòu)并不復(fù)雜,難點(diǎn)在于如何確保隨機(jī)排列的小圖片一定可以通過移動(dòng)恢復(fù)完成大圖片。
2.2需要解決的問題
根據(jù)游戲的設(shè)計(jì)思路,游戲需要解決兩個(gè)關(guān)鍵的問題。
1)如何判斷單擊的小圖片是可以移動(dòng)的,也就是說,如何判斷單擊的小圖片是與空格相鄰的。
可以先計(jì)算空格的坐標(biāo),因?yàn)樾D片的寬度是80像素,所以所有位置的X坐標(biāo)相加應(yīng)該是960像素,那么960減去11個(gè)小圖片的X坐標(biāo)就是空格的X坐標(biāo),同樣地,1440減去11個(gè)小圖片的Y坐標(biāo)就是空格的Y坐標(biāo)。再計(jì)算被單擊的小圖片與空格的距離,使用距離公式,知道兩個(gè)對(duì)象的坐標(biāo),可以很容易求出距離,如果被單擊的小圖片與空格的距離是80,則說明它與空格相鄰,可以移動(dòng)到空格的位置。如果不是,則可以判斷小圖片與空格不相鄰,單擊無效。
2)游戲中大圖片是否一定可以恢復(fù)完成。
游戲是否一定有解,這個(gè)問題已經(jīng)有很多研究成果[3-7],主要是討論九宮格游戲和十五子棋游戲是否有解的問題。網(wǎng)絡(luò)上也有很多討論,并且拓展到任意行和任意列的情形。所有討論的基本思路是類似的,就是利用逆序數(shù)的奇偶性來判斷拼圖游戲的解是否存在,這里,引用文獻(xiàn)[8]中的一個(gè)定理來判斷隨機(jī)打亂后的小圖片是否能夠通過移動(dòng)恢復(fù)成大圖片。
定理:設(shè)兩個(gè)矩陣A和B,將矩陣從左到右,從上到下排成一個(gè)一維數(shù)組,設(shè)其逆序?qū)Φ膫€(gè)數(shù)加上空白格在原矩陣所在的行列號(hào)之和P,若P(A)與P(B)的奇偶性相同,則兩個(gè)矩陣可以通過拼圖游戲規(guī)則進(jìn)行轉(zhuǎn)換。
因此,假設(shè)需要還原的圖像缺的空格是右下角那一塊,我們按照從左到右,從上到下用數(shù)字表示每一個(gè)小圖片,右下角的空格用12表示,然后把數(shù)字排成一個(gè)排列1,2,…,12,顯然,這個(gè)排列沒有逆序?qū)?,空格的行列?hào)之和(4+3=7)是奇數(shù),所以P(A)是奇數(shù),因此,打亂的小圖片必須滿足P(B)是奇數(shù)才能保證打亂后可以恢復(fù)到原來的圖像。例如,用數(shù)字表示小圖片,數(shù)字12表示空格,如圖3,那么打亂后的圖4有解,圖5沒有解。
3 拼圖游戲APP的實(shí)現(xiàn)
3.1設(shè)計(jì)組件,初始化數(shù)據(jù)
在組件設(shè)計(jì)的時(shí)候,使用11個(gè)圖像精靈組件放置11個(gè)小圖片。初始化數(shù)據(jù)時(shí),把精靈放在一個(gè)列表中,精靈的初始位置和空格位置也分別存放在坐標(biāo)列表中,同時(shí)創(chuàng)建一個(gè)隨機(jī)列表用來存放小圖片打亂后的順序,變量“步數(shù)”用來記錄游戲過程中移動(dòng)的步數(shù),變量“空白區(qū)域X”和“空白區(qū)域Y”記錄空格的坐標(biāo),變量“是否成功”記錄游戲是否成功完成,游戲打開時(shí),還需要讀出數(shù)據(jù)庫(kù),把以前的記錄讀取出來,還要設(shè)置小圖片開始時(shí)不能點(diǎn)擊的,因?yàn)橛螒蜻€沒有開始。
3.3單擊小圖片,與空格對(duì)換
游戲通過單擊小圖片,讓小圖片與相鄰的空格對(duì)換,多次操作,小圖片可以移動(dòng)到原來的位置。移動(dòng)前,需要計(jì)算空格的位置,然后計(jì)算小圖片與空格的距離,判斷小圖片是否與空格相鄰,如果相鄰,則小圖片和空格對(duì)換。單擊小圖片的操作是一樣的,所以代碼是類似,這里只列出第一個(gè)小圖片的代碼。
3.4判斷圖像恢復(fù)完成
每一次單擊小圖片,移動(dòng)小圖片之后,都需要檢查是否所有小圖片都恢復(fù)到原來的位置,如果所有小圖片已經(jīng)恢復(fù)完成,給出提示信息,如果創(chuàng)造新的紀(jì)錄,則保存在微數(shù)據(jù)庫(kù)中。所有精靈不啟用,游戲結(jié)束。
3.5運(yùn)行結(jié)果及討論
游戲開發(fā)完成后,測(cè)試運(yùn)行順利,說明對(duì)小圖片排列的順序打亂有效而且可解,游戲更加多樣和好玩。更進(jìn)一步地發(fā)現(xiàn),游戲中的小圖片可以修改成任意行任意列,完整大圖的空格也可以出現(xiàn)在任何一個(gè)位置。
4 結(jié)論
拼圖游戲是一款經(jīng)典的休閑智力游戲,不管在計(jì)算機(jī)還是在手機(jī)上都吸引著不少人參加,使用App Inventor這個(gè)開發(fā)工具,可以簡(jiǎn)便的開發(fā)出在手機(jī)上運(yùn)行的應(yīng)用,而且,游戲改變了傳統(tǒng)的3X3或4X4布局,考慮解的存在問題,具有一定的實(shí)用價(jià)值和意義。
參考文獻(xiàn):
[1] 蔡艷桃. App Inventor隨機(jī)九宮格拼圖的實(shí)現(xiàn)[J].計(jì)算機(jī)光盤軟件與應(yīng)用,2014(9):172-173.
[2] 余戰(zhàn)秋. 基于App Inventor的九宮格拼圖游戲設(shè)計(jì)與實(shí)現(xiàn)[J].電腦編程技巧與維護(hù),2017(18):34-36.
[3] 畢智超. 基于重排九宮問題的算法設(shè)計(jì)與實(shí)現(xiàn)[J]. 技術(shù)與市場(chǎng),2017, 24(9):53-54.
[4] 黃沛杰. 重排九宮問題的分析與實(shí)現(xiàn)[J]. 現(xiàn)代計(jì)算機(jī),2003(12):74-77.
[5] 杜海清. 快速判斷“重排九宮”初始狀態(tài)解的存在性[J].計(jì)算機(jī)應(yīng)用,1993(6):59-61.
[6] 易校尉. 重排九宮問題的推廣及可解性定理[J].武漢工業(yè)學(xué)院學(xué)報(bào),2013,32(3):58-60.
[7] 吳辰渝, 常文武.15子棋的數(shù)學(xué)探究[J].上海中學(xué)數(shù)學(xué),2012(1):95-96.
[8] realmagician. 拼圖游戲可解性判斷[EB/OL]. https://blog.csdn.net/realmagician/article/details/17395035.
【通聯(lián)編輯:謝媛媛】