我是编程新手,目前正在使用Unity将与朋友一起玩的棋盘游戏转换为虚拟版本。这款游戏具有独特的方式来确定每轮比赛后的转牌顺序,而我真的对如何实现这一点感到困惑。我将每个玩家的数据保存在名为“ Player”的脚本的实例中,并具有两个函数来检索相关变量(GetUnits()和GetScore())。
我还将所有玩家列表保留在玩家列表“ playerList”中。 3-6位玩家之间可以有任何位置。
每回合的回合顺序是单位数量最少的玩家(升序),如果两个玩家并列,则得分更高(降序)的玩家。如果仍然并列,玩家将不得不为第三个决胜局掷骰。我需要在下一个回合开始之前捕获完整的回合顺序(我无法重新计算每个玩家的回合。)
实际上,几乎不需要第三局决胜局,而在第二轮之后几乎不需要第二次决胜局。当然,所有这些例外都在于游戏的第一回合,每个人在得分和单位上并列。我可以只为Rd 1编写一个单独的die-roller函数,但是如果我正确地编写了setTurn函数,它将可以无缝处理Rd 1和其他任何可能的平局情况。
[每次我坐下来编写代码时,我都会看到成堆的嵌套循环和if语句,而我无法完全找到解决方案。非常感谢您提供有关如何解决此问题的建议。
播放器类的实施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)次。
这是您可以考虑的简单解决方案。