📄 bomb.c
字号:
/*** $Id: bomb.c,v 1.20 2005/09/01 06:32:21 weiym Exp $**** bomb.c: The MineSweeper game.**** Copyright (C) 1999~ 2002 Zheng Xiang and others.** Copyright (C) 2003 Feynman Software.*//*** This source is free software; you can redistribute it and/or** modify it under the terms of the GNU General Public** License as published by the Free Software Foundation; either** version 2 of the License, or (at your option) any later version.**** This software is distributed in the hope that it will be useful,** but WITHOUT ANY WARRANTY; without even the implied warranty of** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU** General Public License for more details.**** You should have received a copy of the GNU General Public** License along with this library; if not, write to the Free** Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,** MA 02111-1307, USA*/#include <stdio.h>#include <stdlib.h>#include <string.h>#include <time.h>#include <unistd.h>#include <pwd.h>#include <minigui/common.h>#include <minigui/minigui.h>#include <minigui/gdi.h>#include <minigui/window.h>#include <minigui/control.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;static BOM bom[30][16];static NO NoAdr[540];static SCORE score[3];static int itime, leftbombnum;static int bombnum = 99;void SearchGround(HWND hWnd,int x,int y);int Open(HWND hWnd,int x,int y);int TestMyWinProc(HWND hWnd,int 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 470#define WIDTH_MIDDLEWIN 292#define HEIGHT_MIDDLEWIN 430#define WIDTH_SMALLWIN 178#define HEIGHT_SMALLWIN 270#define WIDTH_FACE 30#define HEIGHT_FACE 30#define WIDTH_DIGIT 14#define WIDTH_BOMNUM (2*WIDTH_DIGIT)#define HEIGHT_BOMNUM 30#define WIDTH_CLOCK (3*WIDTH_DIGIT)#define HEIGHT_CLOCK 30#define FREQ_CLOCK 10#define WIDTH_BOX 18#define HEIGHT_BOX 18static int sg_boxnumx = 30;static int sg_boxnumy = 16;static BITMAP sg_bmpDigit[10];static int oldx, oldy, adrx, adry;static int flag_bombout, flag_finished, flag_size = 2;static int second = 0;static BITMAP bitmap1, bmpflag;static BOOL fValid1 = FALSE;static BOOL fValidflag = FALSE;static BOOL bTimer;static HWND hHighscore,hCongratuate; static int winwidth = WIDTH_LARGEWIN;static int offsetx;static int x_face, x_bomnum, x_clock;void DrawMyBitmap(HDC hdc, PBITMAP bmp, int x, int y, int w, int h){ if (bmp) FillBoxWithBitmap(hdc, x, y, w, h, bmp); else TextOut (hdc, x, y, "a");}void Cancel3DFrame(HDC hdc, int l, int t, int w, int h){ SetPenColor (hdc,COLOR_darkgray); Rectangle(hdc, l, t, l + w, t + h); SetBrushColor(hdc,COLOR_lightgray); FillBox(hdc, l+1, t+1, w-1, h-1); } void TextValue(HDC hdc, int x, int y, int value) { int color = 0; char va[20]; switch(value) { case 1: color=COLOR_blue; break; case 2: color=COLOR_green; break; case 3: color=COLOR_red; break; case 4: color=COLOR_magenta; break; case 5: color=COLOR_yellow; break; case 6: color=COLOR_cyan; break; case 7: color=COLOR_darkred; break; case 8: color=COLOR_darkgreen; break; } SetBkColor(hdc,COLOR_lightgray); SetTextColor(hdc,color); sprintf(va,"%d",value); TextOut(hdc, x + ((WIDTH_BOX - GetSysCharWidth ()) >> 1), y + ((HEIGHT_BOX - GetSysCharHeight ()) >> 1), va);} 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 = GetClientDC(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(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(hdc); return TRUE; }static BITMAP bmpbom, bmpface, bmphitfalse;static BOOL fValidbom = FALSE,fValidface = FALSE, fValidhitfalse = FALSE;void BombOut(HWND hWnd){ int i,j; HDC hdc; hdc=GetClientDC(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); DrawMyBitmap(hdc, fValidbom?&bmpbom:NULL, i*WIDTH_BOX+offsetx+1, j*HEIGHT_BOX+1+HEIGHT_FACE, 0, 0); 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); DrawMyBitmap(hdc, fValidhitfalse?&bmphitfalse:NULL, i*WIDTH_BOX+offsetx+1, j*HEIGHT_BOX+1+HEIGHT_FACE, 0, 0); bom[i][j].error = TRUE; } } } DrawMyBitmap (hdc, fValidface?&bmpface:NULL, x_face, 0, 0, 0); flag_bombout = 1; bTimer = FALSE; ReleaseDC(hdc);}static BITMAP bmpfinalface;static BOOL fValidfinalface = FALSE;void Finished(HWND hWnd){ int i,j; HDC hdc; RECT bombnumber; MAINWINCREATE CreateInfo; hdc = GetClientDC(hWnd); for (i = 0; i < sg_boxnumx; i++) { for (j = 0; j < sg_boxnumy; j++) { if (bom[i][j].flag && !bom[i][j].hit) { DrawMyBitmap(hdc, fValidflag?&bmpflag:NULL, i*WIDTH_BOX+offsetx+3, j*HEIGHT_BOX+3+HEIGHT_FACE, WIDTH_BOX - 5, HEIGHT_BOX - 5); bom[i][j].hit = TRUE; } } } DrawMyBitmap (hdc, fValidfinalface?&bmpfinalface:NULL, x_face+1, 1, 0, 0); flag_finished = 1; bTimer = FALSE; ReleaseDC(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); hCongratuate = CreateMainWindow (&CreateInfo); } } HMENU createpmenuabout(void){ 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(void){ 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(void){ 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(void){ HMENU hmnu; MENUITEMINFO mii;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -