メールの返信キタ━━━━(゚∀゚)━━━━!!
……と思って受信したメールを覗いてみたらスパムメールだった_| ̄|○
この怒りはどこへぶつければ?(#`Д´)
昨日の夜からちょっと別館のシミュレータを弄ってました。
これが追加した機能。
// 撃破率99%
function Kill99( pLuck, HP, Sor, Mgr, Dura, eLuck, Effi, Fair, Shoot, Destroy, AbsHit, Luck_array )
{
var i, j = 0;
var Hit, Pro;
var Mini = 65535, Mini_Luck;
// 必要命中数が変化する魔力を格納
// 一撃で倒せる場合
if( 1 <= Destroy ){
var Sor_array = new Array( Destroy + 1 );
}
// 倒せない場合
else{
var Sor_array = new Array( Shoot + 2 ); // 全弾命中しても倒せない場合は発射本数より1多い要素数 + 空白の0項
Destroy = Shoot + 1; // 必要命中数を修正
}
Sor_array[ Destroy ] = Sor; // 最終項は現在の魔力
// 予め現在以下の必要命中数を達成するのに要する魔力を全て計算しておく
for( i = Destroy; i >= 1; i ){
Sor_array[ i 1 ] = DMG_1( HP, Sor_array[ i ], Mgr, Dura, Effi, Shoot, Fair, i );
}
// 最初に耐性が0でないかどうかを判定
if( Dura != 0 ){
// 初めて必中するまで繰り返す
for( i = 0; i <= AbsHit; i++ ){
// 命中率計算
Hit = Hit_Probability( pLuck + i, eLuck );
// 撃破率99%を達成するまで調べる
for( j = Destroy; j >= 1; j ){
// 撃破率計算
Pro = Destroy_Probability( Dura, j, Hit, Shoot );
// 撃破率99%達成
if( 0.99 <= Pro ){
Luck_array[ i ] = Sor_array[ j ] Sor_array[ Destroy ]; // 現在の魔力との差分を記録
break;
}
// 達成しなかった場合
else{
// 尚且つ最後まで調べた
if( j == 1 ){
Luck_array[ i ] = 65535; // 99%達成不可能なので、通常では起こり得ない数値を代入
}
}
}
}
// 最小値を算出
// 配列の要素番号と内容を足して最小のものが最小値
for( i = 0; i <= AbsHit; i++ ){
if( i + Luck_array[ i ] < Mini ){
Mini = i + Luck_array[ i ];
Mini_Luck = i;
}
}
}
else{
Mini_Luck = 0;
Luck_array[ 0 ] = 0;
}
return Mini_Luck;
}
見づらいけど樹にスンナ。
昨日今日とで作ってたプログラム。
作る前はすぐに出来るだろうと思ってたけど地味に凶悪だった(´д`;)
この関数呼び出す前に配列を作るんですけど、
その配列のサイズは 敵の幸運 + 40 プレイヤーの幸運 なんですよね。
で、幸運の入力欄はそれぞれ3桁ずつだから、最大 999 + 40 0 となります。
つまり、最大1023の要素を持つ配列になります。
その全ての要素に対して、
命中率、ダメージ計算、撃破判定、撃破率計算、撃破率99%かどうかの判定を行います。
撃破率99%になるのは魔力がいくつのときか分からないので小さい数値から全て計算していきます。
それで初めて99%になるとbreakします。
というアルゴリズムだったのですが、
重い。
もうね、アフォかと。
JavaScriptって処理遅いんですか?
ブラウザで実行すると警告食らったぞ。
■0→配列の最終項
│
│命中率計算
│
│▲無限
││
││ダメージ計算
││
││総ダメージ >= 敵のHP
││・撃破率計算 >= 0.99
││ ・配列にそのときの魔力を格納
││ ・カウントした魔力を0にリセット
││ ・break
││
││──────
││・魔力+1
││
│▼
■
(似非擬似言語、記述法とかいちいち覚えてない)
たったこれだけがそんなに重いか?
ダメージ計算、撃破率計算の関数でいろいろ計算してるけどそこまで重くなることなんてしてないぞ。
意味ワカンネ('A`)
と、詰まってたわけです。
結局はバグだったわけですが。
(命中率がある程度の低さのときは永久にループを抜けられない)
で、このソースコードのように書き直したんですが、
やっぱり重いですn
今度はちゃんと動きますが。
体力、実行魔法防御、敵の幸運を最大、耐性を1にして計算すると数秒もたつく。
そして警告。
むぅ……。
普通の敵のデータを使う場合は全く問題無いから無視しても構わないけど、
何かムカつくなぁ……。
どうすれば軽くなるかなぁ……。