drawRect.Height = card.CardImage.Height;
g.DrawImage(
card.CardImage, // Image
drawRect, // destination rectange
0, // srcX
0, // srcY
card.CardImage.Width, // srcWidth
card.CardImage.Height, // srcHeight
GraphicsUnit.Pixel, // srcUnit
Card.cardAttributes); // ImageAttributes
drawRect.X += gapx;
drawRect.Y += gapy;
}
}
///
/// Computes the score of the hand
///
///
public int BlackJackScoreHand
{
int score = 0;
int aces = 0;
foreach (Card card in this)
{
score += card.BlackJackScore;
if (card.BlackJackScore == 11)
{
aces++;
}
}
while ((score > 21) && (aces > 0))
{
score -= 10;
aces–;
}
return score;
}
}
///
/// Contains a number of card decks
/// which can be dealt one at a time.
///
public class CardShoe
{
private int noOfDecks = 1;
private byte[] decks;
private int nextCard;
private bool testShoe = false;
///
/// True if the deck is "stacked",
/// i.e. was created from a byte array
///
public bool TestShoe
{
get
{
return testShoe;
}
}
private void makeShoe
{
decks = new byte[noOfDecks * 52];
int cardPos = 0;
for (int i = 0; i < noOfDecks; i++)
{
for (byte j = 1; j < 53; j++)
{
decks[cardPos] = j;
cardPos++;
}
}
nextCard = 0;
}
private void shuffleShoe
{
if (!testShoe)
{
System.Random rand = new Random;
byte swap;
int p1, p2;
for (int i = 0; i < decks.Length; i++)
{
p1 = rand.Next(decks.Length);
p2 = rand.Next(decks.Length);
swap = decks[p1];
decks[p1] = decks[p2];
decks[p2] = swap;
}
}
nextCard = 0;
}
///
/// Gets the next card number from the deck
///
///
public byte NextCardNo
{
if (nextCard == decks.Length)
{
shuffleShoe;
}
return decks[nextCard++];
}
///
/// Gets the next card from the deck.
///
///
public Card DealCard
{
return new Card(NextCardNo);
}
///
/// Constructs a shoe containing a number of decks
///
///
public CardShoe(int noOfDecks)
{
this.noOfDecks = noOfDecks;
makeShoe;
shuffleShoe;
testShoe = false;
}
///
/// Constructs a shoe containing a single deck
///
public CardShoe
: this(1)
{
}
///
/// Creates a stacked deck for test purposes.
///
/// array of bytes
public CardShoe(byte[] stackedDeck)
{
decks = stackedDeck;
testShoe = true;
}
}
}
В панели Solution Explorer выполняем правый щелчок по имени проекта и в контекстном меню выбираем Add, New Item. В панели Add New Item выделяем шаблон Code File, в окне Name записываем имя нового файла с расширением *.cs и щёлкаем кнопку Add. В проект (и в панель Solution Explorer) добавляется этот файл, открывается пустое окно редактирования кода, в которое записываем следующий код.
Листинг 1.12. Новый файл Pot.cs .
using System;
namespace PocketJack
{
///
/// Summary description for Betting.
///
public class Pot
{
private int betValueChangeValue;
private int betValue;
private int potValue;
private const int INITIAL_POT_VALUE = 500;
private const int INITIAL_BET_CHANGE_VALUE = 5;
public int BetValue
{
get
{
return betValue;
}
}
public int PotValue
{
get
{
return potValue;
}
}
public void ResetPot
{
betValueChangeValue = INITIAL_BET_CHANGE_VALUE;
betValue = INITIAL_BET_CHANGE_VALUE;
potValue = INITIAL_POT_VALUE;
}
public void CheckPot
{
if (betValue > potValue)
{
if (System.Windows.Forms.MessageBox.Show(
"Insufficient funds for the bet." +
"Do you want to reload the pot?",
"Bank",
System.Windows.Forms.MessageBoxButtons.YesNo,
System.Windows.Forms.MessageBoxIcon.Question,
System.Windows.Forms.
MessageBoxDefaultButton.Button1) ==
System.Windows.Forms.DialogResult.Yes)
{
ResetPot;
}
else
{
betValue = potValue;
}
}
}
public void DoIncreaseBet
{
betValue = betValue + betValueChangeValue;
CheckPot;
}
public void DoDecreaseBet
{
if (betValue >= betValueChangeValue)
{
betValue = betValue – betValueChangeValue;
}
}
public void PlayerWins
{
// win back 2 * our stake
potValue = potValue + betValue;
//potValue = potValue + betValue; //We commented out.
}
public void HouseWins
{
CheckPot;
}
public void DoPushBet
{
// put the betValue back in the potValue
potValue = potValue + betValue;
}
public void DoPlaceBet
{
potValue = potValue – betValue;
}
public Pot
{
ResetPot;
}
}
}
После этого добавления в панели Solution Explorer должны быть файлы, показанные на рисунке выше. Дважды щёлкая по имени файла, любой файл можно открыть, изучить и редактировать.
В этих файлах использованы XML-комментарии (XML comment), где XML – Extensible Markup Language – расширяемый язык разметки, типа:
///
/// Description of a variable:
///
который состоит из начального тэга (start tag):
///
и конечного тэга (end tag):
///
между которыми записывается сам комментарий:
/// Описание переменной:
/// Description of a variable: