0

Google Docs Spreadsheet API を使用して、友人同士の競争を追跡しています。私にはいくつかの大きなアイデアがありますが、今は困惑しています。ループ内で 20 個の異なる配列を作成し (以下を参照)、ループ外でそれぞれを評価しようとしていますが、実際には 20 個の "if...then" ステートメントを書きたくありません。

注: 次の概要は、私の質問への回答に役立つ場合とそうでない場合があります。コードまでスキップして、必要に応じてこれを読んでください:)

プログラムの概要: 各プレーヤーは、一連のバイナリ結果イベントの 1 つの可能な結果を​​優先してポイント値を割り当てます。イベントが発生すると、プレーヤーは、結果が発生した場合に割り当てられたポイントを獲得するか、反対の結果が発生した場合にポイントを獲得しません。私の目標は、1) プレイヤーがいつ脱落するかを正確に把握し、2) 1 位タイになるチャンスを得るために勝たなければならない残りのすべてのイベントを強調することです。

すべての可能性を何らかの方法で評価しようとする代わりに (5 人のプレーヤーが選択し、2^16 の結果が得られる... 私はコンピューター サイエンスの知識がまったくありませんが、これは現代のコンピューターにとっても信じられないほど巨大なタスクのように思えます)、別のアイデアを思いつきました。 . スクリプトは各プレイヤーをループし、対戦相手と対戦します。割り当てられた値と既に決定されているゲームに基づいて、プレーヤーが獲得できる最大ポイント数を計算します。1 人のプレーヤーと 1 人の対戦相手について、その対戦相手に対するそのプレーヤーの可能な限りの結果をチェックし、最善の場合でも勝てない対戦相手がいる場合は、その対戦相手は排除されます。

この部分は簡単です。ループ内でループが実行された後、先ほど作成したグローバル変数を調整し、外側のループが完了したら、それらの変数を取得してシートに書き込むだけです。

残念ながら、これは、個々の対戦相手に対して最善のケースを持つことができたが、一度に複数の対戦相手に対してではなかったというケースを見逃しています.

だから、次のステップは私が今やろうとしていることです。スクリプト付きのスプレッドシート全体を表示するだけでなく、適切な説明を提供できるかどうかもわかりませんが、試してみます。そこで、私が今やりたいことは、特定の他のプレイヤーに対する各プレイヤーの各イベントの「価値」を計算することです。プレイヤーと対戦相手の両方が 1 つのイベントで同じイベント結果を支持してポイントを割り当てた場合、イベントの値はピックの差 (プレイヤーがより高くピックした場合はプラス、より低かった場合はマイナス) であり、反対のイベント結果をピックした場合は合計です。今、私は以前と同じことをしています - プレイヤーが特定の対戦相手に対して最善のシナリオを取る - しかし今、私はどのくらいでチェックしますプレーヤーは、最良のシナリオで対戦相手を打ち負かすことができます。次に、この差に対してイベント値 (の絶対値) を評価し、それが大きい場合、そのイベントは必ず勝つ (イベント値が負の場合は負ける) 必要があります。そして、あるイベントが「必勝」かつ「必敗」のイベントである場合、プレイヤーは排除されます。

問題は、この 2 番目のステップでは、プレイヤーと対戦相手の組み合わせごとに値の新しい配列を作成し、作成後に値を使用して処理を行う必要があることです。

1 つのアプローチは、20 の異なる配列を作成し、ループ全体で「if (player == "1" &&相手 == 2){}」をチェックし続け、それに応じて配列を設定することだと思いますが、これはばかげているように思えます。 . さらに重要なことに、このプロジェクト全体は JavaScript を学習するための私の試みなので、新しいことを何も教えてくれない時間のかかる回避策を使用する意味は何ですか?

私の質問に対する答えのように見えるので、角括弧表記を理解しようとしていますが、多くの人は、別の変数の値と連結して変数名を作成することは不可能だと示唆しています...とにかく、これが私が試していることです。私のアプローチの修正、またはより良いアプローチのいずれかを本当に感謝します。

for (var player=1; player<6; player++){
  if(player==1){look up certain columns in the spreadsheet and save them to variables}
  //ditto for other players

  for(var opponent=1; opponent<6; opponent++){
    if(player!=opponent){
      if(opponent==1){save more values to variables}
      //ditto for other players

  for(var row=9; row<24; row++) {
//Now the script goes down each row of an array containing the original
//spreadsheet info, and, based on information determined by the variables
//created above, get values corresponding to the player and opponent.
//So what I'd like to do here is create "array[1,2]==" and then "array[1,3]=="
//and so forth, creating them globally (I think I understand that term by now) 
//so I can refer to them outside of the loops later to do some evaluatin'.
  }
}}
//get array[1,2]...array[5,4] and do some operations with them.

この小さな小説を読んでくれてありがとう...あなたのアドバイスやアイデアを本当に楽しみにしています!

4

2 に答える 2

1

1 つの回避策:

ループの実行前に配列を作成できました。各ループの開始時に、プレイヤーと対戦相手の値を含む配列に文字列リテラルをプッシュできます。ループが完了したら、配列を複数の配列に分割するか、正規表現を使用して 1 つの大きな配列で評価することができます。

毎回新しい配列を作成したいのですが、これはより普遍的な方法のようであり、この回避策を使用するよりも方法を学ぶ方が私にとってより教育的です。

于 2012-11-14T00:09:28.943 に答える
1

ループ内 (別のループ内) で配列を作成するにはどうすればよいですか?

コードの更新 2

あなたが言ったように:「私は角括弧表記法を理解しようとしています」私の新しいデモとコードを見てください:

function getTeam(){
    var array = [[1,2,3],[4,5,6],[7,8,9]]; // arrays within arrays
    // array myTeam 
    var myTeam = [[],[],[],[]];
    var playerNames = ["John", "Bert", "Dave", "Milton"]; 
    var ages =[]; 
    var weight = 104;
    // loop over the team arrayadd each player (name, age and weight) to the team  
    for (i=0; i < myTeam.length; i++){            
        // fill the age array in a loop
        for (j=0;j<myTeam.length;j++) {
            ages[j] = 23 + j;            
        }        
        myTeam[i].push([playerNames[i], ages[i], weight]);
    }
    return myTeam;
}

そしてそれらをJavascriptで送り返します

この部分について詳しく教えていただけますか?

アップデート

var valuesOfPlayers=[];
for (var player=1; player<6; player++){

  // look up certain columns in the spreadsheet and save them to variables
  // you could call a funcntion and return the values you 
  // collected in an array within an array as in the demo above
  valuesOfPlayers[player] = lookupColumnValues(player);

  for(var opponent=1; opponent<6; opponent++){
    if(player!=opponent){
       // save more values to variables
       valuesOfPlayers[player] = addValuesToVar(player);
    }

  for(var row=9; row<24; row++) {
       // if you collect the values in your first and second if clause
       // what other information do you want to collect
       // Please elaborate this part?
  }
}}
于 2012-11-10T08:59:02.090 に答える