0

我正在使用 Google Docs Spreadsheet API 来跟踪我的一些朋友之间的竞争。我有一些伟大的想法,但我现在很难过。我试图在循环内创建 20 个不同的数组(见下文),然后在循环外评估每个数组,我真的不想写 20 个“if...then”语句。

注意:以下摘要可能会也可能不会帮助您回答我的问题。您可能想跳到代码,然后在需要时阅读此内容:)

程序摘要:每个玩家分配点值以支持一组二元结果事件的一个可能结果。随着事件的发生,如果他们的结果发生,玩家要么获得分配的积分,要么如果相反的结果发生,则不获得积分。我的目标是 1) 准确确定玩家何时被淘汰,以及 2) 突出显示必须赢得的所有剩余赛事,以便他们有机会获得并列第一。

我没有尝试以某种方式评估所有可能性(5 名玩家选择,2^16 种结果......我的计算机科学知识为零,但即使对于现代计算机来说,这似乎也是一项非常艰巨的任务)我想出了一个替代的想法. 该脚本循环遍历每个玩家,与其他对手对抗。它根据玩家的价值分配和已经确定的游戏来计算玩家可以得分的最大点数。对于一个玩家和一个对手,它会检查玩家对那个对手的最佳可能结果,如果有任何对手他无法击败,即使在最好的情况下,他也会被淘汰。

这部分很简单——循环在循环内部运行后,我只需调整我之前创建的全局变量,当外部循环完成后,只需获取这些变量并将它们写入工作表即可。

不幸的是,这错过了他可以对每个单独的对手有最佳案例的情况,但不能同时对抗多个对手。

所以下一步就是我现在要做的。我什至不确定我能否给出一个很好的解释,而不仅仅是向您展示带有脚本的整个电子表格,但我会尝试。所以我现在要做的是计算每个玩家对给定其他玩家的每个事件的“价值”。如果玩家和对手都为一个事件分配了有利于相同事件结果的分数,则事件的值是选择之间的差值(如果玩家选择较高,则为正,如果较低,则为负),如果他们选择相反的事件结果,则为总和。现在,我做和以前一样的事情——假设一个球员对抗给定对手的最佳情况——但现在我检查多少玩家可以在最好的情况下击败对手。然后我根据这个差异评估事件值的(绝对值),如果它更大,那么事件是必须赢的(或者如果事件值为负,则必须输)。并且,如果一个事件既是“必胜”又是“必败”事件,则该玩家被淘汰。

问题是第二步需要我为每个玩家-对手组合创建一个新的值数组,然后在创建后对这些值进行处理。

我意识到一种方法是创建 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

如何在循环中(在另一个循环中)创建数组?

代码更新 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 回答
1

一种解决方法:

我可以在执行循环之前创建一个数组。在每个循环开始时,我可以将字符串文字推送到包含玩家和对手值的数组中。循环完成后,我可以将数组拆分为多个数组,或者使用正则表达式将它们计算在一个大数组中。

我仍然宁愿每次都创建新数组——似乎这是一种更通用的方法,并且学习如何比使用这种解决方法对我更有教育意义。

于 2012-11-14T00:09:28.943 回答