2013-12-02 3 views
0

Я пытаюсь сделать флеш в классической программе игры в покер/карточную игру. Имуществом является костюм (сердца, бриллианты и т. Д.), А массив - это рука. Я использовал IEquatable и реализован метод EqualsИспользование IEquatable Equals, сравнивающее свойство объектов в массиве

public bool Equals(SuperCard otherCard) 
    { 
     if (otherCard == null) 
      return false; 
     return (this.cardSuit.Equals(otherCard.cardSuit)); 
    } 

оттуда в моем Program.cs я пишу метод Его для Flush, используя .equals. мне предложили, чтобы я использовал цикл for, но у меня возникли проблемы с пониманием того, что я делаю это правильно. Мне нужно сравнить свойство cardSuit, карточку по карте. Но я не уверен, как это сделать. Любая помощь будет оценена по достоинству. Вот что я имею в методе до сих пор.

, на мой взгляд, цикл for сравнивает каждую карту, ища любые ложные, а затем возвращает false, если это так. вне/после цикла for (предположим, что theyre all true), я возвращаю true/false для сравнения последних двух карт в руке. я его усложняю? это неправильно?

EDIT: Я вижу это: «если (рука [я] .equals (рука [я + 1]) == ложь)» будет выходить исключения границ, поэтому мне нужен новый способ сравнения карты на карту. Есть идеи?

+1

'hand [han d.Length] 'raise exception – Grundy

+0

try' for (int i = 0; i Grundy

+0

Да, я поймал это сразу после того, как отправил. спасибо @Grundy – jacksonSD

ответ

1

Во-первых, остерегайтесь (возможно) переполнение стека:

public bool Equals(SuperCard otherCard) 
{ 
    // "otherCard == null" usually calls "Equals" method which in turn 
    // calls "Equals" again and again... 
    if (Object.ReferenceEquals(otherCard, null)) // <- No "==" or "Equal" - just reference test 
     return false; 

    return (this.cardSuit.Equals(otherCard.cardSuit)); 
} 

Другой проблемой является RangeCheckError (см в "Длина - 1" в состоянии петли)

private static bool Flush(SuperCard[] hand) 
{ 
    if (Object.ReferenceEquals(null, hand)) 
     return false; 

    for (int i = 0; i < hand.Length - 1; i++) // <- Pay attention to "Length - 1" 
    { 
     if (!hand[i].Equals(hand[i + 1]))  // <- "== false" is quite awkward 
     { 
      return false; 
     } 
    } 

    // You don't need any additional checks here: 
    // A[0] = A[1] = ... = A[length - 1] 
    return true; 
} 
2

Там в гораздо более простой способ сделать это

private static bool Flush(SuperCard[] hand) 
{ 
    if(hand.Length == 0) 
     return false; 
    var suit = hand[0].cardSuit; 
    return hand.All(c => c.cardSuit == suit); 
} 
Смежные вопросы