【解決済み】スキルの計算式について教えてください。

ゆ――
記事: 60
登録日時: 2023年5月03日(水) 14:18

【解決済み】スキルの計算式について教えてください。

投稿記事 by ゆ―― »

こんにちは。
続けての質問失礼します。

スキルの計算式についてわからないことがあります。

物理100%依存
a.atk * 4 - b.def * 2
魔法100%依存
a.mat * 4 - b.mdf * 2

まずは、上記で合っていますか?
合っているなら、物理50%は「a.atk * 2 - b.def * 2」で、魔法50%は「a.mat * 2 - b.mdf * 2」ですよね?

では、10%~40%、60%~90%は、どういった式にすればいいのでしょうか?
また、「*3」や「*5」など奇数でもきちんと機能するのでしょうか?
教えていただけると助かります。
最後に編集したユーザー ゆ―― [ 2023年5月05日(金) 21:53 ], 累計 1 回
アバター
くろうど
記事: 318
登録日時: 2016年1月22日(金) 20:52
お住まい: 東京都
連絡する:

Re: スキルの計算式について教えてください。

投稿記事 by くろうど »

物理100%依存
a.atk * 4 - b.def * 2
魔法100%依存
a.mat * 4 - b.mdf * 2

まずは、上記で合っていますか?
まず、上記について、
「100%依存」がどういう意味なのか分からないのですが、
各能力値の使い方は作者が自由に決められるので、
必ずしも合っているとは言えない……という曖昧な回答になります。
10%~40%、60%~90%は、どういった式にすればいいのでしょうか?
次について、
ダメージ計算式では計算結果として1個の値を決めるものなので、
「~」というのが何を指しているのか分かりませんが、
小数が使えますので、90%は 「* 0.9」になると思います。
「*3」や「*5」など奇数でもきちんと機能するのでしょうか?
こちらについては、奇数、偶数、小数どれも機能します。

といったところで、以上をさくっと無視して、
ダメージ計算式について説明すると、

ダメージ計算式では、
小数を含む数値と、
+ 足し算
- 引き算
* 掛け算(×の代わり)
/ 割り算(÷の代わり)
( ) 計算順序を決めるカッコ
などの記号と、
以下の画像にある能力値を指定する文字列が使えます。
(高度なテクニックとしてJavaScriptも使えます)

それらを組み合わせて、ご自身の作りたい計算式を作ってください。
formula.png
formula.png (16.82 KiB) 閲覧された回数 1667 回
おまけ
ダメージ計算式内でJavaScriptを使うことについて気になる場合、
以下の拙作ゲームが少し勉強になるかもしれません。

俺の勉強【JavaScript】初歩
https://game.nicovideo.jp/atsumaru/games/gm9647
(ゲームアツマールのサービス終了までプレイ可能)
▼だいたいTwitterにいます。たぶん。
https://twitter.com/kuroudo119
ゆ――
記事: 60
登録日時: 2023年5月03日(水) 14:18

Re: スキルの計算式について教えてください。

投稿記事 by ゆ―― »

くろうどさま、返信ありがとうございます。

a.atk * 4 - b.def * 2

これが、最初の攻撃にあった式だと思うのですが、それを少し変更して、

Math.max((a.atk * 4 - b.def * 2),a.luk)

とする場合、*0.7をやるとしたら、

(Math.max((a.atk * 5 - b.def * 2),a.luk)) * 0.7

これで合っていますか?
もし、根本的に間違っている場合は、ご指摘いただけると助かります。
アバター
くろうど
記事: 318
登録日時: 2016年1月22日(金) 20:52
お住まい: 東京都
連絡する:

Re: スキルの計算式について教えてください。

投稿記事 by くろうど »

(Math.max((a.atk * 5 - b.def * 2),a.luk)) * 0.7
で合っているかどうかは、
ご自身のやりたい事によって変わりますので分かりませんが、
エラーは出ないと思います。

補足
Math.max((a.atk * 5 - b.def * 2),a.luk)
の部分で、(a.atk * 5 - b.def * 2) または a.luk のうち値の大きい値が選ばれ、
その後、* 0.7 をするので、
(a.atk * 5 - b.def * 2) * 0.7 または a.luk * 0.7 が結果となります。

これがやりたい事であれば合っています。
▼だいたいTwitterにいます。たぶん。
https://twitter.com/kuroudo119
ゆ――
記事: 60
登録日時: 2023年5月03日(水) 14:18

Re: スキルの計算式について教えてください。

投稿記事 by ゆ―― »

くろうど さんが書きました: Math.max((a.atk * 5 - b.def * 2),a.luk)
の部分で、(a.atk * 5 - b.def * 2) または a.luk のうち値の大きい値が選ばれ、
その後、* 0.7 をするので、
(a.atk * 5 - b.def * 2) * 0.7 または a.luk * 0.7 が結果となります。
値の大きいほうとは、
(a.atk * 5 - b.def * 2)で出た数値か、 a.luk=1? のうち大きいほうという意味ですよね?

