// Copyright: (c) 1993-1998 Chris Breeze
// Licence: wxWindows licence
//---------------------------------------------------------------------------
-// Last modified: 22nd July 1998 - ported to wxWindows 2.0
+// Last modified: 22nd July 1998 - ported to wxWidgets 2.0
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#include "game.h"
Game::Game(int wins, int games, int score) :
- m_inPlay(FALSE),
+ m_inPlay(false),
m_moveIndex(0),
m_redoIndex(0),
m_bmap(0),
}
+void Game::Layout()
+{
+ int i;
+
+ m_pack->SetPos(2, 2 + 4 * (CardHeight + 2));
+
+ m_discard->SetPos(2, 2 + 5 * (CardHeight + 2));
+
+ for (i = 0; i < 8; i++)
+ {
+ m_foundations[i]->SetPos(2 + (i / 4) * (CardWidth + 2),
+ 2 + (i % 4) * (CardHeight + 2));
+ }
+
+ for (i = 0; i < 10; i++)
+ {
+ m_bases[i]->SetPos(8 + (i + 2) * (CardWidth + 2), 2);
+ }
+ delete m_bmap;
+ delete m_bmapCard;
+ m_bmap = 0;
+ m_bmapCard = 0;
+}
+
// Make sure we delete all objects created by the game object
Game::~Game()
{
{
if (src == dest)
{
- wxMessageBox("Game::DoMove() src == dest", "Debug message",
+ wxMessageBox(_T("Game::DoMove() src == dest"), _T("Debug message"),
wxOK | wxICON_EXCLAMATION);
}
m_moves[m_moveIndex].src = src;
}
else
{
- wxMessageBox("Game::DoMove() Undo buffer full", "Debug message",
+ wxMessageBox(_T("Game::DoMove() Undo buffer full"), _T("Debug message"),
wxOK | wxICON_EXCLAMATION);
}
- if (!m_inPlay)
+ if (!m_inPlay)
{
- m_inPlay = TRUE;
+ m_inPlay = true;
m_numGames++;
}
- DisplayScore(dc);
+ DisplayScore(dc);
+
+ if (HaveYouWon())
+ {
+ wxWindow *frame = wxTheApp->GetTopWindow();
+ wxWindow *canvas = (wxWindow *) NULL;
+
+ if (frame)
+ {
+ wxNode *node = (wxNode *)frame->GetChildren().GetFirst();
+ if (node) canvas = (wxWindow*)node->GetData();
+ }
+
+ // This game is over
+ m_inPlay = false;
+
+ // Redraw the score box to update games won
+ DisplayScore(dc);
+
+ if (wxMessageBox(_T("Do you wish to play again?"),
+ _T("Well Done, You have won!"), wxYES_NO | wxICON_QUESTION) == wxYES)
+ {
+ Deal();
+ canvas->Refresh();
+ }
+ else
+ {
+ // user cancelled the dialog - exit the app
+ ((wxFrame*)canvas->GetParent())->Close(true);
+ }
+ }
}
int w, h;
{
long width, height;
- dc.GetTextExtent("Average score:m_x", &width, &height);
+ dc.GetTextExtent(_T("Average score:m_x"), &width, &height);
w = width;
h = height;
}
dc.DrawRectangle(x + w, y, 20, 4 * h);
- char str[80];
- sprintf(str, "%d", m_currentScore);
- dc.DrawText("Score:", x, y);
+ wxString str;
+ str.Printf(_T("%d"), m_currentScore);
+ dc.DrawText(_T("Score:"), x, y);
dc.DrawText(str, x + w, y);
y += h;
- sprintf(str, "%d", m_numGames);
- dc.DrawText("Games played:", x, y);
+ str.Printf(_T("%d"), m_numGames);
+ dc.DrawText(_T("Games played:"), x, y);
dc.DrawText(str, x + w, y);
y += h;
- sprintf(str, "%d", m_numWins);
- dc.DrawText("Games won:", x, y);
+ str.Printf(_T("%d"), m_numWins);
+ dc.DrawText(_T("Games won:"), x, y);
dc.DrawText(str, x + w, y);
y += h;
{
average = (2 * (m_currentScore + m_totalScore) + m_numGames ) / (2 * m_numGames);
}
- sprintf(str, "%d", average);
- dc.DrawText("Average score:", x, y);
+ str.Printf(_T("%d"), average);
+ dc.DrawText(_T("Average score:"), x, y);
dc.DrawText(str, x + w, y);
}
m_totalScore += m_currentScore;
}
m_currentScore = 0;
- m_inPlay = FALSE;
+ m_inPlay = false;
}
// Initialise the card bitmap to the background colour
wxMemoryDC memoryDC;
memoryDC.SelectObject(*m_bmapCard);
+ memoryDC.SetPen( *wxTRANSPARENT_PEN );
memoryDC.SetBrush(FortyApp::BackgroundBrush());
memoryDC.DrawRectangle(0, 0, CardWidth, CardHeight);
memoryDC.SelectObject(*m_bmap);
{
for(i = 0; i < 4; i++)
{
- Card* m_topCard;
- if ((m_topCard = m_foundations[i]->GetTopCard()))
+ Card* m_topCard = m_foundations[i]->GetTopCard();
+ if ( m_topCard )
{
if (m_topCard->GetSuit() == card->GetSuit() &&
m_foundations[i + 4] != pile &&
// i.e. m_pack, discard and bases are empty
bool Game::HaveYouWon()
{
- if (m_pack->GetTopCard()) return FALSE;
- if (m_discard->GetTopCard()) return FALSE;
+ if (m_pack->GetTopCard()) return false;
+ if (m_discard->GetTopCard()) return false;
for(int i = 0; i < 10; i++)
{
- if (m_bases[i]->GetTopCard()) return FALSE;
+ if (m_bases[i]->GetTopCard()) return false;
}
m_numWins++;
m_totalScore += m_currentScore;
m_currentScore = 0;
- return TRUE;
+ return true;
}
// See whether the card under the cursor can be moved somewhere else
-// Returns TRUE if it can be moved, FALSE otherwise
+// Returns 'true' if it can be moved, 'false' otherwise
bool Game::CanYouGo(int x, int y)
{
Pile* pile = WhichPile(x, y);
{
if (m_foundations[i]->AcceptCard(card) && m_foundations[i] != pile)
{
- return TRUE;
+ return true;
}
}
for(i = 0; i < 10; i++)
m_bases[i]->AcceptCard(card) &&
m_bases[i] != pile)
{
- return TRUE;
+ return true;
}
}
}
}
- return FALSE;
+ return false;
}
bool Game::DropCard(int x, int y, Pile* pile, Card* card)
{
- bool retval = FALSE;
+ bool retval = false;
if (pile->Overlap(x, y))
{
if (pile->AcceptCard(card))
{
- retval = TRUE;
+ retval = true;
}
}
return retval;
}
for (i = 0; i <= m_topCard; i++)
{
- int pos = rand() % (m_topCard + 1);
- while (temp[pos])
- {
- pos--;
- if (pos < 0) pos = m_topCard;
- }
- m_cards[i]->TurnCard(facedown);
- temp[pos] = m_cards[i];
+ int pos = rand() % (m_topCard + 1);
+ while (temp[pos])
+ {
+ pos--;
+ if (pos < 0) pos = m_topCard;
+ }
+ m_cards[i]->TurnCard(facedown);
+ temp[pos] = m_cards[i];
m_cards[i] = 0;
}
// unoccupied position after the random position.
for (i = 0; i <= m_topCard; i++)
{
- int pos = rand() % (m_topCard + 1);
- while (m_cards[pos])
- {
- pos++;
+ int pos = rand() % (m_topCard + 1);
+ while (m_cards[pos])
+ {
+ pos++;
if (pos > m_topCard) pos = 0;
- }
+ }
m_cards[pos] = temp[i];
}
}
{
Pile::Redraw(dc);
- char str[10];
- sprintf(str, "%d ", m_topCard + 1);
+ wxString str;
+ str.Printf(_T("%d "), m_topCard + 1);
+ dc.SetBackgroundMode( wxSOLID );
dc.SetTextBackground(FortyApp::BackgroundColour());
dc.SetTextForeground(FortyApp::TextColour());
dc.DrawText(str, m_x + CardWidth + 5, m_y + CardHeight / 2);
}
else
{
- wxMessageBox("Pack::AddCard() Undo error", "Forty Thieves: Warning",
+ wxMessageBox(_T("Pack::AddCard() Undo error"), _T("Forty Thieves: Warning"),
wxOK | wxICON_EXCLAMATION);
}
card->TurnCard(facedown);
{
for (m_topCard = 0; m_topCard < NumCards; m_topCard++)
{
- delete m_cards[m_topCard];
+ delete m_cards[m_topCard];
}
};
bool Base::AcceptCard(Card* card)
{
- bool retval = FALSE;
+ bool retval = false;
if (m_topCard >= 0)
{
- if (m_cards[m_topCard]->GetSuit() == card->GetSuit() &&
- m_cards[m_topCard]->GetPipValue() - 1 == card->GetPipValue())
- {
- retval = TRUE;
+ if (m_cards[m_topCard]->GetSuit() == card->GetSuit() &&
+ m_cards[m_topCard]->GetPipValue() - 1 == card->GetPipValue())
+ {
+ retval = true;
}
}
else
{
// pile is empty - ACCEPT
- retval = TRUE;
+ retval = true;
}
return retval;
}
bool Foundation::AcceptCard(Card* card)
{
- bool retval = FALSE;
+ bool retval = false;
if (m_topCard >= 0)
{
- if (m_cards[m_topCard]->GetSuit() == card->GetSuit() &&
- m_cards[m_topCard]->GetPipValue() + 1 == card->GetPipValue())
- {
- retval = TRUE;
+ if (m_cards[m_topCard]->GetSuit() == card->GetSuit() &&
+ m_cards[m_topCard]->GetPipValue() + 1 == card->GetPipValue())
+ {
+ retval = true;
}
}
else if (card->GetPipValue() == 1)
{
- // It's an ace and the pile is empty - ACCEPT
- retval = TRUE;
+ // It's an ace and the pile is empty - ACCEPT
+ retval = true;
}
return retval;
}
{
if (m_topCard >= 0)
{
- if (m_dx == 0 && m_dy == 0)
- {
+ if (m_dx == 0 && m_dy == 0)
+ {
m_cards[m_topCard]->Draw(dc, m_x, m_y);
- }
- else
- {
- int x = m_x;
- int y = m_y;
- for (int i = 0; i <= m_topCard; i++)
+ }
+ else
{
- m_cards[i]->Draw(dc, x, y);
- x += m_dx;
- y += m_dy;
- if (i == 31)
- {
- x = m_x;
+ int x = m_x;
+ int y = m_y;
+ for (int i = 0; i <= m_topCard; i++)
+ {
+ m_cards[i]->Draw(dc, x, y);
+ x += m_dx;
+ y += m_dy;
+ if (i == 31)
+ {
+ x = m_x;
y = m_y + CardHeight / 3;
}
}
{
if (m_topCard < 0)
{
- x = m_x;
- y = m_y;
+ x = m_x;
+ y = m_y;
}
else if (m_topCard > 31)
{
- x = m_x + m_dx * (m_topCard - 32);
- y = m_y + CardHeight / 3;
+ x = m_x + m_dx * (m_topCard - 32);
+ y = m_y + CardHeight / 3;
}
else
{
- x = m_x + m_dx * m_topCard;
- y = m_y;
+ x = m_x + m_dx * m_topCard;
+ y = m_y;
}
}