[回到版面]
回應模式
名 稱
內 文
附加圖檔[] []
  • 可附加圖檔類型:GIF, JPG, JPEG, PNG, WEBM,瀏覽器才能正常附加圖檔
  • 附加圖檔最大上傳資料量為 3072 KB。
  • 當檔案超過寬 125 像素、高 125 像素時會自動縮小尺寸顯示
  • 目前附加圖檔使用量大小: 257177 KB / 500000 KB
  • 回覆時程式碼縮排會被trim消掉,請善用[code][/code]標色或貼到ideone等網站
  • LaTeX記法可以用「$$」或「\( \)」包起來,例如「$\sum_{k=1}^{k=n} k^2 = \frac{n(n+1)(n+2)}{6}$」
  • 投稿時請點擊畫像認證後,再按下 [送出] 按鈕提交。
  • 鬧板、攻擊性發言、煽動性發言請無視(回應者也無視),並使用del或在貓管理部向管理員回報。
  • 新介面尚處於測試階段,如果有任何問題可以向管理員或於程設交流版反映。

檔名:1589294245994.jpg-(47 KB, 424x463)
47 KB
無題請教一下遊戲程式,引撃UE420/05/12(二)22:37:25 ID:8FZiAguANo.14165del
小弟最近在搞腳色的等級系統,雖然整體上是沒問題也完成了,但我這産生了一個疑問
希能大家能指正一下,我是否觀念有錯

這是小弟目前的HP公式
Max_Health = Health_Base + Equipment_Health_Plus + Potion_Health_Plus;

Health_Base這部份為因為會從等級去讀取表格而變化
Health_Plus則是裝備引響的血量
Potion_Health_Plus 則是增加像永久數值的增加的道具

我為了避開因為等級提升之後,而直接讀取 Max_Health 的數值,而忽略 Equipment_Health_Plus 和 Potion_Health_Plus
所以用這方式,再加上一個 NOW_Health(玩家的實際血量),光一個HP就可以佔5次的宣告
感覺有點怪怪的,假如再加上,Magic,Defense,Strength,Luck等等數值,那光宣告這些數值
不就少說要宣告個60幾個以上嗎,同樣的問題,小弟目前設有一堆檢測,像技能是否在冷卻中(bool)
腳色是否浮空(bool),是否移動中(bool),就連攻擊也有用(bool),算一算少說也有100個以上

我的疑問是一直宣告或是使用一堆bool檢測,像這樣沒問題嗎
對程式是否有影響
無名20/05/13(三)00:25:29 ID:6sp/fs2UNo.14166del
沒有問題
這年頭的電腦很強的,算這些小東西比呼吸還簡單
只要不是用很大的數字for兩層以上的寫法基本上都不會感受到效能差異

你要在意的是你的程式好不好讀、你以後要改東西會不會改到崩潰
邏輯上有需要分開的東西就分開、有需要合起來的就合起來
那些檢測吃的運算資源與變數佔用的空間都不是問題
在程式碼裡佔的行數、修改時佔用你大腦的記憶體空間才需要省
無名20/05/13(三)14:20:41 ID:4i.RgKMwNo.14167del
>>腳色是否浮空(bool),是否移動中(bool),就連攻擊也有用(bool),算一算少說也有100個以上

跟遊戲引擎本身吃掉的記憶體比起來
由你使用的單一玩家腳色數值占用實在是不能相比

假設有100個int 也才3200位元 不過0.4kb
現在個人PC基本上都有8G以上

>>一堆bool檢測
如果你有很長一串if else if來判斷 你應該要考慮維護問題
無名20/05/14(四)23:33:01 ID:zzdPj8CsNo.14170del
感謝兩位前輩的說明,解決了我心中的疑惑, 放心的把所有東西弄好了
中間我產生了一個想法,我又不用在遊戲一直確認 Max_Health 的數值變化,只要像是進入遊戲
或是升級或是調整裝備技能等,會產生數值變化的條件下,才會去計算 Max_Health
所以我又增加確認數值的功能(感覺上應該可以減少電腦運算),但如上面所說這年頭的電腦很強的
應該是沒差啦(遊戲玩家修改數值的事我不想去考慮)

