Code:
#include "blackjack.h"
#include "resource.h"
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASSEX wc;
HWND hwnd;
MSG Msg;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = 0;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)CreateSolidBrush(RGB(0,100,0));
wc.lpszMenuName = NULL;
wc.lpszClassName = g_szClassName;
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
if(!RegisterClassEx(&wc))
{
MessageBox(NULL, "Window Registration Failed!", "Error!",
MB_ICONEXCLAMATION | MB_OK);
return 0;
}
hwnd = CreateWindowEx(
WS_EX_CLIENTEDGE,
g_szClassName,
"Blackjack v1.0",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 1200,625,
NULL, NULL, hInstance, NULL);
if(hwnd == NULL)
{
MessageBox(NULL, "Window Creation Failed!", "Error!",
MB_ICONEXCLAMATION | MB_OK);
return 0;
}
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&Msg, NULL, 0, 0) > 0)
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
}
Blackjack::Blackjack(HWND hwnd)
{
srand(time(NULL));
for(int i=0; i<52; i++)
{
index.push_back(i);
}
random_shuffle(index.begin(), index.end());
player_card_coord_x = 100;
dealer_card_coord_x = 250;
card_counter = 0;
player_hand_value = 0;
dealer_hand_value = 0;
stay = FALSE;
}
void Blackjack::create(HWND hwnd){
hHit = CreateWindow("BUTTON", "HIT ME!",
WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
100, 500, 200, 50, hwnd, (HMENU)ID_hit,
(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL);
hStay = CreateWindow("BUTTON", "STAY",
WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
500, 500, 200, 50, hwnd, (HMENU)ID_stay,
(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL);
for(int i=0, j=ID_2OFSPADES; i<53; i++, j++)
{
deck[i] = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(j));
if(deck[i] == NULL)
{
MessageBox(hwnd, "Could Not Load Card!", "Error", MB_OK | MB_ICONEXCLAMATION);
}
}
}
void Blackjack::command(HWND hwnd, WPARAM wParam, LPARAM lParam)
{
WORD msg = LOWORD(wParam);
if(HIWORD(wParam) == BN_CLICKED)
{
if(msg == ID_hit)
{
InvalidateRect(hwnd, NULL, FALSE);
}
else if(msg == ID_stay)
{
stay = TRUE;
InvalidateRect(hwnd, NULL, FALSE);
}
}
}
void Blackjack::paint(HWND hwnd)
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
HDC hdcMem = CreateCompatibleDC(hdc);
if(!card_counter)
{
display_deck(hwnd, hdc, hdcMem);
get_card_player(hwnd, hdc, hdcMem);
}
if(stay == FALSE)
{
get_card_player(hwnd, hdc, hdcMem);
}
if(stay == TRUE)
{
get_card_dealer(hwnd, hdc, hdcMem);
}
SelectObject(hdcMem, hbmOld);
DeleteDC(hdcMem);
EndPaint(hwnd, &ps);
}
void Blackjack::close(HWND hwnd)
{
DestroyWindow(hwnd);
}
int Blackjack::destroy(HWND hwnd)
{
for(int i=0; i<53; i++)
{
DeleteObject(deck[i]);
}
PostQuitMessage(0);
return 0;
}
void Blackjack::display_deck(HWND hwnd, HDC hdc, HDC hdcMem)
{
BITMAP bm;
hbmOld = (HBITMAP)SelectObject(hdcMem, deck[52]);
GetObject(deck[52], sizeof(bm), &bm);
BitBlt(hdc, 100, 50, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY);
//SelectObject(hdcMem, hbmOld);
//DeleteDC(hdcMem);
}
void Blackjack::get_card_player(HWND hwnd, HDC hdc, HDC hdcMem)
{
BITMAP bm;
int card = index[card_counter];
hbmOld = (HBITMAP)SelectObject(hdcMem,deck[card]);
GetObject(deck[card], sizeof(bm), &bm);
BitBlt(hdc, player_card_coord_x, 300, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY);
set_hand_value(index[card_counter]);
player_card_coord_x+=150;
card_counter++;
is_blackjack(hwnd);
is_bust(hwnd);
}
void Blackjack::get_card_dealer(HWND hwnd, HDC hdc, HDC hdcMem)
{
BITMAP bm;
HBITMAP hbmOld;
int card;
do
{
card = index[card_counter];
hbmOld = (HBITMAP)SelectObject(hdcMem,deck[card]);
GetObject(deck[card], sizeof(bm), &bm);
BitBlt(hdc, dealer_card_coord_x, 50, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY);
set_dealer_hand_value(card);
dealer_card_coord_x += 150;
card_counter++;
card++;
Sleep(400);
}while(dealer_hand_value <= player_hand_value);
get_winner(hwnd);
reset(hwnd);
}
void Blackjack::get_winner(HWND hwnd)
{
if(dealer_hand_value <= 21 && dealer_hand_value > player_hand_value)
{
MessageBox(hwnd, "Dealer Wins.", "Loser." , MB_OK | MB_ICONSTOP);
}
else
{
MessageBox(hwnd, "Winner..!!!", "You win." , MB_OK | MB_ICONINFORMATION);
}
}
void Blackjack::set_hand_value(int card)
{
if(card < 4)// [0] to [3]
{
player_hand_value += 2;
}
else if(card > 3 && card < 8)// [4] to [7]
{
player_hand_value += 3;
}
else if(card > 7 && card < 12)//[8] to [11]
{
player_hand_value += 4;
}
else if(card > 11 && card < 16)//[12] to [15]
{
player_hand_value += 5;
}
else if(card > 15 && card < 20)//[16] to [19]
{
player_hand_value += 6;
}
else if(card > 19 && card < 24)//[20] to [23]
{
player_hand_value += 7;
}
else if(card > 23 && card < 28)//[24] to [27]
{
player_hand_value += 8;
}
else if(card > 27 && card < 32)//[28] to [31]
{
player_hand_value += 9;
}
else if(card > 31 && card < 48 )//[32] to [47]
{
player_hand_value += 10;
}
//Handle the Ace
else if(card > 47 && card < 52 && player_hand_value < 11)
{
player_hand_value += 11;
}
else if(card < 47 && card < 52 && player_hand_value > 10)
{
player_hand_value += 1;
}
}
void Blackjack::set_dealer_hand_value(int card)
{
if(card < 4)// [0] to [3]
{
dealer_hand_value += 2;
}
else if(card > 3 && card < 8)// [4] to [7]
{
dealer_hand_value += 3;
}
else if(card > 7 && card < 12)//[8] to [11]
{
dealer_hand_value += 4;
}
else if(card > 11 && card < 16)//[12] to [15]
{
dealer_hand_value += 5;
}
else if(card > 15 && card < 20)//[16] to [19]
{
dealer_hand_value += 6;
}
else if(card > 19 && card < 24)//[20] to [23]
{
dealer_hand_value += 7;
}
else if(card > 23 && card < 28)//[24] to [27]
{
dealer_hand_value += 8;
}
else if(card > 27 && card < 32)//[28] to [31]
{
dealer_hand_value += 9;
}
else if(card > 31 && card < 48 )//[32] to [47]
{
dealer_hand_value += 10;
}
//Handle the Ace
else if(card > 47 && card < 52 && player_hand_value < 11)
{
dealer_hand_value += 11;
}
else if(card < 47 && card < 52 && player_hand_value > 10)
{
dealer_hand_value += 1;
}
}
bool Blackjack::is_bust(HWND hwnd)
{
if(player_hand_value > 21)
{
MessageBox(hwnd, "Busted...!!!", "Busted.", MB_OK | MB_ICONSTOP);
reset(hwnd);
return TRUE;
}
else
{
return FALSE;
}
}
bool Blackjack::is_blackjack(HWND hwnd)
{
if(player_hand_value == 21)
{
MessageBox(hwnd, "BlAcKjAcK..!!", "You Win.", MB_OK | MB_ICONEXCLAMATION);
reset(hwnd);
return TRUE;
}
else
{
return FALSE;
}
}
void Blackjack::reset(HWND hwnd)
{
random_shuffle(index.begin(), index.end());
player_card_coord_x = 100;
dealer_card_coord_x = 250;
card_counter = 0;
player_hand_value = 0;
dealer_hand_value = 0;
stay = FALSE;
InvalidateRect(hwnd, NULL, TRUE);
}