-3

我正在尝试定义一个可以用于棋盘游戏的类。我想我将使用访问方法(getTurn())作为棋盘游戏类的参数。

游戏开始时,前两次应给出“BLACK”、“BLACK”,然后应在“WHITE”和“BLACK”之间交替。我的 startTurn() 方法返回这个。

游戏进行到一半,当前玩家(WLOG,说他的BLACK)移动后,我需要检查一些条件(如果下一个玩家没有移动可能),并根据它,我想改变顺序其中。

我需要定义的方法是(所以我们假设当前转弯是黑色的,现在继续下一个)

1)如果下一个玩家选择跳过他/她的回合,它应该再次给黑色,然后像以前一样在白色和黑色之间交替。

像这样:B-> B-> W -> B ->........ W -> B| -> B -> W -> B -> .....

或者如果当前玩家是白人,

像这样:B-> B-> W -> B ->........ B -> W| -> W -> B -> W -> .....

, 其中“|” 在 B 或 W 之后只是我用来解释我测试下一个玩家是否有可能移动(使用方法)的点的符号,如果没有,则像这样改变转弯。(我猜 reverseTurn() 方法可以做到这一点,这可能不会太难。)

2)如果下一个玩家选择移动对方的棋子,它应该先给黑(这样白棋可以移动一个黑棋),然后给黑(这样黑棋轮到他/她),然后在白棋和黑棋之间交替和以前一样。

像这样:B-> B-> W -> B ->........ W -> B| -> B -> B -> W -> B -> .....

或者如果当前玩家是白人,

像这样:B-> B-> W -> B ->........ B -> W| -> W-> W -> B -> W -> .....

, 其中“|” 在 B 或 W 之后只是我用来解释我测试下一个玩家是否有可能移动(使用方法)的点的符号,如果没有,则像这样改变转弯。

3)另一个问题是,如果我有上述两个问题的答案,我如何在我的棋盘游戏课程中使用它?我能想到的只是初始化TurnIndicator,并在构造函数中调用startTurn(),并在我将字符串作为转向参数传递时分配getTurn(),并在每次玩家移动时调用startTurn()?这行得通吗?(因为我很不确定)

如果是这样,那我什么时候想更改订单呢?然后我应该有条件地调用该方法而不是 startTurn() 方法吗?

我已经被这个问题困扰了很长时间。特别是问题 2.. 任何建议将不胜感激。

以下是我迄今为止为 TurnIndicator 类所做的工作。

谢谢!!

public class TurnIndicator {
    private boolean _isWhite;
    private int _count = 0;
    private String _currentTurn;

    public void startTurn() {
        if(_count<3)
            _count++;

        if(_count == 1 || _count == 2) {
            _currentTurn = "BLACK";
        }
        else {
            _isWhite = !_isWhite;
            _currentTurn = _isWhite ? "WHITE" : "BLACK";
        }
    }

    public String getTurn() {
        return _currentTurn;
    }

    public void reverseTurn() {
        _currentTurn = _currentTurn == "WHITE" ? "BLACK" : "WHITE";
    }

    public String skipTurn() {
        ?
    }
    public String takeOthersTurn() {
            ?
    }
}
4

2 回答 2

1

“游戏开始时,前两次应该给“BLACK”,“BLACK”,然后应该在“WHITE”和“BLACK”之间交替。”

在里面startTurn()为什么不只是这样做:

if(_count<3)  {
    _count++;
    _currentTurn = "BLACK";
}

当我查看代码时(尽管有以下内容),您为什么不直接reverseTurn()设置方法isWhite == !isWhite然后调用startTurn()

继续提问。

1)“如果下一个玩家选择跳过他/她的回合,......”

不要想“选择跳过他/她的回合”,想“选择不移动他/她的棋子”。因此逻辑仍然有效:playerNext 轮流(似乎)可能正在移动他/她的棋子、移动 playerFirst 的棋子或不移动任何棋子。

2)“如果下一个玩家选择移动其他玩家的棋子,它应该给黑色(这样白色可以移动黑色棋子),......”

真的吗?在我看来,它仍然是 WHITE,因为轮到 WHITE 了,无论哪个颜色块被移动。现在,我想你可能想要调用你的玩家: player1 和 player2(或 playerFirst 和 playerNext,就像我之前所做的那样)a)保持玩家和棋子颜色之间的概念差异,并且 b)不必去当试图解释逻辑时,将发生的事情分为两个定义

3)......这行得通吗?

把游戏想象成现实生活。startTurn()每次玩家移动时你都应该打电话吗?例如,在拼字游戏中,当玩家移动时,他们总是开始轮到吗?即,在查阅他们的心理词典之前,他们是否总是检查手中的牌和棋盘上的牌?如果对象在现实生活中这样做,那么它应该在面向对象的语言中工作(我假设是 java,尽管有 c++ 标签)。但是,唯一的方法就是尝试和观察。所有这一切都假设我没有将您的游戏规则解释为全错,导致上述内容在这种情况下毫无意义。

于 2013-04-04T16:48:24.027 回答
0

我认为您在“TurnIndicator”中投入了太多逻辑。跳过回合只是“下一个回合”——当前玩家没有移动/下棋这一事实不会改变回合的顺序。

此外,您有两个变量指示轮到谁了。_isWhite_currentTurn两者。更糟的是,你reverseTurn改变了一个而不改变另一个。我建议使用bool[假设您实际上意味着只有两个玩家],如果您需要轮到谁的“字符串”,请调用一个返回它的函数:

 std::string playerColour() 
 { 
     if (_isWhite) return "WHITE"; 
     return "BLACK";
 }
于 2013-04-04T16:04:22.887 回答