GAS: сплайдически возвращает неправильный размер массива - PullRequest
1 голос
/ 12 октября 2019

Я использую ГАЗ для случайного выбора врагов для настольной игры. Я дошел до случайного выбора строк из списка, удаления первого элемента внутреннего массива и подачи его обратно на лист. Он работает по большей части, но время от времени удаляет неправильные элементы.

Я искал здесь и на других форумах, переписал сращивание, изменил массив и часами смотрел на него, и я думаю, что достигТочка, в которой я не вижу леса за деревьями и нуждаюсь в свежих глазах.

//--------------------------------------------------------------------------------------------------------//
function selectRandomElements(fromValueRows, count) {
  var pickedRows = []; // This will hold the selected rows
  for (var i = 0; i < count && fromValueRows.length > 0; i++) {
    var pickedIndex = getRandomInt(0, fromValueRows.length);
    // Pick the element at position pickedIndex, and remove it from fromValueRows.
    var pickedRow = fromValueRows.slice(pickedIndex)[0]; 
    // Add the selected row to our result array
    pickedRows.push(pickedRow);
  }
  return pickedRows;
}

//--------------------------------------------------------------------------------------------------------//
function getRandomInt(min, max) {
  min = Math.ceil(min);
  max = Math.floor(max);
  return Math.floor(Math.random() * (max - min)) + min;
}

//--------------------------------------------------------------------------------------------------------//

function enemyTeam() {

// How many enemies?  
  var count = getRandomInt(1,5);
// Enemy Database - each enemy should follow the below layout.
// Player level required to encounter || Name || Level || Race || Class || HP || Max HP || Damage || Def || Initiative || Max Initiative || Damage callout
  var fromValues = [

  ['1','Goblin Thug','1','Goblin','Tank','6','6','1','2','1','1','Blurgh!'],
  ['1','Goblin Snot','1','Goblin','DPS','4','4','2','1','1','1','Oww!'],
  ['1','Goblin Stitcher','1','Goblin','Healer','2','2','1','2','1','1','Gahh!']

  ]

// Define enemy list
  var enemylist = selectRandomElements(fromValues, count);
  Logger.log(enemylist);
  enemylist.forEach(function(array){
  array.splice(0,1);
 }); 
  Logger.log(enemylist);
  var ssBS = SpreadsheetApp.getActive().getSheetByName('Battle Stats');
  var enemyrange = ssBS.getRange(7,1,count,11);

// Place in Battle Stats tab
  enemyrange.setValues(enemylist);
}

Как я уже сказал, это работает по большей части и возвращает 1-4 случайных врагов из списка, но каждыйвремя от времени он удаляет неправильный элемент или даже удаляет два и выдает «Число столбцов в данных не соответствует количеству столбцов в диапазоне. У данных 9, а у диапазона 11. ошибка. Например, только сейчас я запустил его, и он работал дважды, затем я получил ошибку ...

Первый журнал показывает:

[19-10-12 18:38:35: 711 BST] [[1, Goblin Thug, 1, Goblin, Tank, 6, 6, 1, 2, 1,> 1, Blurgh!], [1, Goblin Thug, 1, Goblin, Tank, 6, 6, 1, 2, 1, 1, Blurgh!], [1,> Goblin Stitcher, 1, Goblin, Healer, 2, 2, 2, 1, 1, 1, Gahh!]]

Второй журнал показывает:

[19-10-12 18: 38: 35: 711 BST] [[1, Гоблин, Танк, 6, 6, 1, 2, 1, 1, Blurgh!], [1,> Goblin, Tank, 6, 6, 1, 2, 1, 1, Blurgh!], [Goblin Stitcher, 1, Goblin, Healer,> 2, 2, 2, 1, 1, 1,Гахх!]]

Что бы я хотел увидеть:

[19-10-12 18: 38: 35: 711 BST] [[Гоблин Бандит,1, Goblin, Tank, 6, 6, 1, 2, 1,> 1, Blurgh!], [Гоблин Бандит, 1, Goblin, Tank, 6, 6, 1, 2, 1, 1, Blurgh!], [Goblin Stitcher, 1, Goblin, Healer, 2, 2, 2, 1, 1, 1, Gahh!]]

Любая помощь приветствуется.

РЕДАКТИРОВАТЬ: Сделал перерыв и подумал, что понял, почему это происходит спорадически. Кажется, что это происходит только тогда, когда одна и та же строка выбирается несколько раз - я полагаю, потому что она объединяет одну и ту же строку дважды. Просто нужно знать, как это остановить.

1 Ответ

1 голос
/ 13 октября 2019

slice() делает мелкую копию. Попробуйте

var pickedRow = fromValueRows[pickedIndex].slice(0);

, чтобы сделать копию внутреннего массива тоже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...