我有类型的Rock,Paper和Scissors.这些是Rock,Paper,Scissors游戏的组件或"手".鉴于两名球员的手,比赛必须决定谁获胜.如何解决存储此链表的问题
![]()
没有将各种手相互耦合?目标是允许在游戏中添加新手(例如Jon Skeet)而不更改任何其他游戏.
我对代理的任何想法持开放态度,但不对大型switch语句或代码重复持开放态度.例如,引入一个管理链的比较的新类型是好的,只要我不需要为我添加的每个新手更改它.再说一遍,如果你可以合理地拥有一个必须为每一个新手或一只手改变的代理,那也是受欢迎的.
这是一个设计101问题,但我很好奇人们可以为此提出什么解决方案.显然,这个问题很容易扩展到更大的系统,有更多的组件,它们之间有任意复杂的关系.这就是为什么我要提出一个非常简单而具体的例子来解决.任何使用的范例,OOP或其他方式都是受欢迎的.
有一个实现 Win 方法的 GameStrategy 类。win 方法采用 Hands 列表,并返回 Hands(如果有获胜者)或 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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
要添加新的手牌值,只需按正确的顺序将该值添加到 RPSEnum 即可。如果是新的“最低”手牌,则更新 FirstRPS。如果是新的“最高”手牌,则更新 LastRPS。您根本不需要更改实际的算法。
注意:这比仅三个值所需的更复杂,但要求是能够在不更新太多代码的情况下添加其他值。
| 归档时间: |
|
| 查看次数: |
247 次 |
| 最近记录: |