標籤

2019年6月20日 星期四

文字戰爭

Date: 20190620
Version: 5

主要是我在Google play上看到一個遊戲,叫做「BattleText」,其實就是英文版的文字接龍,連結放在下面,大家有興趣的可以下載來玩玩看,還不錯玩。

玩著玩著,就想到是不是也可以做一個中文版的呢?而且上Google play查了一下,好像也沒有類似的遊戲產出,所以就想是不是可以自己做一個呢?

使用的工具還是App Inventor 2,大部分設定還是參考「BattleText」這個遊戲,之後在依照中英文的差異進行調整,製作步驟如下:

  1. 首先要有中文的字詞資料,後來就找到教育部國語辭典公眾授權網,有公開的資料可以使用,所以我就載了檔案下來。
  2. 接下來要處理這些文字資料,這些檔案都是EXCEL,我使用PERL,將EXCEL轉成JSON格式的字串,格式內容為:{第一個字:{字詞長度:[符合長度的字詞組]}},另外,為了增加字詞量,我又把唐詩三百首加進去,來進行擴充,接下來我就直接把整個字串貼進AI2中。
  3. 接著開始設計APP的介面,第一頁是參數設定頁,控制字詞量及電腦難易度,沒錯,這第一版我還是設計成單機版,後續若成功才會繼續規劃連線版,提供雙人對戰;而這些參數會使用TinyDB儲存。
  4. 第二頁則是對戰畫面,主要是復刻「BattleText」的畫面出來,包含色系,比較不一樣的是「BattleText」有自刻鍵盤出來,當然注音也是可以刻出來的,但這只是初期版本,其實不太需要,而且注音還會有注音比對的問題,所以這一版就沒有刻出注音鍵盤出來,再來是原作中有時間限制,目前這版本也沒有。
  5. 再來是中英文差異的部分,首先遊戲裡面的分數,是按照字詞長度來計算的,所以就要比較中英文字詞的長度差異,首先,英文部分,是拿網路上隨便幾則TOEIC必考幾千字的那種字串來計算,而中文則是拿教育部的資料來計算,目前計算結果是中文長度:英文長度=2.8:6.9;而分數又跟獲勝分數有關係,遊戲中獲勝是50分,依照比例計算,中文獲勝分數應該是20.3,四捨五入為20分。
  6. 結果還不錯,程式邏輯都不算難寫,使用MIT AI2 Companion,測試結果都可以正常運行,當然還有很多BUG出現,但那都是邏輯可以處理的問題,但最有問題的是,無法產出APK檔,但我的檔案也沒有很大,AIA檔沒有超過1MB,所以就開始試錯了。
    1. 刪除兩頁,正常。
    2. 刪除第一頁,有問題。
    3. 刪除第二頁,正常,合理懷疑應該是辭典出了問題。
    4. 刪除辭典部分,正常,那就是辭典有問題,但程式測試正常,可以正常運作。
    5. 所以我猜測是因為在一個TEXT的元件中,無法放太多或太長的字串在其中,因為基本上我把一個字典的字詞都放進去了。
  7. 所以綜上述所說的,大概有幾種解法,第一,改成網路連線抓取資料,使用Firebase,第二,就是分解我的JSON格式字串,降低單一元件的負載量,第三,改存成txt檔後上傳當附件,直接讀取附件;目前我嘗試過第三點,但是失敗了,不知道為什麼,總會有錯誤訊息產生,但明明內容就跟原本一樣,所以目前傾向第二點進行解決,後續持續更新進度。
  8. 有關此APP的相關截圖,請參考下方圖片1-5。
  9. 依照第7點進行改進,結果第二步驟還是太長了,無法轉成APK檔,所以只能朝第一點進行改進,目前測試如果將整個JSON格式字串上傳的話,下載下來的資料會有問題,所以還是會將資料分解後上傳,本來打算上傳後,下載存成內部資料,但不知道為啥,都無法順利下載,所以之後作法就是,將整體的資料流透過Firebase進行,而不進行存取在本機當中,後續持續更新進度。
  10. 為利於本案之進行,重新定義字詞存在的意義:
    1. 為了遊戲可以進行,而不是講一個無法接下去的字,而是在可以接下去的前提下,盡可能的提高字詞長度來達到高分,故進行以下調整,將字首和字尾沒有交集的去除掉,也就是說若字首無法是別的字尾,字尾無法是別的字首的話就去除。
    2. 循環字的去除,也就是指長度為2,且字首=字尾的去除,避免一直重複皆同一單詞。
  11. 後來在建置/使用Firebase上遇到一些問題,解決如下:
    1. perl重組後另存成utf-8格式之檔案。
    2. 修改副檔名為json。
    3. 用notepad++開啟後,可以看到編碼為utf-8<BOM>,請轉譯成utf-8即可。
    4. 上傳Firebase就完成了。
    5. APP Inventor 2上,單一頁面只允許存在一個Firebase的元件,超過1個以上的話,就會發生錯誤。
    6. 故在使用Firebase的元件時,需加入各狀態之標籤,確認要進行是哪一個Firebase的讀取。
  12. 終於完成了初版,可以真正打包成APK檔,並可安裝在手機裡了,可以正常遊玩,後來在玩的過程中,發現即使是長度(2~3)的難度,都是有難度的,因為電腦永遠先起手,永遠比玩家多2~3個字,如果是其他難度的話,就可能一開始玩家就輸不只2個字以上,這其實是蠻困難的,這也是因為中文與英文的差異,這部分之後再用統計的方式說明,所以在電腦起始時,不論難度為何,都是設定成長度2的字詞。
  13. 再來是遊玩時,當開始戰鬥時,第一個字詞的出現都需要等上一段時間,這很可能是與Firebase進行連線所消耗的時間吧?所以之後打算再加一個進度條的元件,讓玩家知道遊戲是正常運作中的。
  14. 再來是為了降低難度,將原有的3個難度,調整為6個難度,這也是依照中文字詞的特性進行重新分組,例如:長度4是因為成語,長度5是因為五言絕句/律詩,長度7則是因為七言絕句/律詩。
  15. 基本上已經完成了,接下來就是提供給其他人進行測試,點擊下載APK(連結),遊玩時,若有任何BUG或優化事項,都歡迎在文章下方留言,感謝協助。
  16. 目前一些改動如下:
    1. 已經加入進度條,避免以為APP當掉了。
    2. 電腦起始字,刪除一些沒有2個字的首字。
    3. 字典統一成一個,就如同英文就是一本字典,這也是中英文比較不一樣的地方,中文可以有很多類似:詩經、花間集、宋詞、元曲...等。
  17. 再來說說中英文統計上的差異:
    1. 英文平均長度為6.69,標準誤差是3.48,所以正負1.5SD的話,長度大概是3~10。
    2. 中文平均長度為2.5,標準誤差是1.38,所以正負1.5SD的話,長度大概是1~4。
    3. 所以從上面可以看出來,英文對於先手優勢沒有那麼大,因為標準誤差很大,很容易就在後面的單字上追上去,反過來,中文誤差較低,就顯得先手優勢很難追上。
    4. 英文因為長度,所以分數是50,依照比例原則,中文大約是18.65分,進位到十位數,變成20分會比較好看。
  18. 目前大概就是這樣了,如果沒有其他因素的話,更新大概就先這樣了,等以後有動力再來改。

圖片:
1. 第一頁,設定相關參數,包含辭庫量、電腦難易度,其實我也有想到還可以加入許多設定,包含時間限制、字串長度限制、獲勝分數限制...等。


2. 一樣要放的版權聲明,包含教育部的資料,及ICON的資料,我這次的ICON設計是無限之蛇,也就是銜尾蛇的概念,也就是接龍啦~~XD


3. 遊戲開始畫面,會先從電腦開始隨機出題。


4. 字詞輸入畫面。



















5. 獲勝畫面。 




















6. 中英文比較















參考文獻:
  1. BattleText
  2. 教育部國語辭典公眾授權網
  3. 漢語大詞典
  4. ICON

沒有留言:

張貼留言