确定Mancala获胜者的方法不起作用

时间:2013-09-17 16:14:37

标签: java boolean

Mancala是我用Java编程的迷人游戏。在下面的图片中,我们看到了一个Mancala游戏板。对于我的问题,你需要知道A1-A6,B1-B6被称为坑,大坑被称为kalahs。

The mancala game http://www.pressmantoy.com/instructions/mancala_img1.jpg

坑A1-A6和右翼kalah属于玩家A并且坑B1-B6并且离开kalah属于玩家B.

游戏结束时,游戏板一侧的所有六个坑都是空的,或者一个玩家的kalah中有超过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;
}

oppositepit()和nextPit()方法有效。 myPits ArrayLists包含属于两个相应玩家的维修站。

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

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

2 个答案:

答案 0 :(得分:2)

由于以下原因,它总是返回false:

for (int i = 0; i < pitsOfOwner.size(); i++) {
if (pitsOfOwner.get(i).isValidPlayOption() == true) 
        return 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

答案 1 :(得分: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;
}