|
|
/* Pegged.C -- Windows Game*/ /* (c) By Mike Blaylock - 1989, 1990 */
#include "windows.h"
#include <port1632.h>
#include "math.h"
#include "pegged.h"
#define DIVISIONS 7
#define ICON_NAME "Pegged"
#define HELP_FILE "pegged.hlp"
VOID checkfvmove(); VOID checkfanymoves();
VOID APIENTRY AboutWEP(HWND, HICON, LPSTR, LPSTR);
RECT r; INT prevxorg, prevyorg; INT prevwidth, prevheight;
HWND hWnd ;
HANDLE hAccTable; INT m = 0, nDefault = 3; LONG_PTR prevwarea, newarea; INT xPrevpoint, yPrevpoint, xLeft, yTop; WPARAM wprevmenuitem;
HANDLE hPeggedIcon;
HANDLE hBitmap, hWBitmap , hIntBitmap, hOldWBitmap, hOldIntBitmap, hBoardBitmap, hOldBoardBitmap, htmpBitmap, hWtmpBitmap , hInttmpBitmap, hOldWtmpBitmap, hOldInttmpBitmap, hBoardtmpBitmap, hOldBoardtmpBitmap;
INT icross = 1, iplus = 0, ifireplace = 0, ipyramid = 0, ilamp = 0, idiamond = 0, iuparrow = 0, isolitaire = 0, fanymoremoves = 0, ntotal = 0, fignorelbutton = 0, fmousefocusd = 0;
INT ffirst = 1, foomed = 0;
LPSTR lpszCommands[10], lpszHowToPlay[10]; LONG lPrevSizeParam ;
struct { INT xsource; INT ysource; INT xdest; INT ydest; INT xjumped; INT yjumped; } move[34];
LRESULT APIENTRY WndProc (HWND, UINT, WPARAM, LPARAM) ;
CHAR szAppName [] = "Pegged"; static BOOL bState [DIVISIONS][DIVISIONS];
HDC hDC, hMemDC, hMemwinDC, hIntDC, hBoardDC, htmpMemDC, htmpMemwinDC, htmpIntDC, htmpBoardDC; HBRUSH hLtgrybrush, hDkgrybrush, hYbrush, hBbrush, hBlkbrush, hGbrush, hMedgrybrush; HPEN hWpen, hLtwpen, hBlkpen, hDkgrypen, hThkdkgrypen, hMedgrypen, hLtgrypen; INT first = 1, fhitbutton = 0, fmovingchip = 0, fvalidmove = 0, fcanundo = 0, foom = 0, foomonsize = 0; INT ixdownblock, iydownblock, ixupblock, iyupblock, ixkilledblock, iykilledblock, ixjumpedblock, iyjumpedblock, ixprevsource, iyprevsource, ixprevdest, iyprevdest, ixprevkilled, iyprevkilled;
MMain(hInstance, hPrevInstance, lpszCmdLine, nCmdShow) /* { */ /* HWND hWnd ;*/ MSG msg ; WNDCLASS wndclass ; static INT xScreen, yScreen, xSize, ySize;
/*multinst.c */
if (hPrevInstance) {
hWnd = FindWindow(szAppName, NULL); SendMessage(hWnd, WM_SYSCOMMAND, SC_RESTORE, (LONG) 0); hWnd = GetLastActivePopup(hWnd); BringWindowToTop(hWnd); return FALSE; }
if (!hPrevInstance) { wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon(hInstance, (LPSTR) ICON_NAME); hPeggedIcon = wndclass.hIcon; wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground = GetStockObject (WHITE_BRUSH) ; wndclass.lpszMenuName = szAppName ; wndclass.lpszClassName = szAppName ;
if (!RegisterClass (&wndclass)) return FALSE ; }
xScreen = GetSystemMetrics(SM_CXSCREEN); yScreen = GetSystemMetrics(SM_CYSCREEN); if (xScreen > yScreen) { xSize = (xScreen / 8) * 3; ySize = xSize; } else { ySize = (yScreen / 8) * 3; xSize = ySize; }
hWnd = CreateWindow (szAppName, "Pegged", WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX, (xScreen-xSize) / 2, (yScreen-ySize) / 2, xSize, ySize, NULL, NULL, hInstance, NULL) ;
ShowWindow (hWnd, nCmdShow) ; UpdateWindow (hWnd) ; hAccTable = LoadAccelerators(hInstance, "MainAcc");
while (GetMessage (&msg, NULL, 0, 0) ) if (!TranslateAccelerator(hWnd, hAccTable, &msg) ) { { TranslateMessage (&msg) ; DispatchMessage (&msg) ; }
}
return (INT) msg.wParam ; }
LRESULT APIENTRY WndProc ( HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam) {
static INT xBlock, xsizedBlock, yBlock, ysizedBlock, xEdge, yEdge, xShadow, yShadow, xHalf, yHalf, winxEdge, winyEdge; HDC hDC; PAINTSTRUCT ps; RECT rect; LONG xul, yul; INT x, y, j, k;
static INT xClient, xsizedClient, yClient, ysizedClient, xCenter, yCenter, oldxCenter, oldyCenter, xTotal, yTotal, xRadius, yRadius, xMove, yMove, xPixel, yPixel, i; INT xPoint, yPoint, xUp, yUp; SHORT nScale; BOOL bShow;
MSG message; HMENU hMenu;
switch (iMessage) { case WM_INITMENUPOPUP: if (m) EnableMenuItem((HMENU)wParam, IDM_UNDO, MF_ENABLED); else EnableMenuItem((HMENU)wParam, IDM_UNDO, MF_GRAYED); break;
case WM_COMMAND: switch (GET_WM_COMMAND_ID(wParam, lParam)) { case IDM_NEW: m = 0; hDC = GetDC(hWnd);
if (isolitaire) { for (j = 0; j < 7; ++j) for (k = 0; k < 7; ++k) { if ((j > 1 && j < 5) || (k > 1 && k < 5)) if (!(j == 3 && k == 3)) bState[j][k] = 1; else bState[j][k] = 0; } }
if (icross) { bState[0][2] = 0; bState[0][3] = 0; bState[0][4] = 0; bState[1][2] = 0; bState[1][3] = 0; bState[1][4] = 0; bState[2][0] = 0; bState[2][1] = 0; bState[2][2] = 1; bState[2][3] = 0; bState[2][4] = 0; bState[2][5] = 0; bState[2][6] = 0; bState[3][0] = 0; bState[3][1] = 1; bState[3][2] = 1; bState[3][3] = 1; bState[3][4] = 1; bState[3][5] = 0; bState[3][6] = 0; bState[4][0] = 0; bState[4][1] = 0; bState[4][2] = 1; bState[4][3] = 0; bState[4][4] = 0; bState[4][5] = 0; bState[4][6] = 0; bState[5][2] = 0; bState[5][3] = 0; bState[5][4] = 0; bState[6][2] = 0; bState[6][3] = 0; bState[6][4] = 0; }
if (iuparrow) { bState[0][2] = 0; bState[0][3] = 0; bState[0][4] = 0; bState[1][2] = 1; bState[1][3] = 0; bState[1][4] = 0; bState[2][0] = 0; bState[2][1] = 1; bState[2][2] = 1; bState[2][3] = 0; bState[2][4] = 0; bState[2][5] = 1; bState[2][6] = 1; bState[3][0] = 1; bState[3][1] = 1; bState[3][2] = 1; bState[3][3] = 1; bState[3][4] = 1; bState[3][5] = 1; bState[3][6] = 1; bState[4][0] = 0; bState[4][1] = 1; bState[4][2] = 1; bState[4][3] = 0; bState[4][4] = 0; bState[4][5] = 1; bState[4][6] = 1; bState[5][2] = 1; bState[5][3] = 0; bState[5][4] = 0; bState[6][2] = 0; bState[6][3] = 0; bState[6][4] = 0;
}
if (iplus) { bState[0][2] = 0; bState[0][3] = 0; bState[0][4] = 0; bState[1][2] = 0; bState[1][3] = 1; bState[1][4] = 0; bState[2][0] = 0; bState[2][1] = 0; bState[2][2] = 0; bState[2][3] = 1; bState[2][4] = 0; bState[2][5] = 0; bState[2][6] = 0; bState[3][0] = 0; bState[3][1] = 1; bState[3][2] = 1; bState[3][3] = 1; bState[3][4] = 1; bState[3][5] = 1; bState[3][6] = 0; bState[4][0] = 0; bState[4][1] = 0; bState[4][2] = 0; bState[4][3] = 1; bState[4][4] = 0; bState[4][5] = 0; bState[4][6] = 0; bState[5][2] = 0; bState[5][3] = 1; bState[5][4] = 0; bState[6][2] = 0; bState[6][3] = 0; bState[6][4] = 0;
}
if (ifireplace) { bState[0][2] = 0; bState[0][3] = 0; bState[0][4] = 0; bState[1][2] = 0; bState[1][3] = 0; bState[1][4] = 0; bState[2][0] = 1; bState[2][1] = 1; bState[2][2] = 1; bState[2][3] = 1; bState[2][4] = 0; bState[2][5] = 0; bState[2][6] = 0; bState[3][0] = 1; bState[3][1] = 1; bState[3][2] = 1; bState[3][3] = 0; bState[3][4] = 0; bState[3][5] = 0; bState[3][6] = 0; bState[4][0] = 1; bState[4][1] = 1; bState[4][2] = 1; bState[4][3] = 1; bState[4][4] = 0; bState[4][5] = 0; bState[4][6] = 0; bState[5][2] = 0; bState[5][3] = 0; bState[5][4] = 0; bState[6][2] = 0; bState[6][3] = 0; bState[6][4] = 0;
}
if (ipyramid) { bState[0][2] = 0; bState[0][3] = 0; bState[0][4] = 1; bState[1][2] = 0; bState[1][3] = 1; bState[1][4] = 1; bState[2][0] = 0; bState[2][1] = 0; bState[2][2] = 1; bState[2][3] = 1; bState[2][4] = 1; bState[2][5] = 0; bState[2][6] = 0; bState[3][0] = 0; bState[3][1] = 1; bState[3][2] = 1; bState[3][3] = 1; bState[3][4] = 1; bState[3][5] = 0; bState[3][6] = 0; bState[4][0] = 0; bState[4][1] = 0; bState[4][2] = 1; bState[4][3] = 1; bState[4][4] = 1; bState[4][5] = 0; bState[4][6] = 0; bState[5][2] = 0; bState[5][3] = 1; bState[5][4] = 1; bState[6][2] = 0; bState[6][3] = 0; bState[6][4] = 1;
}
if (idiamond) { bState[0][2] = 0; bState[0][3] = 1; bState[0][4] = 0; bState[1][2] = 1; bState[1][3] = 1; bState[1][4] = 1; bState[2][0] = 0; bState[2][1] = 1; bState[2][2] = 1; bState[2][3] = 1; bState[2][4] = 1; bState[2][5] = 1; bState[2][6] = 0; bState[3][0] = 1; bState[3][1] = 1; bState[3][2] = 1; bState[3][3] = 0; bState[3][4] = 1; bState[3][5] = 1; bState[3][6] = 1; bState[4][0] = 0; bState[4][1] = 1; bState[4][2] = 1; bState[4][3] = 1; bState[4][4] = 1; bState[4][5] = 1; bState[4][6] = 0; bState[5][2] = 1; bState[5][3] = 1; bState[5][4] = 1; bState[6][2] = 0; bState[6][3] = 1; bState[6][4] = 0;
}
/******Erase all the chips *************************************/
for (x = 0; x < DIVISIONS; x++) for (y = 0; y < DIVISIONS; y++) { if ((x > 1 && x < 5) || (y > 1 && y < 5)) { BitBlt(hDC, xBlock * x + winxEdge, yBlock *y + winyEdge, xBlock, yBlock, hBoardDC, xBlock * x + winxEdge, yBlock * y + winyEdge, SRCCOPY); } } /*************************************************************/
/********* Put chips where they go *****************************/ for (x = 0; x < DIVISIONS; x++) for (y = 0; y < DIVISIONS; y++) { if (bState[x][y]) {
SelectObject(hDC, hDkgrypen); SelectObject(hDC, hDkgrybrush); Ellipse(hDC, x * xBlock + xEdge + xShadow + winxEdge, y * yBlock + yEdge + yShadow + winyEdge, (x + 1) * xBlock - xEdge + xShadow + winxEdge, (y + 1) * yBlock - yEdge + yShadow + winyEdge);
SelectObject(hDC, hBlkpen); SelectObject(hDC, hBbrush); Ellipse(hDC, x * xBlock + xEdge + winxEdge, y * yBlock + yEdge + winyEdge, (x + 1) * xBlock - xEdge + winxEdge, (y + 1) * yBlock - yEdge + winyEdge);
SelectObject(hDC, hWpen); Arc(hDC, x * xBlock + xEdge + xShadow + winxEdge, y * yBlock + yEdge + yShadow + winyEdge, (x + 1) * xBlock - xEdge - xShadow + winxEdge, (y + 1) * yBlock - yEdge - yShadow + winyEdge , x * xBlock + xHalf + winxEdge , y * yBlock + yShadow + winyEdge, x * xBlock + xShadow + winxEdge, y * yBlock + yHalf + winyEdge);
} } /***************************************************************/
BitBlt(hMemwinDC, 0, 0, xClient, yClient, hDC, 0, 0, SRCCOPY);
ReleaseDC(hWnd, hDC);
break;
case IDM_UNDO: if (m) { --m; /*put a chip back in the original location */ hDC = GetDC(hWnd); /*erase the destination chip on screen*/ BitBlt(hDC, move[m].xdest * xBlock + winxEdge, move[m].ydest * yBlock + winyEdge, xBlock, yBlock, hBoardDC, move[m].xdest * xBlock + winxEdge, move[m].ydest *yBlock + winyEdge , SRCCOPY);
/*Erase the destination chip on the memdc */ SelectObject(hMemwinDC, hWBitmap); BitBlt(hMemwinDC, move[m].xdest * xBlock + winxEdge, move[m].ydest * yBlock + winyEdge, xBlock, yBlock, hBoardDC, move[m].xdest * xBlock + winxEdge, move[m].ydest *yBlock + winyEdge , SRCCOPY);
/*Put back the jumped chip on the screen*/
x = move[m].xjumped; y = move[m].yjumped;
SelectObject(hDC, hDkgrypen); SelectObject(hDC, hDkgrybrush); Ellipse(hDC, x * xBlock + xEdge + xShadow + winxEdge, y * yBlock + yEdge + yShadow + winyEdge, (x + 1) * xBlock - xEdge + xShadow + winxEdge, (y + 1) * yBlock - yEdge + yShadow + winyEdge); SelectObject(hDC, hBlkpen); SelectObject(hDC, hBbrush); Ellipse(hDC, x * xBlock + xEdge + winxEdge, y * yBlock + yEdge + winyEdge, (x + 1) * xBlock - xEdge + winxEdge, (y + 1) * yBlock - yEdge + winyEdge);
SelectObject(hDC, hWpen); Arc(hDC, x * xBlock + xEdge + xShadow + winxEdge, y * yBlock + yEdge + yShadow + winyEdge, (x + 1) * xBlock - xEdge - xShadow + winxEdge, (y + 1) * yBlock - yEdge - yShadow + winyEdge , x * xBlock + xHalf + winxEdge , y * yBlock + yShadow + winyEdge, x * xBlock + xShadow + winxEdge, y * yBlock + yHalf + winyEdge);
/* Put back the jumped chip in the memdc */ SelectObject(hMemwinDC, hWBitmap); BitBlt(hMemwinDC, move[m].xjumped * xBlock + winxEdge, move[m].yjumped * yBlock + winyEdge, xBlock, yBlock, hDC, move[m].xjumped * xBlock + winxEdge, move[m].yjumped *yBlock + winyEdge , SRCCOPY);
/*Put back the source chip on the screen*/
x = move[m].xsource; y = move[m].ysource;
SelectObject(hDC, hDkgrypen); SelectObject(hDC, hDkgrybrush); Ellipse(hDC, x * xBlock + xEdge + xShadow + winxEdge, y * yBlock + yEdge + yShadow + winyEdge, (x + 1) * xBlock - xEdge + xShadow + winxEdge, (y + 1) * yBlock - yEdge + yShadow + winyEdge); SelectObject(hDC, hBlkpen); SelectObject(hDC, hBbrush); Ellipse(hDC, x * xBlock + xEdge + winxEdge, y * yBlock + yEdge + winyEdge, (x + 1) * xBlock - xEdge + winxEdge, (y + 1) * yBlock - yEdge + winyEdge);
SelectObject(hDC, hWpen); Arc(hDC, x * xBlock + xEdge + xShadow + winxEdge, y * yBlock + yEdge + yShadow + winyEdge, (x + 1) * xBlock - xEdge - xShadow + winxEdge, (y + 1) * yBlock - yEdge - yShadow + winyEdge , x * xBlock + xHalf + winxEdge , y * yBlock + yShadow + winyEdge, x * xBlock + xShadow + winxEdge, y * yBlock + yHalf + winyEdge);
/* Put back the source chip in the memdc */ SelectObject(hMemwinDC, hWBitmap); BitBlt(hMemwinDC, move[m].xsource * xBlock + winxEdge, move[m].ysource * yBlock + winyEdge, xBlock, yBlock, hDC, move[m].xsource * xBlock + winxEdge, move[m].ysource *yBlock + winyEdge , SRCCOPY);
/*Restore the matrix to previous state*/
bState[move[m].xsource][move[m].ysource] = 1; bState[move[m].xjumped][move[m].yjumped] = 1; bState[move[m].xdest][move[m].ydest] = 0;
ReleaseDC(hWnd, hDC);
} else MessageBox(hWnd, "Can't Backup", szAppName, MB_ICONASTERISK | MB_OK); break;
case IDM_CROSS: icross = 1; iplus = 0; ifireplace = 0; ipyramid = 0; ilamp = 0; idiamond = 0; iuparrow = 0; isolitaire = 0;
hMenu = GetMenu(hWnd); CheckMenuItem(hMenu, (WORD)wprevmenuitem, MF_UNCHECKED); CheckMenuItem(hMenu, IDM_CROSS, MF_CHECKED);
wprevmenuitem = wParam; PostMessage(hWnd, WM_COMMAND, IDM_NEW, 0L);
break;
case IDM_PLUS:
iplus = 1; icross = 0; ifireplace = 0; ipyramid = 0; ilamp = 0; idiamond = 0; iuparrow = 0; isolitaire = 0;
hMenu = GetMenu(hWnd); CheckMenuItem(hMenu, (WORD)wprevmenuitem, MF_UNCHECKED); CheckMenuItem(hMenu, (WORD)wParam, MF_CHECKED);
wprevmenuitem = wParam; PostMessage(hWnd, WM_COMMAND, IDM_NEW, 0L);
break;
case IDM_FIREPLACE:
iplus = 0; icross = 0; ifireplace = 1; ipyramid = 0; ilamp = 0; idiamond = 0; iuparrow = 0; isolitaire = 0;
hMenu = GetMenu(hWnd); CheckMenuItem(hMenu, (WORD)wprevmenuitem, MF_UNCHECKED); CheckMenuItem(hMenu, (WORD)wParam, MF_CHECKED);
wprevmenuitem = wParam; PostMessage(hWnd, WM_COMMAND, IDM_NEW, 0L);
break;
case IDM_UPARROW: iplus = 0; icross = 0; ifireplace = 0; ipyramid = 0; ilamp = 0; idiamond = 0; iuparrow = 1; isolitaire = 0;
hMenu = GetMenu(hWnd); CheckMenuItem(hMenu, (WORD)wprevmenuitem, MF_UNCHECKED); CheckMenuItem(hMenu, (WORD)wParam, MF_CHECKED);
wprevmenuitem = wParam; PostMessage(hWnd, WM_COMMAND, IDM_NEW, 0L);
break;
case IDM_DIAMOND: iplus = 0; icross = 0; ifireplace = 0; ipyramid = 0; ilamp = 0; idiamond = 1; iuparrow = 0; isolitaire = 0; hMenu = GetMenu(hWnd); CheckMenuItem(hMenu, (WORD)wprevmenuitem, MF_UNCHECKED); CheckMenuItem(hMenu, (WORD)wParam, MF_CHECKED);
wprevmenuitem = wParam; PostMessage(hWnd, WM_COMMAND, IDM_NEW, 0L);
break;
case IDM_PYRAMID: iplus = 0; icross = 0; ifireplace = 0; ipyramid = 1; ilamp = 0; idiamond = 0; iuparrow = 0; isolitaire = 0; hMenu = GetMenu(hWnd); CheckMenuItem(hMenu, (WORD)wprevmenuitem, MF_UNCHECKED); CheckMenuItem(hMenu, (WORD)wParam, MF_CHECKED);
wprevmenuitem = wParam; PostMessage(hWnd, WM_COMMAND, IDM_NEW, 0L);
break;
case IDM_SOLITAIRE: iplus = 0; icross = 0; ifireplace = 0; ipyramid = 0; ilamp = 0; idiamond = 0; iuparrow = 0; isolitaire = 1; hMenu = GetMenu(hWnd); CheckMenuItem(hMenu, (WORD)wprevmenuitem, MF_UNCHECKED); CheckMenuItem(hMenu, (WORD)wParam, MF_CHECKED);
wprevmenuitem = wParam; PostMessage(hWnd, WM_COMMAND, IDM_NEW, 0L);
break; case IDM_ABOUT: AboutWEP(hWnd, hPeggedIcon , "Pegged! Version 1.0", "by Mike Blaylock");
/*
MessageBox(hWnd,"Pegged\n\nA Windows Solitaire Game\n\nCopyright 1989-90\n\nby Mike Blaylock\n\nAlpha v1.011",szAppName, MB_ICONASTERISK | MB_OK); */ break;
case IDM_INDEX: WinHelp(hWnd, HELP_FILE, HELP_INDEX, (ULONG_PTR) NULL); break;
case IDM_HOWTO: WinHelp(hWnd, HELP_FILE, HELP_KEY, (ULONG_PTR) "How To Play"); break;
case IDM_COMMANDS: WinHelp(hWnd, HELP_FILE, HELP_KEY, (ULONG_PTR) "Commands"); break;
case IDM_USING: WinHelp(hWnd, HELP_FILE, HELP_HELPONHELP, (ULONG_PTR) NULL); break;
case IDM_ICONIZE: ShowWindow(hWnd, SW_MINIMIZE); break;
case IDM_EXIT: DestroyWindow(hWnd); break;
default: break;
} break;
case WM_CREATE:
hDC = GetDC (hWnd) ;
xPixel = GetDeviceCaps (hDC, ASPECTX) ; yPixel = GetDeviceCaps (hDC, ASPECTY) ; hWpen = CreatePen(0, 2, RGB(255, 255, 255)); hLtwpen = CreatePen(0, 1, RGB(255, 255, 255));
hMedgrypen = CreatePen(0, 1, RGB (128, 128, 128));
hDkgrypen = CreatePen(0, 1, RGB (64, 64, 64)); hThkdkgrypen = CreatePen(0, 2, RGB (64, 64, 64)); hMedgrybrush = CreateSolidBrush(RGB (128, 128, 128)); hDkgrybrush = CreateSolidBrush(RGB (64, 64, 64));
hBlkpen = GetStockObject(BLACK_PEN); hBbrush = CreateSolidBrush (RGB (0, 0, 255)); hBlkbrush = CreateSolidBrush(RGB (0, 0, 0)); hGbrush = CreateSolidBrush (RGB (0, 64, 0)); hLtgrybrush = CreateSolidBrush (RGB (192, 192, 192)); hLtgrypen = CreatePen(0, 1, RGB (192, 192, 192)); hYbrush = CreateSolidBrush (RGB (255, 255, 0)); nDefault = 3; hMenu = GetMenu(hWnd); wprevmenuitem = GetPrivateProfileInt((LPSTR)"Pegged", (LPSTR)"Option", nDefault, (LPSTR)"entpack.ini"); CheckMenuItem(hMenu, (WORD)wprevmenuitem , MF_CHECKED);
icross = 0; iplus = 0; ifireplace = 0; ipyramid = 0; idiamond = 0; iuparrow = 0; isolitaire = 0;
switch (wprevmenuitem) {
case 3: icross = 1; break;
case 4: iplus = 1; break;
case 5: ifireplace = 1; break;
case 6: iuparrow = 1; break;
case 7: ipyramid = 1; break;
case 8: idiamond = 1; break;
case 9: isolitaire = 1; break;
default: icross = 1; break;
}
PostMessage(hWnd, WM_COMMAND, IDM_NEW, 0L);
ffirst = 1;
ReleaseDC (hWnd, hDC) ; break ;
case WM_SIZE:
foom = 0; hDC = GetDC (hWnd) ;
MGetViewportOrg(hDC, &xLeft, &yTop);
newarea = (LONG)LOWORD(lParam) * (LONG)HIWORD(lParam);
if (ffirst) {
xBlock = LOWORD (lParam) / (DIVISIONS + 2); yBlock = HIWORD (lParam) / (DIVISIONS + 2); xClient = LOWORD (lParam); yClient = HIWORD (lParam); xEdge = xBlock / 4; yEdge = yBlock / 4; xShadow = xBlock / 10; yShadow = yBlock / 10; xHalf = xBlock / 2; yHalf = yBlock / 2; winxEdge = xBlock; winyEdge = yBlock;
if (!(hIntDC = CreateCompatibleDC(hDC))) { MessageBox(hWnd, "Not Enough Memory", szAppName, MB_ICONASTERISK | MB_OK); PostMessage(hWnd, WM_DESTROY, 0, 0L); break;
}
if (!(hBoardBitmap = CreateCompatibleBitmap(hDC, xClient, yClient))) { MessageBox(hWnd, "Not Enough Memory", szAppName, MB_ICONASTERISK | MB_OK); PostMessage(hWnd, WM_DESTROY, 0, 0L); break;
}
if (!(hIntBitmap = CreateCompatibleBitmap(hDC, xBlock *4, yBlock * 4))) { MessageBox(hWnd, "Not Enough Memory", szAppName, MB_ICONASTERISK | MB_OK); PostMessage(hWnd, WM_DESTROY, 0, 0L); break;
}
if (!(hMemwinDC = CreateCompatibleDC(hDC))) { MessageBox(hWnd, "Not Enough Memory", szAppName, MB_ICONASTERISK | MB_OK); PostMessage(hWnd, WM_DESTROY, 0, 0L); break;
}
if (!(hBoardDC = CreateCompatibleDC(hDC))) { MessageBox(hWnd, "Not Enough Memory", szAppName, MB_ICONASTERISK | MB_OK); PostMessage(hWnd, WM_DESTROY, 0, 0L); break;
}
if (!(hWBitmap = CreateCompatibleBitmap(hDC, xClient, yClient))) { MessageBox(hWnd, "Not Enough Memory", szAppName, MB_ICONASTERISK | MB_OK); PostMessage(hWnd, WM_DESTROY, 0, 0L); break;
}
hOldIntBitmap = SelectObject(hIntDC, hIntBitmap); hOldWBitmap = SelectObject(hMemwinDC, hWBitmap); hOldBoardBitmap = SelectObject(hBoardDC, hBoardBitmap);
}
xsizedClient = LOWORD (lParam); ysizedClient = HIWORD (lParam); xsizedBlock = LOWORD (lParam) / (DIVISIONS + 2); ysizedBlock = HIWORD (lParam) / (DIVISIONS + 2);
/*If we are actually sizing and not simply being restored from running OOM on a previous size attempt, see if there is enough memory for all the new bitmaps for the new size by trying to create temporary versions of all the bitmaps and DC's*/
if ((!foomonsize) && (newarea > prevwarea) && (!ffirst)) { if (!(hBoardtmpBitmap = CreateCompatibleBitmap(hDC, xsizedClient, ysizedClient))) { foomonsize = 1;
}
if (!foomonsize) if (!(htmpBoardDC = CreateCompatibleDC(hDC))) { foomonsize = 1; DeleteObject(hBoardtmpBitmap); }
if (!foomonsize) if (!(hWtmpBitmap = CreateCompatibleBitmap(hDC, xsizedClient, ysizedClient))) { foomonsize = 1; SelectObject(htmpBoardDC, hBoardtmpBitmap); DeleteDC(htmpBoardDC); DeleteObject(hBoardtmpBitmap);
}
if (!foomonsize) if (!(htmpMemwinDC = CreateCompatibleDC(hDC))) { foomonsize = 1; SelectObject(htmpBoardDC, hBoardtmpBitmap); DeleteDC(htmpBoardDC); DeleteObject(hBoardtmpBitmap); DeleteObject(hWtmpBitmap); }
if (!foomonsize) if (!(hInttmpBitmap = CreateCompatibleBitmap(hDC, xsizedBlock * 4, ysizedBlock * 4))) { foomonsize = 1; SelectObject(htmpBoardDC, hBoardtmpBitmap); DeleteDC(htmpBoardDC); DeleteObject(hBoardtmpBitmap); SelectObject(htmpMemwinDC, hWtmpBitmap); DeleteDC(htmpMemwinDC); DeleteObject(hWtmpBitmap);
}
if (!foomonsize) if (!(htmpIntDC = CreateCompatibleDC(hDC))) { foomonsize = 1; SelectObject(htmpBoardDC, hBoardtmpBitmap); DeleteDC(htmpBoardDC); DeleteObject(hBoardtmpBitmap); SelectObject(htmpMemwinDC, hWtmpBitmap); DeleteDC(htmpMemwinDC); DeleteObject(hWtmpBitmap); DeleteObject(hInttmpBitmap); }
if (foomonsize) foomed = 1;
/*If there isn't enough memory do a MoveWindow to the old size, and break*/ if (foomonsize) { ReleaseDC(hWnd, hDC); MoveWindow(hWnd, prevxorg, prevyorg, prevwidth, prevheight, TRUE); break; } /*If there IS enough memory, destroy the temp bitmaps and DC's and continue*/ else { SelectObject(htmpBoardDC, hBoardtmpBitmap); DeleteDC(htmpBoardDC); DeleteObject(hBoardtmpBitmap); SelectObject(htmpMemwinDC, hWtmpBitmap); DeleteDC(htmpMemwinDC); DeleteObject(hWtmpBitmap); SelectObject(htmpIntDC, hInttmpBitmap); DeleteDC(htmpIntDC); DeleteObject(hInttmpBitmap); }
}/*End if not previous foomonsize and sizing smaller and not first time*/
if ((!ffirst) && (!foomonsize))/*if this isn't the first start and we're not restoring from previous failed size */ { SelectObject(hBoardDC, hOldBoardBitmap); DeleteDC(hBoardDC); }
if ((!ffirst) && (!foomonsize)) { SelectObject(hIntDC, hOldIntBitmap); DeleteDC(hIntDC); }
if ((!ffirst) && (!foomonsize)) { SelectObject(hMemwinDC, hOldWBitmap); DeleteDC(hMemwinDC); }
if ((!ffirst) && (!foomonsize)) DeleteObject(hWBitmap);
if ((!ffirst) && (!foomonsize)) DeleteObject(hOldWBitmap);
if ((!ffirst) && (!foomonsize)) DeleteObject(hIntBitmap);
if ((!ffirst) && (!foomonsize)) DeleteObject(hOldIntBitmap);
if ((!ffirst) && (!foomonsize)) DeleteObject(hBoardBitmap);
if ((!ffirst) && (!foomonsize)) DeleteObject(hOldBoardBitmap);
if ((!ffirst) && (!foomonsize)) /*this assumes the test for enough memory works and update the size of the client area*/ {
xBlock = LOWORD (lParam) / (DIVISIONS + 2); yBlock = HIWORD (lParam) / (DIVISIONS + 2); xClient = LOWORD (lParam); yClient = HIWORD (lParam); xEdge = xBlock / 4; yEdge = yBlock / 4; xShadow = xBlock / 10; yShadow = yBlock / 10; xHalf = xBlock / 2; yHalf = yBlock / 2; winxEdge = xBlock; winyEdge = yBlock;
}
if ((!ffirst) && (!foomonsize)) if (!(hBoardBitmap = CreateCompatibleBitmap(hDC, xClient, yClient))) { foom = 1; MessageBox(hWnd, "Out of Memory ", szAppName, MB_ICONASTERISK | MB_OK); PostMessage(hWnd, WM_DESTROY, 0, 0L); ReleaseDC(hWnd, hDC); break; }
if ((!ffirst) && (!foomonsize)) if (!(hBoardDC = CreateCompatibleDC(hDC))) { foom = 1; MessageBox(hWnd, "Out of Memory ", szAppName, MB_ICONASTERISK | MB_OK); PostMessage(hWnd, WM_DESTROY, 0, 0L); ReleaseDC(hWnd, hDC); break;
}
if ((!ffirst) && (!foomonsize)) if (!(hMemwinDC = CreateCompatibleDC(hDC))) { foom = 1; MessageBox(hWnd, "Out of Memory ", szAppName, MB_ICONASTERISK | MB_OK); PostMessage(hWnd, WM_DESTROY, 0, 0L); ReleaseDC(hWnd, hDC); break;
}
if ((!ffirst) && (!foomonsize)) if (!(hWBitmap = CreateCompatibleBitmap(hDC, xClient, yClient))) { foom = 1; MessageBox(hWnd, "Out of Memory ", szAppName, MB_ICONASTERISK | MB_OK); PostMessage(hWnd, WM_DESTROY, 0, 0L); ReleaseDC(hWnd, hDC); break;
}
if ((!ffirst) && (!foomonsize)) if (!(hIntDC = CreateCompatibleDC(hDC))) { foom = 1; MessageBox(hWnd, "Out of Memory ", szAppName, MB_ICONASTERISK | MB_OK); PostMessage(hWnd, WM_DESTROY, 0, 0L); ReleaseDC(hWnd, hDC); break;
}
if ((!ffirst) && (!foomonsize)) if (!(hIntBitmap = CreateCompatibleBitmap(hDC, xBlock *4, yBlock * 4))) { foom = 1; MessageBox(hWnd, "Out of Memory ", szAppName, MB_ICONASTERISK | MB_OK); PostMessage(hWnd, WM_DESTROY, 0, 0L); ReleaseDC(hWnd, hDC); break;
}
if ((!ffirst) && (!foomonsize)) hOldBoardBitmap = SelectObject(hBoardDC, hBoardBitmap);
if ((!ffirst) && (!foomonsize)) hOldIntBitmap = SelectObject(hIntDC, hIntBitmap);
if ((!ffirst) && (!foomonsize)) hOldWBitmap = SelectObject(hMemwinDC, hWBitmap);
foomonsize = 0;
ffirst = 0;
/*
** We've successfully created all the bitmaps so this size ** can be done without running out of memory. Therefore, we'll ** record the current size of the window in case it has to be ** restored on a subsequent OOM due to a sizing of the window */
GetWindowRect(hWnd, (LPRECT) & r); prevxorg = r.left; prevyorg = r.top; prevwidth = max(r.right, r.left) - min(r.right, r.left); prevheight = max(r.bottom, r.top) - min(r.bottom, r.top); prevwarea = (LONG)LOWORD(lParam) * (LONG)HIWORD(lParam);
ReleaseDC(hWnd, hDC); break ;
case WM_MOVE: GetWindowRect(hWnd, (LPRECT) & r); prevxorg = r.left; prevyorg = r.top; break;
case WM_MOUSEACTIVATE: fmousefocusd = 1; break;
case WM_ERASEBKGND: if (fmousefocusd) fignorelbutton = 1; break;
case WM_LBUTTONDOWN: /*If we just got the erasebackground message due to activation via a mouse click, ignore all lbuttondowns until the window is painted */ if (fignorelbutton == 1) break; else fmousefocusd = 0;
hDC = GetDC(hWnd);
xPoint = LOWORD(lParam); yPoint = HIWORD(lParam);
if (foom == 1) { MessageBox(hWnd, "Out of Memory", szAppName, MB_ICONASTERISK | MB_OK); } else
{ /*If the mouse is clicked in to the left or above or to the right of or below the game board, we have to ignore*/ if (xPoint > winxEdge && yPoint > winyEdge && xPoint < xBlock * 8 && yPoint < yBlock * 8) { ixdownblock = (xPoint / xBlock) - 1; iydownblock = (yPoint / yBlock) - 1; } else { ReleaseDC(hWnd, hDC); break; } /*check to see if the mouse location is on a chip*/
/* if it is on a chip, allow it to be moved*/ if (bState[ixdownblock][iydownblock]) {
if ((ixdownblock > 1 && ixdownblock < 5) || (iydownblock > 1 && iydownblock < 5)) {
BitBlt(hDC, ixdownblock * xBlock + winxEdge, iydownblock * yBlock + winyEdge, xBlock, yBlock, hBoardDC, ixdownblock * xBlock + winxEdge, iydownblock * yBlock + winyEdge, SRCCOPY); SelectObject(hMemwinDC, hWBitmap); BitBlt(hMemwinDC, ixdownblock * xBlock + winxEdge, iydownblock * yBlock + winyEdge, xBlock, yBlock, hBoardDC, ixdownblock * xBlock + winxEdge, iydownblock * yBlock + winyEdge, SRCCOPY);
fmovingchip = 1;
/*Capture all mouse messages */ SetCapture(hWnd);
/*erase the mouse cursor too */ bShow = 0; ShowCursor(bShow); SelectObject(hIntDC, hIntBitmap); BitBlt(hIntDC, 0, 0, xBlock * 4, yBlock * 4, hMemwinDC, xPoint - 2 * xBlock, yPoint - 2 *yBlock, SRCCOPY);
/* commented out the use of shadow while moving chips
SelectObject(hIntDC,hMedgrypen); SelectObject(hIntDC,hMedgrybrush); Ellipse(hIntDC,xBlock+xBlock/2+xEdge+2*xShadow, yBlock+yBlock/2+yEdge+2*yShadow, 2*xBlock+xBlock/2-xEdge+2*xShadow, 2*yBlock+yBlock/2-yEdge+2*yShadow); */
SelectObject(hIntDC, hBlkpen); SelectObject(hIntDC, hBbrush); Ellipse(hIntDC, xBlock + xBlock / 2 + xEdge, yBlock + yBlock / 2 + yEdge, 2 * xBlock + xBlock / 2 - xEdge, 2 * yBlock + yBlock / 2 -yEdge);
SelectObject(hIntDC, hWpen); Arc(hIntDC, xBlock + xBlock / 2 + xEdge + xShadow, yBlock + yBlock / 2 + yEdge + yShadow, 2 * xBlock + xBlock / 2 - xEdge - xShadow, 2 * yBlock + yBlock / 2 - yEdge - yShadow, xBlock + xBlock / 2 + xHalf, yBlock + yBlock / 2 + yShadow, xBlock + xBlock / 2 + xShadow, yBlock + yBlock / 2 + yHalf);
xPrevpoint = xPoint; yPrevpoint = yPoint; } }
} ReleaseDC(hWnd, hDC);
break;
case WM_MOUSEMOVE: xPoint = LOWORD(lParam); yPoint = HIWORD(lParam); if (fmovingchip) {
if (xPoint > xLeft + xClient || xPoint < xLeft || yPoint > yClient + yTop || yPoint < yTop) { /* Do what we would do if it wasn't a valid destination . This fixes the problem where moving the mouse outside the window causes us to lose the mouse cursor forever*/ bShow = 1; ShowCursor(bShow); fmovingchip = 0; ReleaseCapture(); x = ixdownblock; y = iydownblock; SelectObject(hMemwinDC, hWBitmap);
SelectObject(hMemwinDC, hDkgrypen); SelectObject(hMemwinDC, hDkgrybrush); Ellipse(hMemwinDC, x * xBlock + xEdge + xShadow + winxEdge, y * yBlock + yEdge + yShadow + winyEdge, (x + 1) * xBlock - xEdge + xShadow + winxEdge, (y + 1) * yBlock - yEdge + yShadow + winyEdge);
SelectObject(hMemwinDC, hBlkpen); SelectObject(hMemwinDC, hBbrush); Ellipse(hMemwinDC, x * xBlock + xEdge + winxEdge, y * yBlock + yEdge + winyEdge, (x + 1) * xBlock - xEdge + winxEdge, (y + 1) * yBlock - yEdge + winyEdge);
SelectObject(hMemwinDC, hWpen); Arc(hMemwinDC, x * xBlock + xEdge + xShadow + winxEdge, y * yBlock + yEdge + yShadow + winyEdge, (x + 1) * xBlock - xEdge - xShadow + winxEdge, (y + 1) * yBlock - yEdge - yShadow + winyEdge , x * xBlock + xHalf + winxEdge , y * yBlock + yShadow + winyEdge, x * xBlock + xShadow + winxEdge, y * yBlock + yHalf + winyEdge);
hDC = GetDC(hWnd);
BitBlt(hDC, 0, 0, xClient, yClient, hMemwinDC, 0, 0, SRCCOPY); ReleaseDC(hWnd, hDC);
}
} /*check if a chip is in a move state */ if (fmovingchip) { /* if it is, bitblt as the mouse moves */
hDC = GetDC(hWnd);
/* if we are moving the mouse too fast, we have to erase the old ellipse manually */ if ((xPrevpoint > xPoint + xBlock) || (xPoint > xPrevpoint + xBlock) || (yPrevpoint > yPoint + yBlock) || (yPoint > yBlock + yPrevpoint)) { SelectObject(hIntDC, hIntBitmap); BitBlt(hIntDC, 0, 0, xBlock * 2, yBlock * 2, hMemwinDC, xPrevpoint - xBlock, yPrevpoint - yBlock, SRCCOPY);
BitBlt(hDC, xPrevpoint - xBlock, yPrevpoint - yBlock, xBlock * 2, yBlock * 2, hIntDC, 0, 0, SRCCOPY); }
SelectObject(hIntDC, hIntBitmap); BitBlt(hIntDC, 0, 0, xBlock * 4, yBlock * 4, hMemwinDC, xPoint - 2 * xBlock, yPoint - 2 * yBlock, SRCCOPY);
/* Commented out shadow while moving *****
SelectObject(hIntDC,hmedgrypen); SelectObject(hIntDC,hMedgrybrush); Ellipse(hIntDC,xBlock+xBlock/2+xEdge+2*xShadow, yBlock+yBlock/2+yEdge+2*yShadow, 2*xBlock+xBlock/2-xEdge+2*xShadow, 2*yBlock+yBlock/2-yEdge+2*yShadow);
*/
SelectObject(hIntDC, hBlkpen); SelectObject(hIntDC, hBbrush); Ellipse(hIntDC, xBlock + xBlock / 2 + xEdge, yBlock + yBlock / 2 + yEdge, 2 * xBlock + xBlock / 2 - xEdge, 2 * yBlock + yBlock / 2 - yEdge);
SelectObject(hIntDC, hWpen); Arc(hIntDC, xBlock + xBlock / 2 + xEdge + xShadow, yBlock + yBlock / 2 + yEdge + yShadow, 2 * xBlock + xBlock / 2 - xEdge - xShadow, 2 * yBlock + yBlock / 2 - yEdge - yShadow, xBlock + xBlock / 2 + xHalf, yBlock + yBlock / 2 + yShadow, xBlock + xBlock / 2 + xShadow, yBlock + yBlock / 2 + yHalf);
BitBlt(hDC, xPoint - 2 * xBlock, yPoint - 2 * yBlock, xBlock * 4, yBlock * 4, hIntDC, 0, 0, SRCCOPY);
ReleaseDC(hWnd, hDC); xPrevpoint = xPoint; yPrevpoint = yPoint; }
break ;
case WM_LBUTTONUP: xUp = LOWORD (lParam); yUp = HIWORD (lParam);
/* if we were in a button move state */
if (fmovingchip) {
ixupblock = xUp / xBlock - 1; iyupblock = yUp / yBlock - 1; ReleaseCapture(); checkfvmove();
/*and if it was a valid destination */
if ((!bState[ixupblock][iyupblock]) && (!(ixupblock < 2 && iyupblock < 2)) && (!(ixupblock > 4 && iyupblock > 4)) && (!(ixupblock < 2 && iyupblock > 4)) && (!(ixupblock > 4 && iyupblock < 2)) && fvalidmove && ( xUp > winxEdge) && ( yUp > winyEdge) && ( xUp < xBlock * 8) && ( yUp < yBlock * 8) ) { /*
** adjust the chip in the valid destination rectangle ** on the screen and on the memory device context, erase ** the chip that was jumped- on the screen and in the ** WinMemDC,set fmovingchip to false, and check to see ** if there are any more valid moves. If t here aren't, ** message and show score */
hDC = GetDC(hWnd);
/*erase the chip at its current location*/ BitBlt(hDC, xUp - xBlock / 2 , yUp - yBlock / 2 , xBlock, yBlock, hMemwinDC, xUp - xBlock / 2 , yUp - yBlock / 2 , SRCCOPY);
/*center the chip at the new destination */ x = ixupblock; y = iyupblock;
/* Draw the peg at its new location */ SelectObject(hDC, hDkgrypen); SelectObject(hDC, hDkgrybrush); Ellipse(hDC, x * xBlock + xEdge + xShadow + winxEdge, y * yBlock + yEdge + yShadow + winyEdge, (x + 1) * xBlock - xEdge + xShadow + winxEdge, (y + 1) * yBlock - yEdge + yShadow + winyEdge);
SelectObject(hDC, hBlkpen); SelectObject(hDC, hBbrush); Ellipse(hDC, x * xBlock + xEdge + winxEdge, y * yBlock + yEdge + winyEdge, (x + 1) * xBlock - xEdge + winxEdge, (y + 1) * yBlock - yEdge + winyEdge);
SelectObject(hDC, hWpen); Arc(hDC, x * xBlock + xEdge + xShadow + winxEdge, y * yBlock + yEdge + yShadow + winyEdge, (x + 1) * xBlock - xEdge - xShadow + winxEdge, (y + 1) * yBlock - yEdge - yShadow + winyEdge , x * xBlock + xHalf + winxEdge , y * yBlock + yShadow + winyEdge, x * xBlock + xShadow + winxEdge, y * yBlock + yHalf + winyEdge);
/*erase the jumped chip */ BitBlt(hDC, xBlock * ixkilledblock + winxEdge, yBlock * iykilledblock + winyEdge, xBlock, yBlock, hBoardDC, xBlock * ixkilledblock + winxEdge, yBlock *iykilledblock + winyEdge , SRCCOPY); ReleaseDC(hWnd, hDC);
/*center the chip in the memory dc as well*/ #ifdef OLDWAY
SelectObject(hMemwinDC, hWBitmap); BitBlt(hMemwinDC, xBlock * ixupblock + winxEdge, yBlock * iyupblock + winyEdge, xBlock, yBlock, hDC, xBlock * ixupblock + winxEdge, yBlock * iyupblock + winyEdge , SRCCOPY); #endif
/* Draw the peg at its new location in the memory DC*/ SelectObject(hMemwinDC, hDkgrypen); SelectObject(hMemwinDC, hDkgrybrush); Ellipse(hMemwinDC, x * xBlock + xEdge + xShadow + winxEdge, y * yBlock + yEdge + yShadow + winyEdge, (x + 1) * xBlock - xEdge + xShadow + winxEdge, (y + 1) * yBlock - yEdge + yShadow + winyEdge);
SelectObject(hMemwinDC, hBlkpen); SelectObject(hMemwinDC, hBbrush); Ellipse(hMemwinDC, x * xBlock + xEdge + winxEdge, y * yBlock + yEdge + winyEdge, (x + 1) * xBlock - xEdge + winxEdge, (y + 1) * yBlock - yEdge + winyEdge);
SelectObject(hMemwinDC, hWpen); Arc(hMemwinDC, x * xBlock + xEdge + xShadow + winxEdge, y * yBlock + yEdge + yShadow + winyEdge, (x + 1) * xBlock - xEdge - xShadow + winxEdge, (y + 1) * yBlock - yEdge - yShadow + winyEdge , x * xBlock + xHalf + winxEdge , y * yBlock + yShadow + winyEdge, x * xBlock + xShadow + winxEdge, y * yBlock + yHalf + winyEdge);
/*erase the jumped chip in memory DC*/ BitBlt(hMemwinDC, xBlock * ixkilledblock + winxEdge, yBlock * iykilledblock + winyEdge, xBlock, yBlock, hBoardDC, xBlock * ixkilledblock + winxEdge, yBlock *iykilledblock + winyEdge , SRCCOPY);
/*update the data structure */
bState[ixdownblock][iydownblock] = 0;
bState[ixupblock][iyupblock] = 1;
bState[ixkilledblock][iykilledblock] = 0;
/*record move in array list */ move[m].xsource = ixdownblock; move[m].ysource = iydownblock; move[m].xdest = ixupblock; move[m].ydest = iyupblock; move[m].xjumped = ixkilledblock; move[m].yjumped = iykilledblock; ++m; /*
ixvdownblock=ixdownblock; ixvupblock=ixupblock; ixvkilledblock=ixkilledblock; */
/* Check if there are anymore valid moves*/ bShow = 1; ShowCursor(bShow);
fanymoremoves = 0; checkfanymoves(); if (fanymoremoves == 0) {/* if there aren't - declare game at an end and score */
/*add up the remaining chips*/ ntotal = 0; for (j = 0; j < 7; ++j) for (k = 0; k < 7; ++k) ntotal += bState[j][k];
if (ntotal > 1) MessageBox(hWnd, "Game Over", szAppName, MB_ICONASTERISK | MB_OK); else MessageBox(hWnd, "You Win!", szAppName, MB_ICONASTERISK | MB_OK);
}
} else /*it wasn't a valid destination */ { /*put a chip back in the original location */ hDC = GetDC(hWnd); /*erase the current chip on screen*/ BitBlt(hDC, xUp - xBlock / 2 , yUp - yBlock / 2 , xBlock, yBlock, hMemwinDC, xUp - xBlock / 2 , yUp - yBlock / 2 , SRCCOPY);
/*Draw the chip back at the original location*/ x = ixdownblock; y = iydownblock;
SelectObject(hDC, hDkgrypen); SelectObject(hDC, hDkgrybrush); Ellipse(hDC, x * xBlock + xEdge + xShadow + winxEdge, y * yBlock + yEdge + yShadow + winyEdge, (x + 1) * xBlock - xEdge + xShadow + winxEdge, (y + 1) * yBlock - yEdge + yShadow + winyEdge);
SelectObject(hDC, hBlkpen); SelectObject(hDC, hBbrush); Ellipse(hDC, x * xBlock + xEdge + winxEdge, y * yBlock + yEdge + winyEdge, (x + 1) * xBlock - xEdge + winxEdge, (y + 1) * yBlock - yEdge + winyEdge);
SelectObject(hDC, hWpen); Arc(hDC, x * xBlock + xEdge + xShadow + winxEdge, y * yBlock + yEdge + yShadow + winyEdge, (x + 1) * xBlock - xEdge - xShadow + winxEdge, (y + 1) * yBlock - yEdge - yShadow + winyEdge , x * xBlock + xHalf + winxEdge , y * yBlock + yShadow + winyEdge, x * xBlock + xShadow + winxEdge, y * yBlock + yHalf + winyEdge);
SelectObject(hMemwinDC, hWBitmap); BitBlt(hMemwinDC, ixdownblock * xBlock + winxEdge, iydownblock * yBlock + winyEdge, xBlock, yBlock, hDC, ixdownblock * xBlock + winxEdge, iydownblock *yBlock + winyEdge , SRCCOPY);
bShow = 1; ShowCursor(bShow);
ReleaseDC(hWnd, hDC); }
fmovingchip = 0;
fvalidmove = 0;
}
/*
** if we aren't at a valid destination, take the chip back to ** the original rectangle in the window DC, restore the original ** whole-window-Mem-DC as well,and restore the destination area, ** and show an error message, and set fmovingchip to false */
break;
case WM_PAINT:
hDC = BeginPaint (hWnd, &ps);
/*Draw the board with holes in it in memory*/
SelectObject(hDC, hLtgrypen); SelectObject(hDC, hLtgrybrush); Rectangle(hDC, 0, 0, xClient, yClient);
SelectObject(hMemwinDC, hWBitmap);
SelectObject(hMemwinDC, hBlkpen); SelectObject(hMemwinDC, hLtgrybrush); Rectangle(hMemwinDC, 0, 0, xClient, yClient);
/*Draw shadows on playing board on right and bottom edges*/ SelectObject(hMemwinDC, hThkdkgrypen); (VOID)MMoveTo(hMemwinDC, winxEdge + 1, yBlock * 5 + winyEdge + 1); LineTo(hMemwinDC, xBlock * 2 + winxEdge - 1, yBlock * 5 + winyEdge + 1);
(VOID)MMoveTo(hMemwinDC, xBlock * 2 + winxEdge, yBlock *7 + winyEdge + 1); LineTo(hMemwinDC, xBlock * 5 + winxEdge, yBlock * 7 + winyEdge + 1);
(VOID)MMoveTo(hMemwinDC, xBlock * 5 + winxEdge + 1, yBlock *7 + winyEdge + 1); LineTo(hMemwinDC, xBlock * 5 + winxEdge + 1, yBlock * 5 + winyEdge + 1);
(VOID)MMoveTo(hMemwinDC, xBlock * 5 + winxEdge + 1, yBlock *5 + winyEdge + 1); LineTo(hMemwinDC, xBlock * 7 + winxEdge + 1, yBlock * 5 + winyEdge + 1);
(VOID)MMoveTo(hMemwinDC, xBlock * 5 + winxEdge + 1, yBlock *2 + winyEdge - 1); LineTo(hMemwinDC, xBlock * 5 + winxEdge + 1, winyEdge);
(VOID)MMoveTo(hMemwinDC, xBlock * 7 + winxEdge + 1, yBlock *2 + winyEdge + 1); LineTo(hMemwinDC, xBlock * 7 + winxEdge + 1, yBlock * 5 + winyEdge + 1);
SelectObject(hMemwinDC, hWpen);
(VOID)MMoveTo(hMemwinDC, winxEdge - 1, yBlock * 2 + winyEdge); LineTo(hMemwinDC, winxEdge - 1, yBlock * 5 + winyEdge - 1);
(VOID)MMoveTo(hMemwinDC, winxEdge, yBlock * 2 - 1 + winyEdge); LineTo(hMemwinDC, xBlock * 2 - 1 + winxEdge, yBlock * 2 -1 + winyEdge);
(VOID)MMoveTo(hMemwinDC, xBlock * 2 - 1 + winxEdge, yBlock *2 + winyEdge - 1); LineTo(hMemwinDC, xBlock * 2 - 1 + winxEdge, yBlock * 0 + winyEdge);
(VOID)MMoveTo(hMemwinDC, xBlock * 2 + winxEdge, winyEdge - 1); LineTo(hMemwinDC, xBlock * 5 - 1 + winxEdge, winyEdge - 1);
(VOID)MMoveTo(hMemwinDC, xBlock * 5 + 2 + winxEdge, yBlock *2 - 1 + winyEdge); LineTo(hMemwinDC, xBlock * 7 + winxEdge, yBlock * 2 - 1 + winyEdge);
(VOID)MMoveTo(hMemwinDC, xBlock * 2 - 1 + winxEdge, yBlock *5 + 1 + winyEdge); LineTo(hMemwinDC, xBlock * 2 - 1 + winxEdge, yBlock * 7 - 1 + winyEdge);
/* Draw the holes*/
SelectObject(hMemwinDC, hBlkpen); for (x = 0; x < DIVISIONS; x++) for (y = 0; y < DIVISIONS; y++) { if ((x > 1 && x < 5) || (y > 1 && y < 5)) {
Arc(hMemwinDC, x * xBlock + xEdge + winxEdge, y * yBlock + yEdge + winyEdge, (x + 1) * xBlock -xEdge + winxEdge, (y + 1) * yBlock - yEdge + winyEdge, (x + 1) * xBlock - 3 * xEdge / 2 + winxEdge, y * yBlock + 3 * yEdge / 2 + winyEdge, x * xBlock + 3 * xEdge / 2 + winxEdge, (y + 1) * yBlock - 3 * yEdge / 2 + winyEdge);
} }
SelectObject(hMemwinDC, hLtwpen);
for (x = 0; x < DIVISIONS; x++) for (y = 0; y < DIVISIONS; y++) { if ((x > 1 && x < 5) || (y > 1 && y < 5)) { Arc(hMemwinDC, x * xBlock + xEdge + winxEdge, y * yBlock + yEdge + winyEdge, (x + 1) * xBlock -xEdge + winxEdge, (y + 1) * yBlock - yEdge + winyEdge, x * xBlock + 3 * xEdge / 2 + winxEdge, (y + 1) * yBlock - 3 * yEdge / 2 + winyEdge, (x + 1) * xBlock - 3 * xEdge / 2 + winxEdge, y * yBlock + 3 * yEdge / 2 + winyEdge);
} }
BitBlt(hDC, 0, 0, xClient, yClient, hMemwinDC , 0, 0, SRCCOPY);
/*Get a picture of an empty board*/ SelectObject(hBoardDC, hBoardBitmap); BitBlt(hBoardDC, 0, 0, xClient, yClient, hMemwinDC , 0, 0, SRCCOPY);
for (x = 0; x < DIVISIONS; x++) for (y = 0; y < DIVISIONS; y++) { if (bState[x][y]) {
SelectObject(hDC, hDkgrypen); SelectObject(hDC, hDkgrybrush); Ellipse(hDC, x * xBlock + xEdge + xShadow + winxEdge, y * yBlock + yEdge + yShadow + winyEdge, (x + 1) * xBlock - xEdge + xShadow + winxEdge, (y + 1) * yBlock - yEdge + yShadow + winyEdge);
SelectObject(hDC, hBlkpen); SelectObject(hDC, hBbrush); Ellipse(hDC, x * xBlock + xEdge + winxEdge, y * yBlock + yEdge + winyEdge, (x + 1) * xBlock - xEdge + winxEdge, (y + 1) * yBlock - yEdge + winyEdge);
SelectObject(hDC, hWpen); Arc(hDC, x * xBlock + xEdge + xShadow + winxEdge, y * yBlock + yEdge + yShadow + winyEdge, (x + 1) * xBlock - xEdge - xShadow + winxEdge, (y + 1) * yBlock - yEdge - yShadow + winyEdge , x * xBlock + xHalf + winxEdge , y * yBlock + yShadow + winyEdge, x * xBlock + xShadow + winxEdge, y * yBlock + yHalf + winyEdge);
} }
BitBlt(hMemwinDC, 0, 0, xClient, yClient, hDC, 0, 0, SRCCOPY);
EndPaint(hWnd, &ps); fignorelbutton = 0; fmousefocusd = 0;
if (foomed) { MessageBox(hWnd, "Not Enough Memory to Re-size Window", szAppName, MB_ICONASTERISK | MB_OK); foomed = 0; }
break;
case WM_DESTROY: if (hBitmap) DeleteObject (hBitmap) ; KillTimer (hWnd, 1) ;
SelectObject(hIntDC, hOldIntBitmap); DeleteDC(hIntDC);
SelectObject(hMemwinDC, hOldWBitmap); DeleteDC(hMemwinDC);
SelectObject(hBoardDC, hOldBoardBitmap); DeleteDC(hBoardDC);
DeleteObject(hBoardBitmap); DeleteObject(hOldBoardBitmap);
DeleteObject(hWBitmap); DeleteObject(hOldWBitmap);
DeleteObject(hIntBitmap); DeleteObject(hOldIntBitmap);
DeleteObject(hBbrush); DeleteObject(hBlkpen); DeleteObject(hBlkbrush); DeleteObject(hDkgrybrush); DeleteObject(hDkgrypen); DeleteObject(hGbrush); DeleteObject(hMedgrypen); DeleteObject(hMedgrybrush); DeleteObject(hLtgrybrush); DeleteObject(hLtgrypen); DeleteObject(hLtwpen);
DeleteObject(hThkdkgrypen); DeleteObject(hWpen); DeleteObject(hYbrush);
WinHelp(hWnd, HELP_FILE, HELP_QUIT, (ULONG_PTR) NULL);
switch (wprevmenuitem) { case 3: WritePrivateProfileString((LPSTR)"Pegged", (LPSTR) "Option", (LPSTR)"3", (LPSTR)"entpack.ini" ); break;
case 4: WritePrivateProfileString( (LPSTR)"Pegged", (LPSTR)"Option", (LPSTR) "4", (LPSTR)"entpack.ini" ); break;
case 5: WritePrivateProfileString((LPSTR)"Pegged", (LPSTR)"Option", (LPSTR)"5", (LPSTR)"entpack.ini" ); break;
case 6: WritePrivateProfileString((LPSTR)"Pegged", (LPSTR)"Option", (LPSTR)"6", (LPSTR)"entpack.ini" ); break;
case 7: WritePrivateProfileString((LPSTR)"Pegged", (LPSTR)"Option", (LPSTR)"7", (LPSTR)"entpack.ini"); break;
case 8: WritePrivateProfileString((LPSTR)"Pegged", (LPSTR)"Option", (LPSTR)"8", (LPSTR)"entpack.ini"); break;
case 9: WritePrivateProfileString((LPSTR)"Pegged", (LPSTR)"Option", (LPSTR)"9", (LPSTR)"entpack.ini"); break;
default: WritePrivateProfileString((LPSTR)"Pegged", (LPSTR)"Option", (LPSTR)"3", (LPSTR)"entpack.ini" ); break; } PostQuitMessage (0) ; break ;
default: return DefWindowProc (hWnd, iMessage, wParam, lParam) ; } return 0L ; }
VOID checkfvmove()
{ if (ixupblock == ixdownblock) if ((iyupblock == iydownblock - 2) || (iyupblock == iydownblock + 2)) { ixjumpedblock = ixupblock; if (iyupblock == iydownblock - 2) iyjumpedblock = iydownblock - 1; if (iyupblock == iydownblock + 2) iyjumpedblock = iydownblock + 1;
if (bState[ixjumpedblock][iyjumpedblock]) { fvalidmove = 1; ixkilledblock = ixupblock; if (iyupblock == iydownblock - 2) iykilledblock = iydownblock - 1; if (iyupblock == iydownblock + 2) iykilledblock = iydownblock + 1; } } if (iyupblock == iydownblock) if ((ixupblock == ixdownblock - 2) || (ixupblock == ixdownblock + 2)) { iyjumpedblock = iyupblock; if (ixupblock == ixdownblock - 2) ixjumpedblock = ixdownblock - 1; if (ixupblock == ixdownblock + 2) ixjumpedblock = ixdownblock + 1;
if (bState[ixjumpedblock][iyjumpedblock]) { fvalidmove = 1; iykilledblock = iyupblock; if (ixupblock == ixdownblock - 2) ixkilledblock = ixdownblock - 1; if (ixupblock == ixdownblock + 2) ixkilledblock = ixdownblock + 1; } } return;
}
VOID checkfanymoves() { /*corners*/ if (bState[2][0]) { if (bState[3][0]) if (!bState[4][0]) fanymoremoves = 1; if (bState[2][1]) if (!bState[2][2]) fanymoremoves = 1; }
if (bState[4][0]) { if (bState[3][0]) if (!bState[2][0]) fanymoremoves = 1; if (bState[4][1]) if (!bState[4][2]) fanymoremoves = 1; }
if (bState[0][2]) { if (bState[1][2]) if (!bState[2][2]) fanymoremoves = 1; if (bState[0][3]) if (!bState[0][4]) fanymoremoves = 1; }
if (bState[0][4]) { if (bState[0][3]) if (!bState[0][2]) fanymoremoves = 1; if (bState[1][4]) if (!bState[2][4]) fanymoremoves = 1; }
if (bState[2][6]) { if (bState[3][6]) if (!bState[4][6]) fanymoremoves = 1; if (bState[2][5]) if (!bState[2][4]) fanymoremoves = 1; }
if (bState[4][6]) { if (bState[3][6]) if (!bState[2][6]) fanymoremoves = 1; if (bState[4][5]) if (!bState[4][4]) fanymoremoves = 1; }
if (bState[6][4]) { if (bState[5][4]) if (!bState[4][4]) fanymoremoves = 1; if (bState[6][3]) if (!bState[6][2]) fanymoremoves = 1; }
if (bState[6][2]) { if (bState[5][2]) if (!bState[4][2]) fanymoremoves = 1; if (bState[6][3]) if (!bState[6][4]) fanymoremoves = 1; }
/* center ends */
if (bState[3][0]) { if (bState[3][1]) if (!bState[3][2]) fanymoremoves = 1; }
if (bState[0][3]) { if (bState[1][3]) if (!bState[2][3]) fanymoremoves = 1; }
if (bState[3][6]) { if (bState[3][5]) if (!bState[3][4]) fanymoremoves = 1; }
if (bState[6][3]) { if (bState[5][3]) if (!bState[4][3]) fanymoremoves = 1; }
/*center sides */ if (bState[2][1]) { if (bState[3][1]) if (!bState[4][1]) fanymoremoves = 1; if (bState[2][2]) if (!bState[2][3]) fanymoremoves = 1; }
if (bState[1][2]) { if (bState[2][2]) if (!bState[3][2]) fanymoremoves = 1; if (bState[1][3]) if (!bState[1][4]) fanymoremoves = 1; } if (bState[1][4]) { if (bState[2][4]) if (!bState[3][4]) fanymoremoves = 1; if (bState[1][3]) if (!bState[1][2]) fanymoremoves = 1; } if (bState[2][5]) { if (bState[3][5]) if (!bState[4][5]) fanymoremoves = 1; if (bState[2][4]) if (!bState[2][3]) fanymoremoves = 1; } if (bState[4][5]) { if (bState[3][5]) if (!bState[2][5]) fanymoremoves = 1; if (bState[4][4]) if (!bState[4][3]) fanymoremoves = 1; } if (bState[5][4]) { if (bState[4][4]) if (!bState[3][4]) fanymoremoves = 1; if (bState[5][3]) if (!bState[5][2]) fanymoremoves = 1; } if (bState[5][2]) { if (bState[4][2]) if (!bState[3][2]) fanymoremoves = 1; if (bState[5][3]) if (!bState[5][4]) fanymoremoves = 1; } if (bState[4][1]) { if (bState[3][1]) if (!bState[2][1]) fanymoremoves = 1; if (bState[4][2]) if (!bState[4][3]) fanymoremoves = 1; }
/* inside center arms */
if (bState[3][1]) { if (bState[3][2]) if (!bState[3][3]) fanymoremoves = 1; }
if (bState[1][3]) { if (bState[2][3]) if (!bState[3][3]) fanymoremoves = 1; }
if (bState[3][5]) { if (bState[3][4]) if (!bState[3][3]) fanymoremoves = 1; }
if (bState[5][3]) { if (bState[4][3]) if (!bState[3][3]) fanymoremoves = 1; }
/*Center 9 squares */ if (bState[2][2]) { if (bState[1][2]) if (!bState[0][2]) fanymoremoves = 1; if (bState[3][2]) if (!bState[4][2]) fanymoremoves = 1; if (bState[2][1]) if (!bState[2][0]) fanymoremoves = 1; if (bState[2][3]) if (!bState[2][4]) fanymoremoves = 1; } if (bState[3][2]) { if (bState[2][2]) if (!bState[2][1]) fanymoremoves = 1; if (bState[4][2]) if (!bState[5][2]) fanymoremoves = 1; if (bState[3][1]) if (!bState[3][0]) fanymoremoves = 1; if (bState[3][3]) if (!bState[3][4]) fanymoremoves = 1; } if (bState[4][2]) { if (bState[3][2]) if (!bState[2][2]) fanymoremoves = 1; if (bState[5][2]) if (!bState[6][2]) fanymoremoves = 1; if (bState[4][1]) if (!bState[4][0]) fanymoremoves = 1; if (bState[4][3]) if (!bState[4][4]) fanymoremoves = 1; } if (bState[2][3]) { if (bState[1][3]) if (!bState[0][3]) fanymoremoves = 1; if (bState[3][3]) if (!bState[4][3]) fanymoremoves = 1; if (bState[2][2]) if (!bState[2][1]) fanymoremoves = 1; if (bState[2][4]) if (!bState[2][5]) fanymoremoves = 1; } if (bState[2][4]) { if (bState[1][4]) if (!bState[0][4]) fanymoremoves = 1; if (bState[3][4]) if (!bState[4][4]) fanymoremoves = 1; if (bState[2][3]) if (!bState[2][2]) fanymoremoves = 1; if (bState[2][5]) if (!bState[2][6]) fanymoremoves = 1; } if (bState[3][4]) { if (bState[2][4]) if (!bState[1][4]) fanymoremoves = 1; if (bState[4][4]) if (!bState[5][4]) fanymoremoves = 1; if (bState[3][3]) if (!bState[3][2]) fanymoremoves = 1; if (bState[3][5]) if (!bState[3][6]) fanymoremoves = 1; } if (bState[4][4]) { if (bState[3][4]) if (!bState[2][4]) fanymoremoves = 1; if (bState[5][4]) if (!bState[6][4]) fanymoremoves = 1; if (bState[4][3]) if (!bState[4][2]) fanymoremoves = 1; if (bState[4][5]) if (!bState[4][6]) fanymoremoves = 1; } if (bState[4][3]) { if (bState[3][3]) if (!bState[2][3]) fanymoremoves = 1; if (bState[5][3]) if (!bState[6][3]) fanymoremoves = 1; if (bState[4][2]) if (!bState[4][1]) fanymoremoves = 1; if (bState[4][4]) if (!bState[4][5]) fanymoremoves = 1; } if (bState[3][3]) { if (bState[2][3]) if (!bState[1][3]) fanymoremoves = 1; if (bState[4][3]) if (!bState[5][3]) fanymoremoves = 1; if (bState[3][2]) if (!bState[3][1]) fanymoremoves = 1; if (bState[3][4]) if (!bState[3][5]) fanymoremoves = 1; }
}
|