--- title: Attribute計算小數 tags: math, number theory --- # Attribute計算小數 Minecraft僅有提供記分板計算,但其只能處理整數資料,還必須要進行型態轉換, 對於大部分需要小數計算的數據而言很不方便 我們的目的是在於可以將「小數變數」直接進行計算,而不需要轉換成記分板的形式 而在Minecraft中其實已經有提供一個小數運算的機制,也就是Attributes 利用修改attributes的修飾符(Modifiers)可以進而實現加減乘法的效果 --- ## 屬性修飾符(Attribute Modifiers) 一共有4個參數 * Name : 名稱,不是特別重要 * Amount : 此修飾符的值 * UUID[4] : 帶四個整數(int)的陣列,在同一個修飾符組中不得有重複者 * Operation : 以Amount進行指定的屬性操作方式,一共有3種操作選項: * 0 : add * 1 : multiply_base * 2 : multiply 其結算方式可以直接參考此式子: $(\text{Base}+\Sigma A)\cdot(1+\Sigma N)\cdot\Pi(1+M_i)$ $\Sigma A$ : 所有修飾符中Operation為add者的Amount總和 $\Sigma N$ : 所有修飾符中Operation為multiply_base者的Amount總和 $\Pi(1+M_i)$ : 所有修飾符中Operation為multiply者,將各者Amount加1之後再乘起來的總值 --- ## 問題 首先我們會遇到兩個問題: 1. 計算乘積時會需要處理式子中額外+1的問題 2. 沒有辦法「修改」已存在的修飾符之Amount值 針對第一點其實並不難,我們可以將其變成一個「二元運算」的方式就好,計算時再額外放入一個{Operation:1, Amount:-1}的東東來去除+1的部分 第二點的問題如果想測試的可以自行測試看看: `data modify entity ... Attributes [0].Modifiers[0].Amount set value 77.0` 執行完後查詢同樣路徑,會發現值沒有更改 `data get entity ... Attributes [0].Modifiers[0].Amount` 比較難處理的是第二點,如果改不了屬性值不就等於沒救了?不等等,還有一個替代方案可以處理這個問題 ### 解法 這條指令是可以成功修改修飾符的: `data modify entity ... Attributes[0].Modifiers set value {Name:"add", Amount:1.0d, Operation:0, UUID:[I;0,0,0,0]}` 與其說是修改,倒不如說是新放入一個新的修飾符,因為舊的Modifiers資料都不會消失 只有set和merge的操作是有效的,其他像是append, prepend, insert全部都沒效 故我們要做的是就是先建構好Modifiers的部分, 可以利用storage開一個陣列來建,過程並不會特別複雜 --- ## 加減乘的運算 基本上「加減乘法」皆適用這樣的流程方式來計算: 1. 建構Modifiers列表 2. 生成實體,初始化屬性Base值為0,並將建好的Modifiers放到該屬性中 * ### 加法運算(Addition Operation) $\text{Base} = 0$ $\Sigma A = a+b$ $\text{result} = (0+a+b)$ * ### 減法運算(Addition Operation) $\text{Base} = 0$ $\Sigma A = a-b$ $\text{result} = (0+a-b)$ * ### 乘法運算(Multiplication Operation) $\text{Base} = 0$ $\Sigma A = a$ (這裡也可以改成修改Base) $\Sigma N=b-1$ $\text{result} = (0+a)\cdot(1+b-1)$ > 建議嘗試推廣出連乘 $(a\times b\times c\times d)$ 或連加 $(a+b+c+d)$ 的方式 ---