📄 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() 13
extern 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 0
static 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 1
static 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 0
static 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;
#endif
static 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 0
HMENU 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 + -