1

Mancala 是我用 Java 编写的一款引人入胜的游戏。在下图中,我们看到了一个 Mancala 游戏板。对于我的问题,您需要知道 A1-A6、B1-B6 称为坑,而大坑称为 kalahs。

曼卡拉游戏
(来源:pressmantoy.com

坑 A1-A6 和右 kalah 属于玩家 A,坑 B1-B6 和左 kalah 属于玩家 B。

当游戏板一侧的所有六个坑都为空或一名玩家的卡拉超过 24 个坑时,游戏结束。这是我尝试在布尔方法中编程的内容(如果有获胜者则返回 true,因此我可以使用其他方法来判断它是谁):

public boolean isThereAWinner() {
    ArrayList <SuperPit> pitsOfOwner = owner.getmyPits();       
    ArrayList <SuperPit> pitsOfOpponent = owner.getopponent().getmyPits();
    for (int i = 0; i < pitsOfOwner.size(); i++) {
        if (pitsOfOwner.get(i).isValidPlayOption() == true) 
            return false;
    }
    for (int i = 0; i < pitsOfOpponent.size(); i++) {
        if (pitsOfOpponent.get(i).isValidPlayOption() == true) 
            return false;
    }
    if (owner.getKalah().getSeed() > 24) return true;
    return false;
}

在哪里:

protected int seed;

public int getSeed() { 
    return seed;    
}

public boolean isValidPlayOption() {
    if (getSeed() > 0) return true;
    else return false;
}

相反pit() 和nextPit() 方法有效。myPits ArrayLists 包含属于两个各自玩家的坑。

我认为这种方法应该有效,因为如果一个玩家的坑中不再有种子,游戏应该停止。每次玩家移动时,都会运行 isThereAWinner() 方法。

不幸的是,该方法总是返回 false。我不知道为什么,希望这里有人可以为我提供一些见解。

4

2 回答 2

3

它总是返回 false 因为:

for (int i = 0; i < pitsOfOwner.size(); i++) {
if (pitsOfOwner.get(i).isValidPlayOption() == true) 
        return false;
}

任何一个坑一旦有种子,它就会返回 false,即使另一块板完全是空的。

怎么样:

int sum1 = 0;
for (int i = 0; i < pitsOfOwner.size(); i++) {
    sum1 += pitsOfOwner.get(i).getSeed();
}
if (sum1 == 0) return true; // all pits are empty
于 2013-09-17T16:24:09.263 回答
1
  • 如果一个玩家有一个有效的播放选项,你已经返回了一个值。您需要继续检查。
  • 如果玩家没有移动,则不会返回 true。
  • 检查对手的kalah怎么样?
  • == true是多余的。

代码:

public boolean isThereAWinner() {
    ArrayList <SuperPit> pitsOfOwner = owner.getmyPits();       
    ArrayList <SuperPit> pitsOfOpponent = owner.getopponent().getmyPits();
    boolean hasLost = true;

    for (int i = 0; i < pitsOfOwner.size() && hasLost; i++) {
        if (pitsOfOwner.get(i).isValidPlayOption()) 
            hasLost = false;
    }
    if (hasLost) return true;

    hasLost = true;
    for (int i = 0; i < pitsOfOpponent.size() && hasLost; i++) {
        if (pitsOfOpponent.get(i).isValidPlayOption()) 
            hasLost = false;
    }
    if (hasLost) return true;

    if (owner.getKalah().getSeed() > 24) return true;

    if (owner.getopponent().getKalah().getSeed() > 24) return true;

    return false;
}

&& hasLost只是一个优化,一旦你找到一个动作就停止循环。

冗余更少:

private boolean hasLost(Player player)
{
    boolean hasLost = true;
    for (int i = 0; i < player.getmyPits().size() && hasLost; i++) {
        if (player.getmyPits().get(i).isValidPlayOption()) 
            hasLost = false;
    }
    return (hasLost || player.getopponent().getKalah().getSeed() > 24);
}

public boolean isThereAWinner() {
    if (hasLost(owner)) return true;
    if (hasLost(owner.getopponent())) return true;
    return false;
}
于 2013-09-17T16:22:20.190 回答