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。我不知道为什么,希望这里有人可以为我提供一些见解。
答案 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
是多余的。<强>代码:强>
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;
}