Entries

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ニコニコRPGのバーサーカーソウル

タグ: C++

この作品のバーサーカーソウルは、「発動条件:MP80以上」「発動コスト:MP全て」という設定や、発動時の仰々しい演出から考えるに、遊戯の切り札として設計されているように思われる。
しかし実際に使っているところをみると、300程度のダメージを与えるだけでターンエンドすることが多く、燃費の悪い魅せ技という印象が強い。

そもそもこのカードのダメージ計算式はどうなっているのか。
作者のマイリストにはこう書いてある。

バーサーカーソウルの効果は30/40の確率で150ダメージの攻撃。その後成功確率を1/40ずつ減らしながら連続攻撃。

ではこの式をもとに、バーサーカーソウルで与えられるダメージの期待値を計算してみよう。

#include <iostream>
#include <boost/format.hpp>

void play_berserker_soul(int deck_cards, int monster_cards)
{
	int damage = 0; // 累計ダメージ
	double my_turn = 1.0; // ターン到達率
	double expect = 0.0; // 期待値

	boost::format form("%2d %4d %#12g (%f)");

	while(monster_cards > 0)
	{
		// モンスターカードを引く確率
		const double draw_monster_card =
			static_cast<double>(monster_cards--) /
			deck_cards;

		damage += 150;
		my_turn *= draw_monster_card;

		expect +=
			damage *
			my_turn *
			(deck_cards - monster_cards) / deck_cards;

		std::cout
			<< form % monster_cards % damage % my_turn % expect
			<< std::endl;
	}

	std::cout << "期待値: " << expect << std::endl;
}

int main(int argc, char* argv[])
{
	play_berserker_soul(40, 30);
	return 0;
}

以下はこの実行結果。
左から「モンスターカード残数」「累計ダメージ」「ターン到達率」「計算途中の期待値(確認用)」。

29  150     0.750000 (30.9375)
28  300     0.543750 (79.875)
27  450     0.380625 (135.541)
26  600     0.256922 (189.495)
25  750     0.166999 (236.464)
24  900     0.104375 (274.038)
23 1050    0.0626247 (301.985)
22 1200    0.0360092 (321.43)
21 1350    0.0198051 (334.13)
20 1500    0.0103977 (341.928)
19 1650   0.00519883 (346.431)
18 1800   0.00246944 (348.876)
17 1950   0.00111125 (350.122)
16 2100  0.000472281 (350.717)
15 2250  0.000188912 (350.983)
14 2400  7.08422e-05 (351.093)
13 2550  2.47948e-05 (351.136)
12 2700  8.05830e-06 (351.151)
11 2850  2.41749e-06 (351.156)
10 3000  6.64809e-07 (351.158)
 9 3150  1.66202e-07 (351.158)
 8 3300  3.73955e-08 (351.158)
 7 3450  7.47911e-09 (351.158)
 6 3600  1.30884e-09 (351.158)
 5 3750  1.96327e-10 (351.158)
 4 3900  2.45408e-11 (351.158)
 3 4050  2.45408e-12 (351.158)
 2 4200  1.84056e-13 (351.158)
 1 4350  9.20281e-15 (351.158)
 0 4500  2.30070e-16 (351.158)
期待値: 351.158

極端に弱いわけではないが……MP全消費というリスクや演出の長さを考えると、やはり魅せ技と捉えざるをえない。

なお、今回の計算は作者のコメント通り「デッキのカード総数は常に40枚でモンスターカードの数だけが減っていく」という条件で行っているが、もしこれを「カードを引く度にデッキのカード総数も減る」ことにした場合、ダメージの期待値は409.091となり、最高ダメージを拝める確率も0.0000001%まで上昇する。
これなら実用性も……あるか?

スポンサーサイト

コメント

コメントの投稿

コメントの投稿
管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://idlysphere.blog66.fc2.com/tb.php/71-c70c8654
この記事にトラックバックする(FC2ブログユーザー)

Appendix

タグ

Blog内検索

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。