2

私はドラッグ ウォーズという高校でプレイした古いゲームのレプリカに取り組んでいます。所有する各薬物の数量を保持するグローバル変数があります。もともと私は、各薬の売買操作ごとに異なる関数を使用していました。いくつかのコードを節約し、ある程度のスケール機能を提供しようとして、購入用の 1 つの関数に変更し、drugqty、drugprice (別の関数によって実行)、および drugname を渡したいと考えました。

私が立ち往生している部分は、(関数でローカルに使用される)drugqty をグローバル変数に更新しようとしていることです。

function buy(drugqty, drugprice, drugname)
{
if (money < drugprice)
{
    window.alert("You do not have enough money to do that!")
}
else if(money >= drugprice)
{
var maxdrug = money/drugprice;
var addtoqty;
addtoqty=prompt("How many would you like to purchase? They are $" + drugprice +" a unit. You can afford " + Math.floor(maxdrug) + "." );
if((addtoqty*drugprice)>money)
{
    window.alert("Nice try you need more money to do that!")    
}
else {

drugqty = parseInt(drugqty, 10) + parseInt(addtoqty, 10);
money =  money - (drugprice*addtoqty);
document.getElementById(drugname+"qty").innerHTML=drugqty;
document.getElementById("money").innerHTML=money;

}
}

}

以下は、ある特定の薬の購入ボタンです。

<td><center><button onclick="buy(cocaineqty, cocaine, 'cocaine')">Buy</center></button></center></td>

ボタンが押されると、関数が呼び出され、正しく実行されます。

グローバル変数 cocaineqty を、ローカル関数 drugqty が作成するもので更新する方法を理解する必要があるだけです。

私は次のようなことを試しました

drugname+"qty"=drugqty;

私の2つの考えは、その情報が表示されている場所から再度解析するか、何らかの方法で関数内のグローバル変数を更新することでした(動的に実行できるように、将来的に複数の薬物に使用します)

<td id="cocaineqty" align="center">0</td>

ここに初めて投稿しますが、投稿の変更や間違いの修正を喜んで行います。御時間ありがとうございます!

編集:チェックされた回答に基づいて正しい情報のためにコードを更新しました

function buy(drugqty, drugprice, drugname)
{
if (money < drugprice)
{
    window.alert("You do not have enough money to do that!")
}
else if(money >= drugprice)
{
var maxdrug = money/drugprice;
var addtoqty;
addtoqty=prompt("How many would you like to purchase? They are $" + drugprice +" a unit. You can afford " + Math.floor(maxdrug) + "." );
if((addtoqty*drugprice)>money)
{
    window.alert("Nice try you need more money to do that!")    
}
else {

drugqty = parseInt(drugqty, 10) + parseInt(addtoqty, 10);
money =  money - (drugprice*addtoqty);
document.getElementById(drugname+"qty").innerHTML=drugqty;
document.getElementById("money").innerHTML=money;
window[drugname+"qty"]=drugqty;

}
}

ご支援いただきありがとうございます。

4

3 に答える 3

1

まず、この実装方法は素晴らしいものではありません。改善できることはたくさんありますが、ここで実装を変更しようとするつもりはありません... :)

やりたいこと、つまり実際の名前を知らなくてもグローバル変数にアクセスするには、次のようにします。

window[drugname + "qty"] = drugqty;

これは次の理由で機能します。

  1. ブラウザの「グローバル」変数は、実際にはウィンドウ オブジェクトにあります

  2. JavaScript のオブジェクトは連想配列です。簡単に言えば、キーと値のペアの場合と同様に、名前を介してそのプロパティにアクセスできることを意味します

于 2013-01-08T08:12:14.670 に答える
0

すべての量を 1 つのオブジェクトに保存し、薬ごとにプロパティを追加できます。

var quantities = {};
quantities[drugname + "qty"] = drugqty;

ただし、結果も表示したい場合は、「qty」部分を省略した方が簡単な場合があります。

var quantities = {};
quantities[drugname] = drugqty;

そして結果を表示するために:

var html = "<table>";
for (var quantityName in quantities) {
  if (quantities.hasOwnProperty(quantityName)) {
    html += "<tr><td>" + quantityName + "</td>";
    html += "<td id='" + quantityName + "qty' align='center'>" + quantities[quantityName] + "</td></tr>";
  }
}
html += "</table>";
于 2013-01-08T07:59:57.783 に答える
0

eval()これには次の関数を使用できます。

eval(drugname+"qty"=drugqty);

: オブジェクト指向プログラミングについて学習したほうがよいでしょう。したがって、このクラスのDrug クラスとクラス インスタンス (オブジェクト) を作成して、特定の薬物情報を格納できます。これらのクラスを簡単に通過し、情報を追跡できます。

于 2013-01-08T07:58:48.787 に答える