📄 bomb.c~
字号:
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;
}
/*定义三个位图数据结构(进行位图输出时使用)* bmpbom地雷位图,bmpface触雷笑脸位图,bmphitfalse显示错误位图,初始值都设为FALSE*/
static BITMAP bmpbom, bmpface, bmphitfalse;
static BOOL fValidbom = FALSE,fValidface = FALSE, fValidhitfalse = FALSE;
/***********************************************************名 称:BombOut()*功 能: 显示地雷*入口参数: hWnd 窗口(或控件)句柄*出口参数:无**********************************************************/void BombOut(HWND hWnd)
{
int i,j;
HDC hdc;
hdc=GetClientDC(hWnd); //获取窗口客户区窗口句柄
/*用for循环逐个判断*/
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);
/*绘制地雷:fValidbom=TRUE,显示地雷位图,否则为NULL*/
DrawMyBitmap(hdc, fValidbom?&bmpbom:NULL,
i*WIDTH_BOX+offsetx+1,
j*HEIGHT_BOX+1+HEIGHT_FACE, 0, 0);
bom[i][j].bombout = TRUE; //方格中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);
/*绘制判断地雷错误:fValidhitfalse=TRUE,显示错误位图,否则为NULL*/
DrawMyBitmap(hdc, fValidhitfalse?&bmphitfalse:NULL,
i*WIDTH_BOX+offsetx+1,
j*HEIGHT_BOX+1+HEIGHT_FACE, 0, 0);
bom[i][j].error = TRUE; //方格中error为TRUE
}
}
}
/*判断触雷笑脸:fValidface=TRUE在x_face处显示触雷笑脸位图,否则为显示NULL*/
DrawMyBitmap (hdc, fValidface?&bmpface:NULL, x_face, 0, 0, 0);
flag_bombout = 1; //显示全部地雷标识
bTimer = FALSE; //时间停止
ReleaseDC(hdc); //释放当前窗口
}
static BITMAP bmpfinalface; /*定义位图数据结构,(完成笑脸位图)*/
static BOOL fValidfinalface = FALSE; /*完成笑脸位图fValidfinalface,初始值都设为FALSE*/
/***********************************************************名 称:Finished()*功 能: 完成任务*入口参数: hWnd 窗口(或控件)句柄*出口参数:无**********************************************************/
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) {
/*如果标识显示正确,则显示标识图片bmpflag,否则显示NULL*/
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; //方格灰色遮盖
}
}
}
/*如果完成任务(fValidfinalface=TURE),显示bmpfinalface位图(比之前的图稍移一位)*/
DrawMyBitmap (hdc, fValidfinalface?&bmpfinalface:NULL, x_face+1, 1, 0, 0);
flag_finished = 1; //完成任务标识
bTimer = FALSE; //时间停止
ReleaseDC(hdc); //释放当前窗口句柄
leftbombnum = 0; //剩余地雷数为0
/*设置矩形区域*/
SetRect (&bombnumber, x_bomnum, 0,
x_bomnum + WIDTH_BOMNUM, HEIGHT_BOMNUM); /*InvalidateRect:使窗口的指定矩形区域无效 *bombnumber指无矩形区域(RECT指针);FALSE不擦除窗口背景*/
InvalidateRect (hWnd, &bombnumber, FALSE);
/*如果完成时间比最高分数小,则更新记录*/
if (second < score[flag_size].highscore){ /*创建一个Congratulation主窗口*/
InitCongratulationCreateInfo(hWnd, &CreateInfo);
hCongratuate = CreateMainWindow (&CreateInfo);
}
}
/***********************************************************名 称:createpmenuabout()*功 能:建立下拉子菜单"About"*入口参数: 无*出口参数:建立成功返回菜单句柄;否则返回0**********************************************************/
HMENU createpmenuabout(void)
{
HMENU hmnu; //定义菜单句柄
MENUITEMINFO mii; //为了加入菜单项,定义一个MENUITEMINFO结构变量
memset (&mii, 0, sizeof(MENUITEMINFO)); //初始化mii所有单元为0
mii.type = MFT_STRING;
mii.id = 0;
mii.typedata = (DWORD)"About";
/*CreatePopupMenu:建立一个下拉菜单或子菜单(建立成功返回菜单句柄;否则返回0)*/ hmnu = CreatePopupMenu (&mii);
/*添加子菜单项"About Bomb Game"*/
memset (&mii, 0, sizeof(MENUITEMINFO));
mii.type = MFT_STRING ;
mii.state = 0;
mii.id = ID_ABOUT;
mii.typedata = (DWORD)"About Bomb Game";
/*InsertMenuItem:向菜单添加菜单项 *参数2:item插入位置;参数3:flag指示菜单的基本状态;参数4:mii菜单项数据结构变量指针*/ InsertMenuItem(hmnu, 0, TRUE, &mii);
return hmnu;
}
/***********************************************************名 称:createpmenustart()*功 能:建立下拉子菜单"Start"*入口参数: 无*出口参数:建立成功返回菜单句柄;否则返回0**********************************************************/
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);
/*添加子菜单项"New Game"*/
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);
/*添加子菜单项"High Score"*/
mii.type = MFT_STRING ;
mii.state = 0;
mii.id = ID_HIGHSCORE;
mii.typedata = (DWORD)"High Score";
InsertMenuItem(hmnu, 1, TRUE, &mii);
/*添加子菜单项"Quit Game"*/
mii.type = MFT_STRING ;
mii.state = 0;
mii.id = ID_CLOSE;
mii.typedata = (DWORD)"Quit Game";
InsertMenuItem(hmnu, 2, TRUE, &mii);
return hmnu;
}
/***********************************************************名 称:createpmenulevel()*功 能:建立下拉子菜单"Level"*入口参数: 无*出口参数:建立成功返回菜单句柄;否则返回0**********************************************************/
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);
/*添加子菜单项"Large"*/
mii.type = MFT_STRING ;
mii.state = 0;
mii.id = ID_LARGE;
mii.typedata = (DWORD)"Large";
InsertMenuItem(hmnu, 0, TRUE, &mii);
/*添加子菜单项"Middle"*/
mii.type = MFT_STRING ;
mii.state = 0;
mii.id = ID_MIDDLE;
mii.typedata = (DWORD)"Middle";
InsertMenuItem(hmnu, 1, TRUE, &mii);
/*添加子菜单项"Small"*/
mii.type = MFT_STRING ;
mii.state = 0;
mii.id = ID_SMALL;
mii.typedata = (DWORD)"Small";
InsertMenuItem(hmnu, 2, TRUE, &mii);
return hmnu;
}
/***********************************************************名 称:createpmenu1()*功 能:创建菜单*入口参数: 无*出口参数:建立成功返回菜单句柄;否则返回0**********************************************************/
HMENU createmenu1(void)
{
HMENU hmnu;
MENUITEMINFO mii;
/*CreateMenu:建立一个空菜单(在此空菜单上插入下拉菜单)*/
hmnu = CreateMenu();
memset (&mii, 0, sizeof(MENUITEMINFO));
mii.type = MFT_STRING;
mii.id = 100;
mii.typedata = (DWORD)"Start";
mii.hsubmenu = createpmenustart(); //mii.hsubmenu用来指向子菜单(菜单句柄)
InsertMenuItem(hmnu, 0, TRUE, &mii); //添加"Start"菜单项
mii.type = MFT_STRING;
mii.id = 110;
mii.typedata = (DWORD)"Level";
mii.hsubmenu = createpmenulevel();
InsertMenuItem(hmnu, 1, TRUE, &mii); //添加"Level"菜单项
mii.type = MFT_STRING;
mii.id = 120;
mii.typedata = (DWORD)"About";
mii.hsubmenu = createpmenuabout();
InsertMenuItem(hmnu, 2, TRUE, &mii); //添加"About"菜单项
return hmnu;
}
/***********************************************************名 称:BothButtonDownProc()*功 能: 左右键按下方格*入口参数: hWnd 窗口(或控件)句柄* adrx 左上角横坐标* adry 左上角纵坐标*出口参数:无**********************************************************/
void BothButtonDownProc(HWND hWnd,int adrx,int adry)
{
int test_open = 0; //8个方向已打开的方格个数
int i = 1;
int adrx1 = 0, adry1 = 0;
int flag_opened = 1; //地雷是否被标识
if (!bom[adrx][adry].test) //如果文本框没有被显示
return;
if (!bom[adrx][adry].value) //如果方格内没有值
return;
if (bom[adrx][adry].hit) //如果被灰框遮盖着
return; //判断8个方向
while (i <= 8)
{
switch (i)
{
case 1:
adrx1 = adrx-1;
adry1 = adry;
break;
case 2:
adrx1 = adrx-1;
adry1 = adry-1;
break;
case 3:
adrx1 = adrx-1;
adry1 = adry+1;
break;
case 4:
adrx1 = adrx;
adry1 = adry-1;
break;
case 5:
adrx1 = adrx;
adry1 = adry+1;
break;
case 6:
adrx1 = adrx+1;
adry1 = adry;
break;
case 7:
adrx1 = adrx+1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -