📄 mine.c
字号:
#include <stdio.h>#include <stdlib.h>#include <time.h>#include <string.h>/* * Minesweeper for Microwindows, adapted from MiniGUI */extern int mwCurrentButtons; /* FIXME */#ifdef __rtems__#define srandom srand#define random rand#endif#define MWINCLUDECOLORS#include "windows.h"#include "wintools.h"typedef struct { int flag; int value; BOOL test; BOOL hit; BOOL bombout; BOOL error;}BOM;typedef struct { int x; int y; BOOL NY;}NO;typedef struct { int highscore; char name[20];}SCORE;typedef struct { DWORD dwStyle; LPSTR spCaption; HMENU hMenu; HCURSOR hCursor; HICON hIcon; WNDPROC MainWindowProc; int lx, ty, rx, by; COLORREF iBkColor; DWORD dwAddData; HWND hHosting;} MAINWINCREATE, *PMAINWINCREATE;#define IDOK 0#define GetCharWidth() 11#define GetCharHeight() 13extern MWIMAGEHDR image_mineflag;extern MWIMAGEHDR image_mineface;extern MWIMAGEHDR image_minefacelost;extern MWIMAGEHDR image_minebomb;extern MWIMAGEHDR image_minedone;extern MWIMAGEHDR image_minehitfalse;HWND CreateMainWindow(PMAINWINCREATE pCreateInfo);BOOL PtInRect2(const RECT *lprc, int x, int y);void Draw3DUpFrame(HDC hDC, int l, int t, int r, int b, int fillc);void SearchGround(HDC hdc,int x,int y);int Open(HWND hWnd,int x,int y);LRESULT TestMyWinProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam);void InitMyWinCreateInfo(PMAINWINCREATE pCreateInfo);void InitAbHostedCreateInfo(HWND hHosting, PMAINWINCREATE pCreateInfo); void InitHighScoreCreateInfo (HWND hHosting, PMAINWINCREATE pCreateInfo);void InitCongratulationCreateInfo (HWND hHosting, PMAINWINCREATE pCreateInfo);void* TestMyWindow(void* data);void BombGame(HWND hWnd, int x, int y);void Finished(HWND hWnd);void Cancel3DFrame(HDC hdc, int l,int t,int r,int b);void TextValue(HDC hdc, int x,int y,int value);void BombOut(HWND hWnd);void BothButtonDownProc(HWND hWnd, int x, int y);void DrawDigit(HDC hdc, char* buffer, int CLOCK);#define ID_ABOUT 300#define ID_NEW 301 #define ID_LARGE 302#define ID_MIDDLE 303#define ID_SMALL 304#define ID_CLOSE 305#define ID_HIGHSCORE 306#define ID_CLOCK 400#define WIDTH_LARGEWIN 544#define HEIGHT_LARGEWIN 371#define WIDTH_MIDDLEWIN 287#define HEIGHT_MIDDLEWIN 332#define WIDTH_SMALLWIN 178#define HEIGHT_SMALLWIN 206#define WIDTH_FACE 30#define HEIGHT_FACE 30#define WIDTH_DIGIT 11#define WIDTH_BOMNUM (2*WIDTH_DIGIT)#define HEIGHT_BOMNUM 30#define WIDTH_CLOCK (3*WIDTH_DIGIT)#define HEIGHT_CLOCK 30#define FREQ_CLOCK 1000#define WIDTH_BOX 18#define HEIGHT_BOX 18#if 0static int winwidth = WIDTH_LARGEWIN; /* change this for startup mine size */static int winheight = HEIGHT_LARGEWIN;static int sg_boxnumx = 30;static int sg_boxnumy = 18;static int bombnum = 99;#endif#if 1static int winwidth = WIDTH_MIDDLEWIN; /* change this for startup mine size */static int winheight = HEIGHT_MIDDLEWIN;static int sg_boxnumx = 16;static int sg_boxnumy = 16;static int bombnum = 40;#endif#if 0static int winwidth = WIDTH_SMALLWIN; /* change this for startup mine size */static int winheight = HEIGHT_SMALLWIN;static int sg_boxnumx = 8;static int sg_boxnumy = 8;static int bombnum = 10;#endifstatic BOM bom[30][18];static NO NoAdr[540];static SCORE score[3];static int itime, leftbombnum;static int oldx, oldy, adrx, adry;static int flag_bombout, flag_finished, flag_size = 2;static int second = 0 ;static BOOL bTimer;static HWND hHighscore,hCongratulate; static int offsetx;static int x_face, x_bomnum, x_clock;void Cancel3DFrame(HDC hdc, int l, int t, int w, int h){ HBRUSH hbr; RECT rc; SetTextColor (hdc,GRAY); Rectangle(hdc, l, t, l + w, t + h); hbr = CreateSolidBrush(LTGRAY); SetRect(&rc, l+1, t+1, l+w, t+h); FillRect(hdc, &rc, hbr); DeleteObject(hbr);} void TextValue(HDC hdc, int x, int y, int value) { int color = 0; char va[20]; switch(value) { case 1: color=BLUE; break; case 2: color=GREEN; break; case 3: color=RED; break; case 4: color=MAGENTA; break; case 5: color=YELLOW; break; case 6: color=CYAN; break; case 7: color=RED; break; case 8: color=GREEN; break; } SetBkColor(hdc,LTGRAY); SetTextColor(hdc,color); sprintf(va,"%d",value); TextOut(hdc, x + ((WIDTH_BOX - GetCharWidth ()) >> 1), y + ((HEIGHT_BOX - GetCharHeight ()) >> 1), va, -1);} void SearchGround(HDC hdc,int x,int y){ int x1=0,y1=0; int i=1; bom[x][y].test=TRUE; NoAdr[itime].x=x; NoAdr[itime].y=y; NoAdr[itime].NY=FALSE; itime++; Cancel3DFrame(hdc,x*WIDTH_BOX+offsetx, y*HEIGHT_BOX+HEIGHT_FACE, WIDTH_BOX, HEIGHT_BOX); while( i <= 8 ) { switch(i) { case 1: x1=x-1; y1=y; break; case 2: x1=x-1; y1=y-1; break; case 3: x1=x-1; y1=y+1; break; case 4: x1=x+1; y1=y; break; case 5: x1=x+1; y1=y-1; break; case 6: x1=x+1; y1=y+1; break; case 7: y1=y-1; x1=x; break; case 8: y1=y+1; x1=x; break; } if( x1>=0 && y1>=0 && x1<sg_boxnumx && y1<sg_boxnumy &&!bom[x1][y1].hit&& !bom[x1][y1].test && !bom[x1][y1].value ) SearchGround(hdc,x1,y1); if( x1>=0 && y1>=0 && x1<sg_boxnumx && y1<sg_boxnumy &&!bom[x1][y1].hit &&!bom[x1][y1].test && bom[x1][y1].value!=0 ) { bom[x1][y1].test=TRUE; NoAdr[itime].x=x1; NoAdr[itime].y=y1; NoAdr[itime].NY=TRUE; itime++; Cancel3DFrame(hdc, x1*WIDTH_BOX+offsetx, y1*HEIGHT_BOX+HEIGHT_FACE, WIDTH_BOX, HEIGHT_BOX); TextValue(hdc, x1*WIDTH_BOX+offsetx, y1*HEIGHT_BOX+HEIGHT_FACE, bom[x1][y1].value); } i++; } } BOOL Open(HWND hWnd,int x,int y){ int x1=0,y1=0; int i=1; HDC hdc; hdc = GetDC(hWnd); while( i <= 8 ) { switch( i ) { case 1: x1=x-1; y1=y; break; case 2: x1=x-1; y1=y-1; break; case 3: x1=x-1; y1=y+1; break; case 4: x1=x+1; y1=y; break; case 5: x1=x+1; y1=y-1; break; case 6: x1=x+1; y1=y+1; break; case 7: y1=y-1; x1=x; break; case 8: y1=y+1; x1=x; break; } if( x1>=0 && y1>=0 && x1<sg_boxnumx && y1<sg_boxnumy && !bom[x1][y1].hit && bom[x1][y1].flag) { ReleaseDC(hWnd, hdc); return FALSE; } if( x1>=0 && y1>=0 && x1<sg_boxnumx && y1<sg_boxnumy && !bom[x1][y1].test && !bom[x1][y1].value && !bom[x1][y1].flag ){ SearchGround(hdc,x1,y1); } if( x1>=0 && y1>=0 && x1<sg_boxnumx && y1<sg_boxnumy && !bom[x1][y1].test && bom[x1][y1].value!=0 ) { bom[x1][y1].test=TRUE; NoAdr[itime].x=x1; NoAdr[itime].y=y1; NoAdr[itime].NY=TRUE; itime++; Cancel3DFrame(hdc, x1*WIDTH_BOX+offsetx, y1*HEIGHT_BOX+HEIGHT_FACE, WIDTH_BOX, HEIGHT_BOX); TextValue(hdc, x1*WIDTH_BOX+offsetx, y1*HEIGHT_BOX+HEIGHT_FACE, bom[x1][y1].value); } i++; } ReleaseDC(hWnd, hdc); return TRUE; }void BombOut(HWND hWnd){ int i,j; HDC hdc; hdc=GetDC(hWnd); for (i = 0; i < sg_boxnumx; i++) { for (j = 0; j < sg_boxnumy; j++) { if (bom[i][j].flag && !bom[i][j].hit) { Cancel3DFrame(hdc,i*WIDTH_BOX+offsetx,j*HEIGHT_BOX+HEIGHT_FACE, WIDTH_BOX,HEIGHT_BOX); DrawDIB(hdc, i*WIDTH_BOX+offsetx+1, j*HEIGHT_BOX+1+HEIGHT_FACE, &image_minebomb); bom[i][j].bombout = TRUE; } if (!bom[i][j].flag && bom[i][j].hit){ Cancel3DFrame(hdc,i*WIDTH_BOX+offsetx,j*HEIGHT_BOX+HEIGHT_FACE, WIDTH_BOX,HEIGHT_BOX); DrawDIB(hdc, i*WIDTH_BOX+offsetx+1, j*HEIGHT_BOX+1+HEIGHT_FACE, &image_minehitfalse); bom[i][j].error = TRUE; } } } DrawDIB(hdc, x_face, 0, &image_minefacelost); flag_bombout = 1; bTimer = FALSE; ReleaseDC(hWnd, hdc);}void Finished(HWND hWnd){ int i,j; HDC hdc; RECT bombnumber; MAINWINCREATE CreateInfo; hdc = GetDC(hWnd); for (i = 0; i < sg_boxnumx; i++) { for (j = 0; j < sg_boxnumy; j++) { if (bom[i][j].flag && !bom[i][j].hit) { DrawDIB(hdc, i*WIDTH_BOX+offsetx+3, j*HEIGHT_BOX+3+HEIGHT_FACE, &image_mineflag); bom[i][j].hit = TRUE; } } } DrawDIB(hdc, x_face+1, 1, &image_minedone); flag_finished = 1; bTimer = FALSE; ReleaseDC(hWnd, hdc); leftbombnum = 0; SetRect (&bombnumber, x_bomnum, 0, x_bomnum + WIDTH_BOMNUM, HEIGHT_BOMNUM); InvalidateRect (hWnd, &bombnumber, FALSE); if (second < score[flag_size].highscore){ InitCongratulationCreateInfo(hWnd, &CreateInfo); hCongratulate = CreateMainWindow (&CreateInfo); } } #if 0HMENU createpmenuabout(){ HMENU hmnu; MENUITEMINFO mii; memset (&mii, 0, sizeof(MENUITEMINFO)); mii.type = MFT_STRING; mii.id = 0; mii.typedata = (DWORD)"About"; hmnu = CreatePopupMenu (&mii); memset (&mii, 0, sizeof(MENUITEMINFO)); mii.type = MFT_STRING ; mii.state = 0; mii.id = ID_ABOUT; mii.typedata = (DWORD)"About Bomb Game"; InsertMenuItem(hmnu, 3, TRUE, &mii); return hmnu;}HMENU createpmenustart(){ HMENU hmnu; MENUITEMINFO mii; memset (&mii, 0, sizeof(MENUITEMINFO)); mii.type = MFT_STRING; mii.id = 0; mii.typedata = (DWORD)"Start"; hmnu = CreatePopupMenu (&mii); memset (&mii, 0, sizeof(MENUITEMINFO)); mii.type = MFT_STRING ; mii.state = 0; mii.id = ID_NEW; mii.typedata = (DWORD)"New Game"; InsertMenuItem(hmnu, 0, TRUE, &mii); mii.type = MFT_STRING ; mii.state = 0; mii.id = ID_HIGHSCORE; mii.typedata = (DWORD)"High Score"; InsertMenuItem(hmnu, 1, TRUE, &mii); mii.type = MFT_STRING ; mii.state = 0; mii.id = ID_CLOSE; mii.typedata = (DWORD)"Quit Game"; InsertMenuItem(hmnu, 2, TRUE, &mii); return hmnu;}HMENU createpmenulevel(){ HMENU hmnu; MENUITEMINFO mii; memset (&mii, 0, sizeof(MENUITEMINFO)); mii.type = MFT_STRING; mii.id = 0; mii.typedata = (DWORD)"Level"; hmnu = CreatePopupMenu (&mii); mii.type = MFT_STRING ; mii.state = 0; mii.id = ID_LARGE; mii.typedata = (DWORD)"Large"; InsertMenuItem(hmnu, 0, TRUE, &mii); mii.type = MFT_STRING ; mii.state = 0; mii.id = ID_MIDDLE; mii.typedata = (DWORD)"Middle"; InsertMenuItem(hmnu, 1, TRUE, &mii); mii.type = MFT_STRING ; mii.state = 0; mii.id = ID_SMALL; mii.typedata = (DWORD)"Small"; InsertMenuItem(hmnu, 2, TRUE, &mii); return hmnu;}HMENU createmenu1(){ HMENU hmnu; MENUITEMINFO mii; hmnu = CreateMenu(); memset (&mii, 0, sizeof(MENUITEMINFO)); mii.type = MFT_STRING; mii.id = 100; mii.typedata = (DWORD)"Start";
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -