IOS期末遊戲-Pokemon:Battle

這次的期末...大概是我做過最醜的UI了...

這次做的遊戲是神奇寶貝的小對戰模擬遊戲,類似回合制的對戰遊戲。

登入畫面 :

註冊之後後台會寄一封驗證的email,需要完成驗證後帳號才會真正開啟。

主頁:會顯示帳號的頭像以及戰績

持有神奇寶貝 : 查看帳號中所持有的神奇寶貝

點入裡面可以查看更詳細資訊

點擊下方技能可以查看技能敘述

戰鬥 :

可以創建房間及加入房間,房間號碼不限於數字,以字串當key

進入房間之後等待玩家加入,點擊準備可以選擇要攜帶的神奇寶貝,雙方都準備完成遊戲即開始。

下面仔細解釋一下戰鬥規則 :
回合制遊戲,雙方決定好行動之後開始動作,無論是選擇換人還是戰鬥都會消耗一個turn。

戰鬥攻擊分為先後攻,雙方神奇寶貝速度較快者為先攻。
戰鬥判定分為三階段:

1.進入戰階前 : 判斷神奇寶貝身上是否有特殊狀態

麻痺 : 降低自身速度,並判定是否成功麻痺導致這回合無法行動
魅惑 : 判定是否成功魅惑導致這回合無法行動
凍傷 : 無法行動
退縮 : 無法行動

2.戰鬥階段 :

會先再檢查一次狀態,再攻擊

中毒 : 損失生命值
劇毒 : 損失生命值,並隨著回合數傷害增加
灼傷 : 損失生命值
寄生種子 : 損失生命值並幫對手回複

攻擊分為三種:一般攻擊、特殊攻擊以及上狀態的攻擊
先檢查這回合能否行動,再進行進行攻擊計算
傷害計算公式為: (2*等級+10)/250 * (攻擊*防禦) * (威力+2) * 加成
若為一般攻擊 套用攻擊與防禦
若是特殊攻擊 則套用特攻與特防
而上狀態的攻擊會額外判定是否成功上到狀態
接著會先判定是否有打中(技能有命中率),再進行傷害計算
其中,加成的算法見下表
技能的屬性以及對手神奇寶貝的屬性有相互克制關係,會分為
效果絕佳 : 2倍
有效果 : 正常 1倍
效果不好 : 0.5倍
沒有效果 : 0倍
更詳細的計算公式可以查神奇寶貝維基百科

傷害計算過後,會檢查是否有特殊狀態

混亂 : 判定是否成功因混亂擊中自己

3.戰鬥階段後 :

檢查雙方神奇寶貝的狀態以及生命值,是否有人死亡。

當其中一方神奇寶貝全部死亡,遊戲結束。

這次的做的其實沒有很滿意,光看畫面十分的粗糙,但其實遊戲背後的計算量挺大的,本來以為只要將遊戲戰鬥寫完,就能速速處裡畫面,但其實出現很多問題。

由於這次一樣是用平板寫,所以無法使用firebase,網路上的資源基本上找不到可以取代的,有支持RealTime的資料庫。
最後找到了Supabase做使用,但其實它本身主要是支持Python、Java及網頁的,雖然有swift的函式庫,但並非官方製作,而是社區中自行編輯出來的,於是在引入套件時就有問題了,除了新版本不穩定無法使用外,如果導入穩定的舊版本,需要再自行寫檔案將套件與swift對接,才能使用。
再來,Supabase的資料庫有非常多奇怪的問題

1.Primary key限定只能使用int
由於我是先設計完架構,寫完戰鬥才去寫資料庫對接的,發現這件事只能將資料庫裡面的資料打掉重新設計。

2.無法設定Foreign key
不知道甚麼原因,他系統內有可以設置的選項,但是無法使用,導致無法使用自訂的型態來包裹各個物件(對沒錯,又再重新改一次結構),只能用基礎的int、string等儲存資料。

3.RealTime不穩定
本來原先是寫監聽整個資料表,但是嘗試許久發現並不會回傳,反覆測試才知道,其功能只有監聽表中單一數值才會比較穩定觸發。並且社區中也有人在抱怨其常常整個系統RealTime整天無法使用。

3.連接異常
其資料庫的連接也不是很穩定,若是過久沒有操作便會強制斷開連接,另外,套件內部也有bug會導致連接斷開,如果在戰鬥期間切去其他view,套件就會跳錯。

總之,這個資料庫真的搞得我頭很痛,本來期望自己能做出很好的遊戲的,結果處裡上面這些問題就處理到幾乎沒時間,導致最後沒時間。
奉勸各位之後不要用這個資料庫寫,真的很難用。

最後附上DEMO影片跟Github連結 :

--

--