gpt4 book ai didi

language-agnostic - 消除相互之间具有很强概念联系的类之间的耦合

转载 作者:行者123 更新时间:2023-12-04 08:58:33 24 4
gpt4 key购买 nike

我有类型 Rock , Paper , 和 Scissors .这些是石头剪刀布游戏的组成部分或“手”。给定两个玩家的手,游戏必须决定谁赢。如何解决这个链图的存储问题

Rock, Paper, Scissors chart

没有将不同的手相互耦合?目标是允许在游戏中添加新手(例如 Jon Skeet),而无需更改任何其他手。

我对代理的任何想法持开放态度,但对大型 switch 语句或代码重复持开放态度。例如,引入一种管理链比较的新类型就可以了,只要我不需要为我添加的每一手牌都改变它。再说一次,如果你可以合理化拥有一个必须为每手新牌或当一手牌变化时改变的代理,那也是受欢迎的。

这是一个 Design 101 问题,但我很好奇人们可以为此想出什么解决方案。显然,这个问题可以很容易地扩展到更大的系统,该系统有更多的组件,它们之间具有任意复杂的关系。这就是为什么我要举一个非常简单和具体的例子来解决。欢迎使用任何范例,OOP 或其他方式。

最佳答案

有一个实现 Win 方法的 GameStrategy 类。 win 方法接受一个 Hands 列表,并返回一个 Hand——如果有赢家——或者如果游戏是平局则返回 null。我认为获胜策略实际上并不是一手牌的属性,而是游戏的属性。将一手胜负的决心合并到 GameStrategy 类中。

编辑 : 潜在策略

public enum RPSEnum { Rock, Paper, Scissors }

private RPSEnum FirtRPS = RPSEnum.Rock;
private RPSEnum LastRPS = RPSEnum.Scissors;

public Hand Win( Hand firstPlayer, Hand secondPlayer )
{
if (firstPlayer.Value == FirstRPS
&& secondPlayer.Value == LastRPS)
{
return firstPlayer;
}
else if (secondPlayer.Value == FirstRPS
&& firstPlayer.Value == LastRPS)
return secondPlayer;
}
else
{
int compare = (int)firstPlayer.Value - (int)secondPlayer.Value;
if (compare > 0)
{
return firstPlayer;
}
else if (compare < 0)
{
return secondPlayer;
}
else
{
return null;
}
}
}

要添加新的手值,只需按正确的顺序将值添加到 RPSEnum。如果是新的“最低”手牌,请更新 FirstRPS。如果是新的“最高”手牌,请更新 LastRPS。您根本不需要更改实际算法。

注意:这比仅需要三个值更复杂,但要求能够在不更新太多代码的情况下添加其他值。

关于language-agnostic - 消除相互之间具有很强概念联系的类之间的耦合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/383921/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com