>>>如果你有很長一串if else if來判斷 你應該要考慮維護問題
這個問題你說的說中了,可以請教一下考慮維護問題
小弟不太董你的維護指的是什麼(本人太菜了,程式還是看範例自已學的)
是指讓之後要修改,或是其他人否能讀出來的問題嗎
還是指正常運行中bug的問題
無名20/05/15(五)01:16:17 ID:PmVUQNV.No.14171del
>>14170
你自己寫出來的東西
三個月後再看
十分有可能你自己也不知在寫什麼
拆function, 下註解, code太長的話會大腦當機的
無名20/05/15(五)02:55:16 ID:ontnBtPINo.14172del
強烈建議學學"設計模式(design pattern)",這會對你的程式設計很有幫助。
以你的問題來說就是抽象程度不夠,
Health、Magic等等數值計算方式"結構上"是一樣的,你應該抽出來。
最後是個人意見,你可以參考一下這樣的寫法
from enum import Enum

class StatusEnum(Enum):
health = 'health',
magic = 'magic',
endurance = 'endurance'

class Status:
def __init__(self, base):
self.base = base
self.value = base
self.calcList = []
def calc(self):
value = self.base
for calcFunc in self.calcList:
value = calcFunc(value)
self.value = value
return self.value

class Character:
def __init__(self):
self.statusDict = {}
def calcAll(self):
for status in self.statusDict.values():
status.calc()

class Modifier:
def __init__(self, modiDict):
self.modiDict = modiDict

def main():
player = Character()
player.statusDict[StatusEnum.health] = Status(100)
player.statusDict[StatusEnum.magic] = Status(50)
player.statusDict[StatusEnum.endurance] = Status(20)
equipmentList = []
equipmentList.append(
Modifier({
StatusEnum.health: lambda value: value*1.5
})
);
equipmentList.append(
Modifier({
StatusEnum.magic: lambda value: value+35,
StatusEnum.endurance: lambda value: value/2
})
);
for equipment in equipmentList:
for status, calc in equipment.modiDict.items():
player.statusDict[status].calcList.append(calc)
player.calcAll();
for name, status in player.statusDict.items():
print('Player {name}: {base} -> {value}'.format(name=name, base=status.base, value=status.value))

if __name__ == '__main__':
main()
無名20/05/16(六)21:55:46 ID:1QvZI5rQNo.14179del
現代的主流想法認為
寫程式除了跑得動以外,最重要的是維護性
相對來說執行速度、編譯速度、記憶體佔用量等等則被認為不需要在意

維護性包含很多細項
大致上來說就是你要看得懂你的程式碼、修得動你的程式碼
當你的程式出現了bug
你要能很快地知道你的程式裡有bug
例如自我檢測,三不五時檢查一下你的各項數值是否出現預期之外的值(ex.負等級),出現了要通知你
你要能很快地找到有嫌疑的程式碼在那裡
例如把等級相關的處理都放在同一個檔案而不是散落各地,完全無關的東西(ex.畫面輸出)則分離出去不要混在一起
你要能很快看得懂你自己很久以前寫的程式碼在寫什麼
把變數命名得很明確,而不是aaa=bbb^efe+ccc|ddd;這種看起來像亂碼的東西

即使沒有出現bug,你也得考慮你日後加新功能時好不好加
你的資料架構要允許擴增新的東西上去,而不是貿然把空間塞滿只為了省幾個byte
你要能找到你需要改的程式碼在那裡
你不能有兩份以上相同的程式碼出現在不同地方,不然你改完一邊後你還得去每一份複製品那裡再改一次
如果有新角色既不飛行也不步行(ex.游泳),你需要改動多少東西?
如果技能冷卻出現了新的型態(獨立冷卻、共用冷卻、全隊共用冷卻),你需要改動多少東西?
如果你改變能力值隨等級成長的曲線呢?能否讓改版前已經高等的角色適用新的成長曲線?
你的程式改版後能否讀取到舊的存檔?


