2016-07-12 5 views
0

私は、化学品のゲームをJavaScriptでテレグラムのボットとして作成しています。在庫には配列が含まれていますが、インベントリを貼り付けるだけで、レベルへのブルートフォースを防ぐためには、ユーザー入力に必要な化学物質が排他的に含まれているかどうかを確認する必要があります。アレイ。例えば文字列に配列の特定の要素が含まれているかどうかを確認する方法

users[id].inventory = ["Beaker", "Water", "Baking soda", "Heating plate", "Hydrochloric acid"]; 

if (users[id].level === 1 && 
    msg.text.toLowerCase().indexOf('baking soda') !== -1 && 
    msg.text.toLowerCase().indexOf('hydrochloric acid') !== -1 && 
    msg.text.toLowerCase().indexOf('beaker') === -1 && 
    msg.text.toLowerCase().indexOf('water') === -1 && 
    msg.text.toLowerCase().indexOf('heating plate') === -1) { 

    msg.answer("You mix some baking soda with hydrochloric acid.\nSome fun fizzing happens and you produce useless CO2 gas."); 
} 

あなたがはるかに大きいインベントリを取得し、これは非常に大きなif文にこの道をリードするhigerレベルで。これは悪く見え、よりよい方法が必要です。排他的なindexOf()または他のソリューションのようなものはありますか?私は例えばarr.filter()をチェックアウトしましたが、これを実装する良い方法を見つけることができません。

+1

あなたは、配列を反復するループを使用してみましたか? – nnnnnn

答えて

1

レシピの要件が長く在庫が長い場合は、非常に退屈になることを指摘しているので、すべての成分を手動でチェックするのは良い考えではありません。

私は、要件と使用される項目の2つの配列を取る関数rightIngredientsを作成することをお勧めします。

レシピの項目のみを使用する必要があることを考慮すると、関数内で最初に行うことは、両方の配列の長さをチェックすることです。それらが異なる場合、それはfalseを返すべきで、何もチェックする必要はありません。

配列の長さが同じ場合は、使用されている各項目が要件に含まれているかどうかを確認します。それらのうちの1つがそうでない場合、我々は同様に偽に戻る。

requirements = ["baking soda", "hydrochloric acid"]; 

function rightIngredients(req, uses) { 
    if (uses.length != req.length) { 
    console.log(uses.join(', ')+' are not even the right amount of ingredients'); 
    missing = true; 
    } else { 
    var i = 0; 
    var missing = false; 
    while (i<uses.length && !missing) { 
     if (req.indexOf(uses[i].toLowerCase())===-1) missing = true; 
     ++i; 
    } 
    if (missing) console.log(uses.join(', ')+' are not the right ingredients'); 
    else console.log(uses.join(', ')+' are the right ingredients'); 
    } 
    return !missing; 
} 
rightIngredients(requirements, ["Beaker", "Baking Soda", "Hydrochloric Acid"]); 
// Beaker, Baking Soda, Hydrochloric Acid are not even the right amount of ingredients 
rightIngredients(requirements, ["Beaker", "Baking Soda"]); 
// Beaker, Baking Soda are not the right ingredients 
rightIngredients(requirements, ["Baking Soda", "Hydrochloric Acid"]); 
// Baking Soda, Hydrochloric Acid are the right ingredients 
+0

これは本当に洗練されたソリューションです。これは私が探していたものでした。私は自分自身を思いつくスキルを磨くことを願っています。 – bdbdbd

1

あなたはすべて許可されていない化学物質の配列を作成し、すべての要素がこの条件を満たしているかどうかを確認するためにArray.everyを使用することができます。また、レベルに基づいて異なる組み合わせがあるので、私は、レベルのマップと許可されていない化学物質を作成し、その機能を汎用化することを提案します。続き

はサンプルです:

// Map object of Level and Chemicals 
var map = [{ 
    level: 1, 
    disallowed_chemicals: ['baking soda', 'hydrochloric acid', 'beaker', 'water', 'heating plate'] 
}]; 

// getter function to get map object for current level. 
// If this returns undefined you can assume, incorrect level is entered 
function getLevelMap(u_level) { 
    return map.find(function(o) { 
    return o.level === u_level; 
    }); 
} 

var m_level = getLevelMap(users[id].level); 
if (m_level && 
    m_level.every(function(ch) { 
    return msg.toLowerCase().indexOf(ch) < 0; 
    })) { 

    msg.answer("You mix some baking soda with hydrochloric acid.\nSome fun fizzing happens and you produce useless CO2 gas."); 
} 
+0

レベルに複数のステップがあるので、各ステップで許可されていない化学物質の代わりに必要な化学物質を書き込むのが短くなるため、Marc Copteの答えは私のお気に入りです。 +1の努力。 – bdbdbd

関連する問題