按C#(Unity)中的多个变量排序列表

问题描述 投票:-4回答:2

我是编程新手,目前正在使用Unity将与朋友一起玩的棋盘游戏转换为虚拟版本。这款游戏具有独特的方式来确定每轮比赛后的转牌顺序,而我真的对如何实现这一点感到困惑。我将每个玩家的数据保存在名为“ Player”的脚本的实例中,并具有两个函数来检索相关变量(GetUnits()和GetScore())。

我还将所有玩家列表保留在玩家列表“ playerList”中。 3-6位玩家之间可以有任何位置。

每回合的回合顺序是单位数量最少的玩家(升序),如果两个玩家并列,则得分更高(降序)的玩家。如果仍然并列,玩家将不得不为第三个决胜局掷骰。我需要在下一个回合开始之前捕获完整的回合顺序(我无法重新计算每个玩家的回合。)

实际上,几乎不需要第三局决胜局,而在第二轮之后几乎不需要第二次决胜局。当然,所有这些例外都在于游戏的第一回合,每个人在得分和单位上并列。我可以只为Rd 1编写一个单独的die-roller函数,但是如果我正确地编写了setTurn函数,它将可以无缝处理Rd 1和其他任何可能的平局情况。

[每次我坐下来编写代码时,我都会看到成堆的嵌套循环和if语句,而我无法完全找到解决方案。非常感谢您提供有关如何解决此问题的建议。

c# sorting unity3d
2个回答
1
投票

播放器类的实施IComparable。然后,您只需将列表告诉Sort()本身就可以了。

实现界面看起来像:

public class Player : IComparable<Player>
{

    private static Random R = new Random();

    public String Name;
    public int GetUnits() { return -1; } // obviously you have other code to support this
    public int GetScore() { return -1; } // obviously you have other code to support this

    public int CompareTo(Player other)
    {
        // sort by Units first
        int result = this.GetUnits().CompareTo(other.GetUnits());
        if (result == 0) // units were equal
        {
            // sort by score next
            result = this.GetScore().CompareTo(other.GetScore());
            if (result == 0) //scores were equal
            {
                // sort by dice roll: <=3 first player, otherwise second player
                result = (R.Next(1, 7) <= 3 ? -1 : 1);
            }
        }
        return result;
    }

}

然后您只需将列表告知Sort()本身!

playerList.Sort();

来自其他答案的原始海报评论:

我唯一关心的是,如果有3条(或更多)单向领带,将会发生什么?一世 希望3个玩家同时对战并且 不是1对1的卷。例如,在第一轮之前(假设6 玩家)我想进行6向掷骰。

这实际上比您想象的要难。考虑我们排序时不先掷骰子。然后,您必须遍历结果,并查看排序中哪些可能的MULTIPLE部分有联系。然后,您必须为每位玩家打平领带。之后,您只需要排序已排序列表的子集(将所有其他玩家保留在当前位置)即可仅重新排列被绑定的子部分。请记住,这可能发生在列表的多个位置。也有可能在掷骰子之后会有更多的领带需要更多的通过。 Sort()的重载允许您仅对列表的一部分进行排序。

因此,您需要对(1)单位/得分,(2)检查并列,(3)掷骰子,(4)对所有绑定的子集进行排序,并根据需要循环回到(2)次。


0
投票

这是您可以考虑的简单解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.