>>是指讓之後要修改,或是其他人否能讀出來的問題嗎
>>還是指正常運行中bug的問題
維護程式碼的終極目的是讓運行時不要出問題、不要出現不正常的運行
而讓程式碼易讀易改是當你要達成上述目的時公認最有效的手段

如果你只是自己寫爽的,你不需要擔心別人讀不讀得懂
但你必須讓幾個月後失憶的你自己讀得懂
無名20/05/16(六)22:03:42 ID:Gs4vgFhENo.14180del
以前需要斤斤計較的東西現在很便宜
人力比較貴 需求更常變動
維護性就漸漸比較重視
無名20/05/16(六)22:06:43 ID:Gs4vgFhENo.14181del
不過新手或老大粗 通常都是兩者都不管
過一段時間 自己寫的code看不懂要看很久
或碰到效能瓶頸 的時候 才會開始重視
原PO20/05/18(一)00:44:24 ID:RsRLitGoNo.14190del
感謝大家的指導,會把大家的建言警記在心

我覺的我碰到一個好的教學的範本,小弟照著範本的做法
在不知道的悄況下都有做到一些了,像是class,命名,拆解,注解等等
雖然我不是很清處我做的好不好,至少三個月內再去看還沒問題

很感謝 No.14179 所提的問題
小弟目前就只是學習同時去試著做個小遊戲出來
你這麼一說反而讓我發覺很多的問題都沒有想到
很感謝你所提出的問題
原PO20/05/22(五)00:37:24 ID:lklgyf9ANo.14200del
請教一下一個相當白痴的問題
小弟的等級和人物操作以經搞的的差不多了
但有個問題,我人物是分成兩個部份去做的

CharacterBase.h :主要是放人物攻擊和移動等操作,碰撞判定之類,包括動畫音效之類的
PlayerController.h :主要是放人物數值資料,(預定還有人物的物品裝備選單設定等等,但尚在研究中)

我有部份重要的技能像二段跳,開鎖的技能,畜力攻擊之類的
操作全是 CharacterBase.h 裡面
鎖定是否能使用的鎖定,則是放在 PlayerController.h
宣告則是 bool Double_jump; bool HoldAttack;之類的

我的問題是如何讓 CharacterBase.h 去接受 PlayerController.h 數值
一開始還以為在CharacterBase.h 中添加 #include "PlayerController.h"
就以使用這些bool值,跟直接使用一樣涵式,但似乎是我想的太簡單了
無名20/05/22(五)01:09:46 ID:mgbXVWN6No.14201del
>>14200
在PlayerController.cpp裡面把HoldAttack宣告成全域變數
就是宣告在函式外面
然後不要加static (如果你的範本有的話,砍掉)
bool HoldAttack;
void otherFunction(){
//...
}


在CharacterBase.cpp裡面宣告說你有一個變數叫HoldAttack在其他檔案裡
方法是在宣告時加上extern
extern bool HoldAttack;
void otherFunction2(int a){
//...
}


在編譯產生exe的時候要把PlayerController.o跟CharacterBase.o都列進去
這步驟一般來說IDE會幫你做好,你不用自己弄
這樣應該就可以了

有extern的變數宣告就跟只宣告不實作的函式意思一樣
一般來說會把extern bool HoldAttack;跟void otherFunction();寫在PlayerController.h
其他.cpp只要 #include "PlayerController.h"就可以使用HoldAttack跟otherFunction了

沒有extern的變數宣告則跟函式實作一樣
只能有一份存在,不然會衝突
所以放在.cpp而非.h裡


【刪除文章】[]
刪除用密碼: