2014-11-12 2 views
0

У меня есть метод Shuffle, который перетасовывает колоду карт. Каждая карта имеет разрешенное поле, которое будет либо истинным, либо ложным в зависимости от того, было ли оно обработано или нет.Если Statement не работает с оператором OR

Метод тасования задает для каждого поля карты значение false. Я пытаюсь остановить его от установки определенных карт на 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 

Это предотвратит наносимый поле в карты в playersHand от того установлен неверно.

Я не уверен, почему мой || операнд в этом случае не работает.

+2

Предполагаю, что на самом деле вы реализовали метод '.equals' и' .hashCode' для 'Card', так что метод' contains' работает правильно? – Alnitak

ответ

0

Работает нормально; но это не выражение, которое вы хотите.

Предположим, карта лежит в руке; по-видимому, это НЕ также в руке дилера. И наоборот. То есть: каждые карта не в некоторая рука.

Вашего комментария, это звучит, как вы хотите и (&&): карта должна быть в нини рук дилера игрока.

1

Оператор || работает нормально, может быть, что вы неправильно поняли

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)){ 
    ... 
} 

Это wou л.д. будет легче, если вы отрицать все выражение

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

По закону де Моргана, (! Game.playersHand.contains (карта) || ! Game.dealersHand.contains (card)) эквивалентен ! (Game.playersHand.contains (card) & & Game.dealersHand.contains (card)).

Таблица истинности для этого (показано ниже) является только ложной, когда оба элемента являются истинными; Во взаимоисключающем случае, как это, это означает, что он всегда оценивает значение true.

Таблица истинности для: (! Game.playersHand.contains (карта) || Game.dealersHand.contains (карта)) является:

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

!

таблица истинности для (Game.playersHand.contains (карта) || Game.dealersHand.contains (карта)) является:

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

Похож на th at - это то, что вы хотите использовать.

Смежные вопросы