Math.max((a.atk * 5 - b.def * 2),a.luk)
この式は、「結果が数値0だった場合に最終的なダメージを1で保証する」ということで合っていますか?
合っているなら、私がやりたいことは
「結果の数値が0だった場合は1を最低保証、それ以外だったら(a.atk * 5 - b.def * 2) * 0.5のダーメージ」です。

分かりづらくて申し訳ないですが、つまり、 a.luk * 0.7はしたくないです。
最低保証の1or (a.atk * 5 - b.def * 2) * 0.5の結果、どちらかがダメージとして算出される式を作りたいです。

この場合は、どういった式にすればいいのでしょうか?
アバター
くろうど
記事: 318
登録日時: 2016年1月22日(金) 20:52
お住まい: 東京都
連絡する:

Re: スキルの計算式について教えてください。

投稿記事 by くろうど »

順を追って書いていきます。
値の大きいほうとは、
(a.atk * 5 - b.def * 2)で出た数値か、 a.luk=1? のうち大きいほうという意味ですよね?
Yesです。
(a.luk=1なのかどうかは設定次第です)
Math.max((a.atk * 5 - b.def * 2),a.luk)
この式は、「結果が数値0だった場合に最終的なダメージを1で保証する」ということで合っていますか?
この部分だけを切り取ると No です。

ただし、a.lukが常に1であるならばYesとも言えます。
この場合でも、特に左側(a.atk * 5 - b.def * 2 の部分)はマイナス(0以下の値)になる可能性もあります。
私がやりたいことは
「結果の数値が0だった場合は1を最低保証、それ以外だったら(a.atk * 5 - b.def * 2) * 0.5のダーメージ」です。
「結果の数値」というのが、(a.atk * 5 - b.def * 2) なのか (a.atk * 5 - b.def * 2) * 0.5 なのか分かりませんが、
前者だとしたら、以下でも良さそうです。
(2って部分がスマートではないですが)

コード: 全て選択

Math.max(a.atk * 5 - b.def * 2, 2) * 0.5
また、この計算式中に変化する値はなさそうなので、
三項演算子 (a ? b : c) というものを使うのが手っ取り早い気がします。

コード: 全て選択

(a.atk * 5 - b.def * 2) === 0 ? (a.atk * 5 - b.def * 2) * 0.5 : 1
「結果の数値が0だった場合は」とのことなので、あえて「=== 0」としていますが、
マイナス値を考慮すると「> 1」の方が良さそうです。
▼だいたいTwitterにいます。たぶん。
https://twitter.com/kuroudo119
ゆ――
記事: 60
登録日時: 2023年5月03日(水) 14:18

Re: スキルの計算式について教えてください。

投稿記事 by ゆ―― »

くろうど さんが書きました: 「結果の数値」というのが、(a.atk * 5 - b.def * 2) なのか (a.atk * 5 - b.def * 2) * 0.5 なのか分かりませんが、
前者だとしたら、以下でも良さそうです。
(2って部分がスマートではないですが)

コード: 全て選択

Math.max(a.atk * 5 - b.def * 2, 2) * 0.5
すみません、ずっと書き間違えていました。
Math.max(a.atk * 5 - b.def * 2) * 0.5
ではなく、
Math.max(a.atk * 4 - b.def * 2) * 0.5
です。

「結果の数値」は、(a.atk * 4 - b.def * 2) * 0.5 のほうです。
例えば、
「a.atk * 4」=100
「b.def * 2」=50
とします。
「(a.atk * 4 - b.def * 2) * 0.5」
(100-50)*0.5=25

①a.luk=1
②a.luk=5

「(Math.max((a.atk * 4 - b.def * 2),a.luk)) * 0.5」この式だとしたら、上の数値に当てはめると
ダメージは、
①「25」or「1」
②「25」or「5」

どっちなんでしょうか?
対象のlukが1だろうが100だろうが「25」or「1」?
対象のlukの値により変動する?
後者だとしたら、もし(Math.max((a.atk * 4 - b.def * 2),a.luk)) * 0.5の結果が、(a.atk * 4 - b.def * 2) * 0.5よりa.lukが上回っていたら、ダメージは高くなってしまうのでしょうか?

(a.atk * 4 - b.def * 2) * 0.5 = 25
a.luk = 100
だった場合は、どちらか高いほうなので、lukの影響を受け、最終ダメージは100となってしまうのでしょうか?


また、この計算式中に変化する値はなさそうなので、
三項演算子 (a ? b : c) というものを使うのが手っ取り早い気がします。

コード: 全て選択

(a.atk * 5 - b.def * 2) === 0 ? (a.atk * 5 - b.def * 2) * 0.5 : 1
「結果の数値が0だった場合は」とのことなので、あえて「=== 0」としていますが、
マイナス値を考慮すると「> 1」の方が良さそうです。
ここでも少し分からないことがあります。
=== 0 ?
とはどういう意味か?
最後の * 0.5 : 1の : 1はどういう意味か?
この2点を教えていただけると助かります。

何度もすみません。
長文失礼いたしました。
アバター
くろうど
記事: 318
登録日時: 2016年1月22日(金) 20:52
お住まい: 東京都
連絡する:

