If语句不适用于OR运算符



所以我有一个洗牌方法,可以洗牌。每张牌都有一个已发字段,根据是否已发,该字段将为真/假。

洗牌方法将每个发牌区域设置为false。我试图阻止它将某些牌设置为假牌,这取决于该牌目前是否在经销商/玩家手中。

public void shuffle(){
    Collections.shuffle(deck);//Shuffles the deck
    for(Card card : deck){//For each card in the deck
        if(!Game.playersHand.contains(card) || !Game.dealersHand.contains(card)){//If card is not in dealers/players hand
            card.setDealt(false);//card is no longer dealt
        }//end if
    }//end for
}//end shuffle

上面的if语句不起作用。不管怎样,它都会把每张卡片都标记为假的。

如果我这样做:

public void shuffle(){
    Collections.shuffle(deck);
    for(Card card : deck){
        if(!Game.playersHand.contains(card)){
            card.setDealt(false);
        }
    }
}//end shuffle

它将防止玩家手中的牌的发牌区域被设置为假。

我不知道为什么我的||操作数在这种情况下不起作用。

||运算符工作正常,可能是您误解了它

boolean x= !true || !false; 
System.out.println(x); // prints true

所以显然&是你想要的

boolean x= !true && !false; 
System.out.println(x); // prints false

所以在你的情况下,这将是

if(!Game.playersHand.contains(card) && !Game.dealersHand.contains(card)){
  ...
}

如果你否定整个表达式会更容易

if(!(Game.playersHand.contains(card) || Game.dealersHand.contains(card))){
  ...
}

运行良好;但这不是你想要的表达方式。

假设卡片在玩家手中;大概它也不在经销商手中。反之亦然。也就是说:每一张牌都不在某个手中。

从你的评论中,听起来你想要一张&&):这张牌既不应该在玩家的手中,也不应该在发牌人的手中。

根据德摩根定律,(!Game.playersHand.contents(card)||!游戏.经销商手.包含(卡)相当于!(Game.playersHand.包含(卡)&游戏.经销商手.包含(卡)).

只有当这两个元素都为真时,这个的真值表(如下所示)才为假;在这样一个互斥的情况下,这意味着它总是计算为true。

以下项的真值表:(!Game.playersHand.contents(card)||!游戏.经销商手.包含(卡))是:

A。。。BA.B.…(!A||!B)
F.…F.…T.…T…T
F…T…T…F…T
T…F…F…T…T
T…T…F…F…

真相表!(Game.playersHand.contents(卡)|| Game.dellersHand.contens(卡))是:

A。。。B…(A||B)。。。!(A||B)
F…F……F…..T
F…T…T……F
T…F…T……F
T…T……T…..F

看起来这就是你想要使用的。

最新更新