宏/脚本找到最好的棋盘游戏 - 谷歌电子表格



我和朋友一起做了一个传播,里面有我们的棋盘游戏收藏和每个游戏的信息(估计需要玩的时间,最少的人,最大的人,等等)
我想创建一个页面,我可以在其中输入我身边的人数,以及我想在游戏上花费的时间。
当我按回车键时,脚本将运行,并根据我输入的玩家数量和时间,为我提供符合条件的游戏列表。

这是电子表格的链接。

https://docs.google.com/spreadsheets/d/1AFTr_ji5iz8BJU9_OkZ1Xhfb9hg9ARAaRXfdVx2Y8pU/edit?usp=sharing

前言

这是一个有趣的问题,可以在范围内迅速扩大。

虽然您拥有的玩家数量是"固定"值,但估计时间不是。

解决方案

当您说"符合条件的游戏"时,这意味着所有满足以下条件的游戏:

  • Min. Player >= your player input
  • Max. Player <= your player input
  • Est. Time <= your time input

事情变得有趣的地方

虽然这可以通过相当简单的方式完成,但我相信如果你根据这些游戏的"合适"程度对这些游戏进行排名,那将使您受益。

为此,您可以使用一个系统根据一些数学公式对它们进行排序:

  • 由于您知道返回的所有项目最多具有输入的估计时间,因此您可以以(currentItemTime/MaximumTime) * timeScoreWeight的形式创建分数
    • 此外,您可以根据该时间可以玩的游戏会话数来更改分数,即:在 1 小时的时间段内,游戏 A 可以玩一次,但游戏 B 可以玩两次。如果您考虑了玩家的评分,则可以根据过去的分数找到适合您情况的最佳游戏。这也会带来新的/未分级游戏迅速跌入谷底的问题。
  • 由于您有一个平均评分指标,因此您也可以将其作为currentItemRating/5 * ratingWeight添加到公式中。
  • 如果你想考虑灵活的桌子大小,这意味着你愿意用相同数量的人同时运行两个游戏,你也可以找到存在哪些游戏组合,其中xnumberOfPlayer <= (x+y)对于游戏 Aa number >= minPlayer and <=maxPlayer,y对于游戏 Ba number >= minPlayer and <=maxPlayer

如果您将所有这些评级相加,则可以按此数字进行排序,并获得最佳游戏列表,从最佳到最差根据您的情况排序。

回到地球

虽然做梦总是好的,但我假设你想要一些相当快的东西完成,所以,这里有一些代码可以帮助你开始:

function test() {
var gamesThatFitCriteria = findGames(4,50);
}
function findGames(player, timeInMinutes) {
var games = SpreadsheetApp.getActiveSheet().getDataRange().getValues();
games.shift(); //Remove first row
games.shift(); //Remove second row

var result = [];

for (var i=0; i<games.length; i++) {
var currentGame = games[i];

var time = currentGame[2];
var minPlayer = currentGame[3];
var maxPlayer = currentGame[4];

if (time<=timeInMinutes && player >= minPlayer && player <= maxPlayer) {
//This is eligible.
result.push(currentGame);
}
}
return result;
}

希望这有帮助!

最新更新