Preface: I've perused the other related questions before creating this one but I believe that those solutions weren't applicable to my situation. I'll concede that its possible that I may not have understood a possible solution (if any).
I'm working on refactoring an old poker game that I created, which is a .NET Framework console application, and I came across this method.
/// <summary>
/// Evaluates the value of the player hand and computer hand.
/// </summary>
/// <param name="pComputerHand">The computer's current hand.</param>
/// <param name="pPlayerHand">The player's current hand.</param>
/// <returns>Returns true if the player won and false if the player lost. This value is stored in the the bool won variable.</returns>
private static bool CompareHands(SuperCard[] pComputerHand, SuperCard[] pPlayerHand)
{
// Stores the value of the player and computer hands.
int playerHandValue = 0;
int computerHandValue = 0;
// Evaluates the value of computer hand
foreach(SuperCard card in pComputerHand)
{
computerHandValue += (int)card.CardRank;
}
// Evaluates the value of player hand
foreach(SuperCard card in pPlayerHand)
{
playerHandValue += (int)card.CardRank;
}
// If there is a royal flush in the computer's hand and the player's hand, the player lost.
if (PokerHands.RoyalFlush(pPlayerHand) & PokerHands.RoyalFlush(pComputerHand))
{
Console.WriteLine("\nBoth players have a royal flush!");
return false;
}
// If there is a royal flush in the player's hand, the player won.
if (PokerHands.RoyalFlush(pPlayerHand))
{
Console.WriteLine("\nYou have a royal flush!");
return true;
}
// If there is a royal flush in the computer's hand, the player lost.
if (PokerHands.RoyalFlush(pComputerHand))
{
Console.WriteLine("\nThe computer has a royal flush!");
return false;
}
#region Straight Flush
// If there is a straight flush in the computer's hand and the player's hand, the player lost.
if (PokerHands.StraightFlush(pPlayerHand) & PokerHands.StraightFlush(pComputerHand))
{
Console.WriteLine("\nBoth players have a straight flush!");
return false;
}
// If there is a straight flush in the player's hand, the player won.
if (PokerHands.StraightFlush(pPlayerHand))
{
Console.WriteLine("\nYou have a straight flush!");
return true;
}
// If there is a straight flush in the computer's hand, the player lost.
if (PokerHands.StraightFlush(pComputerHand))
{
Console.WriteLine("\nThe computer has a straight flush!");
return false;
}
#endregion
#region Four Of A Kind
// If there is a four of a kind in the computer's hand and the player's hand, the player lost.
if (PokerHands.FourOfAKind(pPlayerHand) & PokerHands.FourOfAKind(pComputerHand))
{
Console.WriteLine("\nBoth players have a four of a kind!");
return false;
}
// If there is a four of a kind in the player's hand, the player won.
if (PokerHands.FourOfAKind(pPlayerHand))
{
Console.WriteLine("\nYou have a four of a kind!");
return true;
}
// If there is a four of a kind in the computer's hand, the player lost.
if (PokerHands.FourOfAKind(pComputerHand))
{
Console.WriteLine("\nThe computer has four of a kind!");
return false;
}
#endregion
#region Full House
// If there is a full house in the computer's hand and the player's hand, the player lost.
if (PokerHands.FullHouse(pPlayerHand) & PokerHands.FullHouse(pComputerHand))
{
Console.WriteLine("\nBoth players have a full house!");
return false;
}
// If there is a full house in the player's hand, the player won.
if (PokerHands.FullHouse(pPlayerHand))
{
Console.WriteLine("\nYou have a full house!");
return true;
}
// If there is a four of a kind in the computer's hand, the player lost.
if (PokerHands.FullHouse(pComputerHand))
{
Console.WriteLine("\nThe computer has a full house!");
return false;
}
#endregion
#region Flush
// If there is a flush in the player hand and the computer hand, the player lost.
if (PokerHands.Flush(pPlayerHand) && PokerHands.Flush(pComputerHand))
{
Console.WriteLine("\nBoth players have a flush!");
return false;
}
// If there is a flush in the player hand, the player won.
if (PokerHands.Flush(pPlayerHand))
{
Console.WriteLine("\nYou have a flush!");
return true;
}
// If there is a flush in the computer hand, the player lost.
if (PokerHands.Flush(pComputerHand))
{
Console.WriteLine("\nThe computer has a flush!");
return false;
}
#endregion
#region Straight
// If there is a straight in the computer's hand and the player's hand, the player lost.
if (PokerHands.Straight(pPlayerHand) & PokerHands.Straight(pComputerHand))
{
Console.WriteLine("\nBoth players have a straight!");
return false;
}
// If there is a straight in the player's hand, the player won.
if (PokerHands.Straight(pPlayerHand))
{
Console.WriteLine("\nYou have a straight!");
return true;
}
// If there is a straight in the computer's hand, the player lost.
if (PokerHands.Straight(pComputerHand))
{
Console.WriteLine("\nThe computer has a straight!");
return false;
}
#endregion
#region Three Of A Kind
// If there is a three of a kind in the computer's hand and the player's hand, the player lost.
if (PokerHands.ThreeOfAKind(pPlayerHand) & PokerHands.ThreeOfAKind(pComputerHand))
{
Console.WriteLine("\nBoth players have a three of a kind!");
return false;
}
// If there is a three of a kind in the player's hand, the player won.
if (PokerHands.ThreeOfAKind(pPlayerHand))
{
Console.WriteLine("\nYou have a three of a kind!");
return true;
}
// If there is a three of a kind in the computer's hand, the player lost.
if (PokerHands.ThreeOfAKind(pComputerHand))
{
Console.WriteLine("\nThe computer has a three of a kind!");
return false;
}
#endregion
#region Two Pair
// If there is a two pair in the computer's hand and the player's hand, the player lost.
if (PokerHands.TwoPair(pPlayerHand) & PokerHands.TwoPair(pComputerHand))
{
Console.WriteLine("\nBoth players have a two pair!");
return false;
}
// If there is a two pair in the player's hand, the player won.
if (PokerHands.TwoPair(pPlayerHand))
{
Console.WriteLine("\nYou have a two pair!");
return true;
}
// If there is a two pair in the computer's hand, the player lost.
if (PokerHands.TwoPair(pComputerHand))
{
Console.WriteLine("\nThe computer has a two pair!");
return false;
}
#endregion
#region One Pair
// If there is a one pair in the computer's hand and the player's hand, the player lost.
if (PokerHands.OnePair(pPlayerHand) & PokerHands.OnePair(pComputerHand))
{
Console.WriteLine("\nBoth players have a one pair!");
return false;
}
// If there is a one pair in the player's hand, the player won.
if (PokerHands.OnePair(pPlayerHand))
{
Console.WriteLine("\nYou have a one pair!");
return true;
}
// If there is a one pair in the computer's hand, the player lost.
if (PokerHands.OnePair(pComputerHand))
{
Console.WriteLine("\nThe computer has a one pair!");
return false;
}
#endregion
// If the player's hand value is greater than the computer's hand value, the player won.
if (playerHandValue > computerHandValue)
{
return true;
}
// If the player's hand value is less than or equal to the computer's hand value, the player lost.
if (playerHandValue <= computerHandValue)
{
return false;
}
// Satisfies all code paths must return a value error.
else
{
return false;
}
} // end of CompareHands()
This is what the class diagram for the project looks like:
This is what the console output looks like:
My question is whether its possible to extract a method (or several) out of these if statements, and provided that it is possible, how would I go about doing so? I also appreciate any other advice that you can offer like the regions being bad, for example.