Re: スキルの計算式について教えてください。

投稿記事 by くろうど »

「結果の数値」は、(a.atk * 4 - b.def * 2) * 0.5 のほうです。
例えば、
「a.atk * 4」=100
「b.def * 2」=50
とします。
「(a.atk * 4 - b.def * 2) * 0.5」
(100-50)*0.5=25

①a.luk=1
②a.luk=5

「(Math.max((a.atk * 4 - b.def * 2),a.luk)) * 0.5」この式だとしたら、上の数値に当てはめると
ダメージは、
①「25」or「1」
②「25」or「5」

どっちなんでしょうか?
①②ともに、「25」です。
a.lukよりも「50」の方が値が大きいためです。
(Math.max() の外に「* 0.5」があるようなのでMath.maxの比較対象は「(100-50)=50」です)
対象のlukが1だろうが100だろうが「25」or「1」?
対象のlukの値により変動する?
後者だとしたら、もし(Math.max((a.atk * 4 - b.def * 2),a.luk)) * 0.5の結果が、(a.atk * 4 - b.def * 2) * 0.5よりa.lukが上回っていたら、ダメージは高くなってしまうのでしょうか?

(a.atk * 4 - b.def * 2) * 0.5 = 25
a.luk = 100
だった場合は、どちらか高いほうなので、lukの影響を受け、最終ダメージは100となってしまうのでしょうか?
lukの値により変動します。
なので、lukが100なら100になります。
(a.luk なのでスキル使用者のlukである点には注意してください)

そのため、ダメージの最低保証値が 1 であるならば、Math.max()内に 1 と書くことになります。

三項演算子を使用する場合でも 1 にしたいのであれば 1 と書くことになります。

詳しくは以下のリンク先をご覧ください。

Math.max()
https://developer.mozilla.org/ja/docs/W ... s/Math/max

三項演算子(a ? b : c)
https://developer.mozilla.org/ja/docs/W ... l_operator

厳密等価(===)
https://developer.mozilla.org/ja/docs/W ... t_equality
▼だいたいTwitterにいます。たぶん。
https://twitter.com/kuroudo119
ゆ――
記事: 60
登録日時: 2023年5月03日(水) 14:18

Re: スキルの計算式について教えてください。

投稿記事 by ゆ―― »

詳しく教えていただきありがとうございます。
貼っていただいたリンク先のものも、とても勉強になりました。

コード: 全て選択

(a.atk * 4 - b.def * 2) === 0 ? (a.atk * 4 - b.def * 2) * 0.5 : 1
これの意味は理解できました。

ちなみになんですけど、

コード: 全て選択

(Math.max((a.atk * 4 - b.def * 2),a.luk)) * 0.5
この式のa.lukをなくして、

コード: 全て選択

(Math.max((a.atk * 4 - b.def * 2),1)) * 0.5
にした場合は、最低保証ダメージ1ということになりますか?
どちらか大きいほう、a.atk * 4 - b.def * 2) * 0.5の結果が1未満だった場合は、最低保証の1ダメージということになりますよね?

ただ、最初に言ったことが気になっていて、上記の式だと
①(a.atk * 4 - b.def * 2) * 0.5
②1 * 0.5
①の結果が仮に1未満だったとします。
その場合は、②が採用なので1 * 0.5となるわけですが、最終ダメージに小数点で表示することはないですよね? この場合は、1ダメージということになるのでしょうか?



でもやはり、くろうどさまがおっしゃったように、

コード: 全て選択

(a.atk * 4 - b.def * 2) === 0 ? (a.atk * 4 - b.def * 2) * 0.5 : 1
の式のほうが楽なんでしょうか。
上記の場合は、
*0.5のところを変えれば120%や200%もできますよね?(*1.2や*2など)
アバター
くろうど
記事: 318
登録日時: 2016年1月22日(金) 20:52
お住まい: 東京都
連絡する:

Re: スキルの計算式について教えてください。

投稿記事 by くろうど »

ただ、最初に言ったことが気になっていて、上記の式だと
①(a.atk * 4 - b.def * 2) * 0.5
②1 * 0.5
①の結果が仮に1未満だったとします。
その場合は、②が採用なので1 * 0.5となるわけですが、最終ダメージに小数点で表示することはないですよね? この場合は、1ダメージということになるのでしょうか?
小数点をどうするかは実際にツクールで動かして確認してもらうのが確実です。
切り捨てて 0 ダメージのような気はしますが……曖昧です。

ちなみに、
「結果の数値」は、(a.atk * 4 - b.def * 2) * 0.5 のほうです。
とのことなので、
Math.maxのカッコの中に、「* 0.5」を入れちゃって良いと思うんですが、
入れられないとお考えでしょうか?

つまり、↓このようにする。

コード: 全て選択

Math.max((a.atk * 4 - b.def * 2) * 0.5, 1)
これで良ければ、三項演算子は一旦忘れてもらった方が良いかと思います。
▼だいたいTwitterにいます。たぶん。
https://twitter.com/kuroudo119
返信する

“MV:質問”に戻る