我的纸牌游戏需要一个方法来检查获胜者。没有draw if
语句,它可以检查获胜值。然而,我觉得如果没有抽签检查,项目的其余部分都是多余的。我怎样才能正确地做这件事呢?
public String winChecker(){
Player winningPlayer = players.get(0);
for (Player player : players) {
if (player.getOverallHandValue() > winningPlayer.getOverallHandValue()){
winningPlayer = player;
}
if (player.getOverallHandValue() == winningPlayer.getOverallHandValue()){
return "draw!";
}
return winningPlayer.getName();
}
}
//...
public String winChecker(){
boolean many = false;
boolean initial = true;
Player winningPlayer = players.get(0);
for (Player player : players) {
if (player.getOverallHandValue() > winningPlayer.getOverallHandValue()){
winningPlayer = player;
many = false;
}
if (player.getOverallHandValue() == winningPlayer.getOverallHandValue()){
if (initial){
initial = false;
} else {
many = true;
}
}
}
if (many) {
return "draw";
}
return winningPlayer.getName();
}
就是你要找的。在当前的代码中有一个bug,如果结果是:
1 1 2 3 4 5
当前代码返回"draw",这显然是错误的。看,当你试图决定谁赢了,你不能决定谁是赢家在读取所有玩家的分数。
让我们用英语描述这两种算法。
- 将玩家列表中的第0个元素设置为当前赢家。
- 遍历所有玩家
- 如果当前玩家的分数高于当前获胜,则将当前玩家设置为当前获胜。
- 如果他们有相同的分数,决定游戏平局。看,在第一次迭代时它总是为真!
和第二个算法
- 将玩家列表中的第0个元素设置为当前赢家。
- 遍历所有玩家
- 如果当前玩家的分数高于当前获胜,则将当前玩家设置为当前获胜并标记当前只有一个领导者。
- 如果他们有相同的分数,标记至少有两名球员领先,这样就有可能打平。
根据此代码,您将始终返回"draw"
。
如果玩家集合是这样的["Player A", "Player B", "Player C"]
然后这行代码Player winningPlayer = players.get(0);
你会得到Player A
.
问题是,当你迭代玩家时,第一次迭代也会得到Player A
。因此if (player.getOverallHandValue() == winningPlayer.getOverallHandValue())
Condition在第一次迭代中始终为真。
我认为想办法解决这个问题最好留给你自己的设备。