说我正在开发一款非常简单的纸牌游戏。纸牌游戏分为两个阶段。
第一阶段:Everone依次抽出一张卡片。 第二阶段:每个人按顺序播放一张卡片。
所以,我用一个看起来像这样的api来模拟游戏:
public class Game {
public void draw(PlayerId playerId) {
Player player = players.get(playerId);
player.drawFrom(drawDeck);
}
public void play(PlayerId playerId, CardId cardId) {
Player player = players.get(playerId);
player.playCard(cardId);
}
}
这是我的问题:Game类有两种方法可以调用,但只有一种方法在任何一个特定时间都有效。如果游戏处于第一阶段,则不应调用方法play
。同样,如果游戏处于第二阶段,则不应调用方法draw
。
在这种情况下,我有哪些选择?我只能考虑在不应该调用方法的情况下抛出异常。
理想情况下,我希望客户端代码只能调用在该特定时间有效的方法。有关如何做到这一点的任何想法?或者,客户有责任正确调用方法吗?
答案 0 :(得分:2)
Strategy design pattern可以在这里提供帮助。使用Game
和GamePhase1
实现定义GamePhase2
界面。
public interface Game {
public boolean isDrawAllowed();
public boolean isPlayAllowed();
public void draw(...);
public void play(...);
}
每个实现都会为游戏阶段返回相应的布尔值。无效的绘制或播放方法可能会抛出异常。随着游戏阶段的变化,管理代码将交换正确的实现。检查is...
方法可以避免遇到异常并允许UI选择要显示的选项。
答案 1 :(得分:1)
您应该使用状态模式并将接口分成2个单独的DrawPhase
和PlayPhase
,其中每个只有一个有效的方法。然后,您的游戏类可以根据您正在实施的游戏规则更改它的相位。
答案 2 :(得分:0)
您可以使用异常处理,但也可以使用if语句并打印消息。
我认为这个游戏有一个客户端服务器模型,并且您担心有人可能会修改他们的客户端以尝试做不适当的操作。我会在调用你所描述的方法的方法中处理这个问题:
public class Main {
public void takeNextTurn(PlayerId playerId, int action)
if(action == 0){
if (appropriate_to_draw){
game.draw(playerid);
}
else {
messageClient("You can't draw now");
}
...
}
}
在您的客户端中,请确保处理此消息。