Beginning Visual C# Exercises - Chapter 12
1. // Here's the general purpose event handler, but there is a problem....
public void GenericEvent(object sender, EventArgs e)
{
if (e is MessageArrivedEventArgs)
Console.WriteLine("Just received a MessageArrived event from {0}: {1}",
sender.ToString, (e as MessageArrivedEventArgs).Message);
else if (e is ElapsedEventArgs)
Console.WriteLine("Just received an Elapsed event from {0}: {1}",
sender.ToString, (e as ElapsedEventArgs).SignalTime);
}
// The GenericEvent signature won't delegate an ElapsedEvents argument so force it
public void ProcessElapsedEvent(timer sender, ElapsedEventArgs e)
{
GenericEvent(sender, e);
}
2. ... Wrote two new methods and replaced old HasWon() method
// A method to determine whether rank values are in sequence
private bool isStraight(int[] theHand, int theSpan)
{
int maxRank = 0;
int minRank = 13;
for (int r = 0; r < theSpan; r++)
{
if (theHand[r] > maxRank)
maxRank = theHand[r];
if (theHand[r] < minRank)
minRank = theHand[r];
}
return (maxRank == (minRank + theSpan -1));
}
// A method to determine whether a rank card is within straight flush
private bool isClash(int[] arraySuit, int matchSuit, int[] arrayRank, int matchRank)
{
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 7; j++)
{
if ((arraySuit[i] == matchSuit) && (arrayRank[j] == matchRank))
return true;
}
}
return false;
}
public bool HasWon()
{
// Declare and initialize variables
int cardCount = 0;
int rankValue = -1;
bool haveRank4 = false;
bool haveRank3 = false;
bool straightFlush4 = false;
bool straightFlush3 = false;
int[] sevenCards = new int[7];
int[] suitRank3 = new int[3];
// Determine what card ranks are in hand
for (Rank currentRank = 0; currentRank < (Rank)13; currentRank++)
{
foreach (Card theCard in hand)
{
if (theCard.rank == currentRank)
// Load the suit for each card that matches currentRank
sevenCards[cardCount++] = (int)theCard.suit;
}
// Analyze hand rank status
if (cardCount == 4)
{
// All four suits are present in hand for currentRank
haveRank4 = true;
// Remember for which rank we have all the 4 suits
rankValue = (int)currentRank;
}
else if (haveRank4 && (cardCount == 2))
// Can not accomplish rummy win
return false;
else if (haveRank3 && (cardCount > 1))
// Can not accomplish rummy win
return false;
else if (cardCount == 3)
{
haveRank3 = true;
// Remember for which rank we have 3 of the 4 suits
rankValue = (int)currentRank;
for (int q = 0; q < cardCount; q++)
{
suitRank3[q] = sevenCards[q];
}
}
// Test if we have both 3 and 4 of a kind status
if (haveRank3 && haveRank4)
// This is a winning rummy hand
return true;
// Reset the variables for next loop
sevenCards.Initialize();
cardCount = 0;
}
// Determine how many of each suit are in hand
for (Suit currentSuit = 0; currentSuit < (Suit)4; currentSuit++)
{
foreach (Card theCard in hand)
{
if (theCard.suit == currentSuit)
// Remember the rank of each card in currentSuit
sevenCards[cardCount++] = (int)theCard.rank;
}
// Analyze hand rank status
if (cardCount == 7)
{
// All seven cards in hand are of same suit (flush)
if (isStraight(sevenCards, cardCount))
return true;
else
{
// Use array class method for rank order sequence
Array.Sort(sevenCards);
// Make arrays to two possible rank combinations of 3 and 4 sequence
int[] testFour1 = new int[4];
int[] testFour2 = new int[4];
int[] testThree1 = new int[3];
int[] testThree2 = new int[3];
// Assign rank values from hand
for (int h = 0; h < cardCount; h++)
{
if (h < 4)
testFour1[h] = sevenCards[h];
if (h > 2)
testFour2[h -3] = sevenCards[h];
if (h > 3)
testThree1[h -4] = sevenCards[h];
if (h < 3)
testThree2[h] = sevenCards[h];
}
if (isStraight(testFour1, 4) && isStraight(testThree1, 3))
// Test 1: first four in rank sequence; last three in another rank sequence
return true;
else if (isStraight(testFour2, 4) && isStraight(testThree2, 3))
// Test 2: first three in rank sequence; last four in another rank sequence
return true;
else
// Test failed; do not have 3 & 4 rank sequences
return false;
}
}
else if (cardCount == 6)
{
// Can not accomplish rummy win
return false;
}
else if ((cardCount == 5) && (haveRank3 == true))
{
// Make array to test 4 sequence
int[] testFour = new int[4];
int k = 0;
// Select the 4 cards not involved in the rank match
for (int h = 0; h < cardCount; h++)
{
if ((sevenCards[h] != rankValue) && (k < cardCount))
testFour[k++] = sevenCards[h];
}
if ((k == (cardCount)) && (sevenCards[(cardCount -1)] != rankValue))
// Rummy hand not possible
return false;
else
// Have three cards of same rank, test if 4 card flush is straight
return isStraight(testFour, 4);
}
else if ((cardCount == 4) && (isStraight(sevenCards, cardCount)))
{
if ((haveRank4 == true) || (straightFlush3 == true))
// Have 4 card straight flush which includes one card from rank match
return true;
else if (haveRank3 == true)
// Determine whether rank card from straight flush in in rank match
return !isClash(sevenCards, rankValue, suitRank3, (int)currentSuit);
else
// Remember we have a four card straight flush
straightFlush4 = true;
}
else if ((cardCount == 4) && (haveRank4 == true))
{
// Make array to test 3 sequence
int[] testThree = new int[3];
int k = 0;
// Select the 3 cards not involved in the rank match
for (int h = 0; h < cardCount; h++)
{
if ((sevenCards[h] != rankValue) && (k < cardCount))
testThree[k++] = sevenCards[h];
}
if ((k == (cardCount)) && (sevenCards[(cardCount -1)] != rankValue))
// Rummy hand not possible
return false;
else
// Have three cards of same rank, test if 4 card flush is straight
return isStraight(testThree, 3);
}
else if ((cardCount == 3) && (isStraight(sevenCards, cardCount)))
{
if ((haveRank4 == true) || (straightFlush4 == true))
return true;
else
straightFlush3 = true;
}
sevenCards.Initialize();
cardCount = 0;
}
return false;
}
|