建立一个数字数组没有重复的顺序无关紧要(游戏统计)

时间:2012-08-13 06:15:20

标签: arrays multidimensional-array numbers permutation game-development

所以我扮演newerth的英雄。我希望制作一个统计程序,显示5位英雄中的哪支队伍与另外5位英雄中的哪一位获胜最多。鉴于有85位英雄和85场比赛选择5比80选5,这就是很多组合。

基本上我将采用游戏服务器允许我获取的统计数据,只需将1中的数据放入一个拥有英雄的数组中[1,2,3,4,5] [6, 7,8,9,10] [W:1] [1:0] 因此,在我从历史游戏数据中解析并构建数组后,我可以输入我想看到的5个英雄,我可以找回所有相关的游戏数据,告诉我哪个5英雄阵容赢了/输了最多。< / p>

我需要帮助启动的是一个简单的算法来写出我的数组。这是我需要的类似输出:(我将其简化为1-10,我得到的代码我可以将10改为x,表示有多少英雄)。

[1,2,3,4,5] [6,7,8,9,10]

[1,2,3,4,6] [5,7,8,9,10]

[1,2,3,4,7] [5,6,8,9,10]

[1,2,3,4,8] [5,6,7,9,10]

[1,2,3,4,9] [5,6,7,8,10]

[1,2,3,4,10] [5,6,7,8,9]


[1,2,3,5,6] [4,7,8,9,10]

[1,2,3,5,7] [4,6,8,9,10]

[1,2,3,5,8] [4,6,7,9,10]

[1,2,3,5,9] [4,6,7,8,10]

[1,2,3,5,10] [4,6,7,8,9]


[1,2,3,6,7] [4,5,8,9,10]

[1,2,3,6,8] [4,5,7,9,10]

[1,2,3,6,9] [4,5,7,8,10]

[1,2,3,6,10] [4,5,7,8,9]


[1,2,3,7,8] [4,5,6,9,10]

[1,2,3,7,9] [4,5,6,8,10]

[1,2,3,7,10] [4,5,6,8,9]


[1,2,3,8,9] [4,5,6,7,10]

[1,2,3,8,10] [4,5,6,7,9]


[1,2,3,9,10] [4,5,6,7,8]


[1,2,4,5,6] [3,7,8,9,10]

[1,2,4,5,7] [3,6,8,9,10]

[1,2,4,5,8] [3,6,7,9,10]

[1,2,4,5,9] [3,6,7,8,10]

[1,2,4,5,10] [3,6,7,8,9]

[1,2,4,6,7] [3,5,8,9,10]

[1,2,4,6,8] ...

[1,2,4,6,9]

[1,2,4,6,10]

[1,2,4,7,8]

[1,2,4,7,9]

[1,2,4,7,10]

[1,2,4,8,9]

[1,2,4,8,10]

[1,2,4,9,10]

...

你明白了。没有重复和顺序无关紧要。它基本上切成两半也与阵列的顺序无关。只需要一个可以相互比赛的所有球队组合的列表。

编辑:额外的思考......

经过深思熟虑后。我想出了一些想法。而不是写出整个[85 * 84 * 83 * 82 * 81] [80 * 79 * 78 * 77 * 76 * 75]数组的可能组合,这些组合必须加大以引入新的英雄,以保持阵列相关并不断更新。

相反,当从服务器读取时解析信息并从那里构建数组。如果没有找到一个元素,那么在数组中创建一个元素会更简单,例如,之前从未播放过组合。然后解析数据将是1遍,并按照它的顺序构建您的数组。是的,它可能需要一段时间,但创建的值将值得等待。它也可以随着时间的推移而完成。从一个小测试案例开始,说1000场比赛并处理已经播放的比赛数量。另一个想法是从我们当前的时间点开始,并从那里建立数据库。没有必要根据英雄在那段时间内发生的变化数量回到有史以来第一场比赛,但是说要回溯2-3个月才能给它一些基础和数据可靠性,并且每个过去的一天只会越来越准确。

解析和构建数组的示例:

get match(x)
if length < 15/25, x++; //determine what length matches we want and discredit shorter than 15 for sure.
if players != 10, x++; //skip the match because it didn't finish with 10 players.
if map != normal_mm_map // rule out non mm games, and mid wars
if != mm, rule out custom games
//and so forth

match_psr = match(x).get(average_psr);
match_winner = match(x).get(winner);

//Hero ids of winners
Wh1 = match.(x).get(winner.player1(hero_id)))
Wh2 = match.(x).get(winner.player2(hero_id)))
Wh3 = match.(x).get(winner.player3(hero_id)))
Wh4 = match.(x).get(winner.player4(hero_id)))
Wh5 = match.(x).get(winner.player5(hero_id)))

//hero ids of losers
Lh1 = match.(x).get(loser.player1(hero_id)))
Lh2 = match.(x).get(loser.player2(hero_id)))
Lh3 = match.(x).get(loser.player3(hero_id)))
Lh4 = match.(x).get(loser.player4(hero_id)))
Lh5 = match.(x).get(loser.player5(hero_id)))

//some sort of sorting algorithim to put the Wh1-5 in order of hero id from smallest to largest

//some sort of sorting algorithim to put the Lh1-5 in order of hero id from smallest to largest


if(array([Wh1, Wh2, Wh3, Wh4, Wh5],[Lh1,Lh2,Lh3,Lh4,Lh5],[],[],[],[],[],[],[],[],[]) != null)
array([Wh1, Wh2, Wh3, Wh4, Wh5],[Lh1,Lh2,Lh3,Lh4,Lh5],[],[],[],[],[],[],[],[],[]) +=     array([],[],[1],[][][][](something with psr)[][][[])

else(array.add_element([Wh1, Wh2, Wh3, Wh4, Wh5],[Lh1,Lh2,Lh3,Lh4,Lh5],[1],[][][][](something with psr)[][][[])

有什么想法?

1 个答案:

答案 0 :(得分:0)

使用简单的方案0 ... 84
对游戏中的每个演员进行编码 您可以在游戏中维护85 * 85个演员的2D矩阵。
将此数组中的每个条目初始化为零。

现在只使用矩阵的上三角部分。
因此,对于任何两个玩家P1,P2,你在数组中有一个唯一的条目,比如array [small(p1,p2)] [big(p1,p2)]。

数组(p1,p2)表示p1赢得了多少p2。

你的事件循环可以是这样的:

For each stat like H=(H1,H2,H3,H4,H5) won against L=(L1,L2,L3,L4,L5) do
    For each tuple in H*L (h,l)  do
         if h<l
           increment array[h][l] by one
         else
           decrement array[l][h] by one

现在,在此循环结束时,您可以获得有关彼此之间的玩家信息的汇总信息。下一步是一个有趣的优化问题。
错误的方法:在该矩阵中选择5个字段,使得两个字段的行和列不相同,并且它们的绝对值的总和是最大的。我认为你可以为这个问题找到很好的优化算法。在这里,我们将计算五个元组(h1,l1),(h2,l2),(h3,l3)...其中h1对l1的胜利最大化但你仍然没有看到l1对h2是好的。
更简单和正确的选择是在一组(85 * 84)C5元组上使用强力。