📄 bomb.c~
字号:
for (j = 0; j < sg_boxnumy; j++)
{ /*如果没有被设为地雷*/
if (!bom[i][j].flag) { /*当这个方格左上方有方格时,并且为地雷,则这个方格的数值加1*/
if(i-1>=0&&j-1>=0&&bom[i-1][j-1].flag)
bom[i][j].value++; /*这个方格的数值加1*/
/*当这个方格左方有方格时,并且为地雷,则这个方格的数值加1*/
if(i-1>=0&&bom[i-1][j].flag)
bom[i][j].value++;
/*当这个方格左下方有方格时,并且为地雷,则这个方格的数值加1*/
if(i-1>=0&&j+1<sg_boxnumy&&bom[i-1][j+1].flag)
bom[i][j].value++;
/*当这个方格上方有方格时,并且为地雷,则这个方格的数值加1*/
if(j-1>=0&&bom[i][j-1].flag)
bom[i][j].value++;
/*当这个方格下方有方格时,并且为地雷,则这个方格的数值加1*/
if(j+1<sg_boxnumy&&bom[i][j+1].flag)
bom[i][j].value++;
/*当这个方格右下方有方格时,并且为地雷,则这个方格的数值加1*/
if(i+1<sg_boxnumx&&j+1<sg_boxnumy&&bom[i+1][j+1].flag)
bom[i][j].value++;
/*当这个方格右方有方格时,并且为地雷,则这个方格的数值加1*/
if(i+1<sg_boxnumx&&bom[i+1][j].flag)
bom[i][j].value++;
/*当这个方格右上方有方格时,并且为地雷,则这个方格的数值加1*/
if(i+1<sg_boxnumx&&j-1>=0&&bom[i+1][j-1].flag)
bom[i][j].value++;
}
}
InvalidateRect (hWnd, NULL, TRUE); //擦除窗口背景
}
break;
/*MSG_TIMER:定时器消息.当定时器定时时间到达时将会产生此信息. *wParam参数指明了产生消息的定时器ID(标识号)*/
case MSG_TIMER:
if (wParam == ID_CLOCK)
if (bTimer){
if (second < 1000){ //时间最大999
second++;
InvalidateRect(hWnd, &clock, FALSE);
}
}
break;
/*MSG_LBUTTONDOWN鼠标左键按下消息. *lParam参数指示热点(当前鼠标光标点)的位置,低位字为x坐标值,高位字为y坐标值. *wParam参数指明按键状态(如ctrl键)*/
case MSG_LBUTTONDOWN:
oldx = LOWORD (lParam); //获取鼠标控件
oldy = HIWORD (lParam); //取得通知码
adrx = (oldx-offsetx)/WIDTH_BOX;
adry = (oldy-HEIGHT_FACE)/HEIGHT_BOX;
/*如果是点击生成的窗口记录最高分,直接跳出*/
if (hCongratuate | hHighscore)
break;
/*如果没有点击方格,而点击笑脸,则发送新游戏消息*/
if (!PtInRect (&bombregion, oldx, oldy)) {
if (PtInRect (&face, oldx, oldy)){
PostMessage (hWnd, MSG_COMMAND, ID_NEW, 0);
break;
}
else
break;
}
if (flag_bombout) /*如果地雷已被标识,跳出*/
break;
if (flag_finished) /*如果标识完成,跳出*/
break;
if (!bTimer) /*如果时间停止,则设为时间开始*/
bTimer = TRUE;
if (bom[adrx][adry].hit) /*如果灰色遮盖着,跳出*/
break;
/*如果点击左或右键,调用BothButtonDownProc()按键函数*/
if (wParam & KS_RIGHTBUTTON) {
BothButtonDownProc(hWnd,adrx,adry);
break;
}
if (bom[adrx][adry].test) /*如果文本框显示,跳出*/
break;
/*如果点击被标识的地雷,则显示地雷*/
if (bom[adrx][adry].flag) {
BombOut(hWnd);
break;
} /*如果点击数值不为0的方格*/
if (bom[adrx][adry].value != 0)
{
NoAdr[itime].x = adrx;
NoAdr[itime].y = adry;
NoAdr[itime].NY = TRUE; //设定为数值方格
itime++; //已打开的方格数加1
bom[adrx][adry].test = TRUE; //显示文本框
/*设置显示数值矩形区域*/
SetRect (&onerect, adrx*WIDTH_BOX+offsetx,
adry*HEIGHT_BOX+HEIGHT_FACE,
(adrx+1)*WIDTH_BOX+offsetx,
(adry+1)*HEIGHT_BOX+HEIGHT_FACE); /*设定矩形区域无效,窗口背景不清除*/
InvalidateRect (hWnd, &onerect, FALSE);
}
else {
hdc = GetClientDC(hWnd); //获取当前窗口句柄
SearchGround (hdc, adrx, adry); //找无数值方格
ReleaseDC(hdc); //释放当前窗口句柄
}
/*如果方格除地雷全部显示,则Finished()任务完成*/
if (itime == (sg_boxnumx*sg_boxnumy - bombnum))
Finished(hWnd);
break;
/*鼠标右键按下消息*/
case MSG_RBUTTONDOWN:
// SetCapture (hWnd); 获取鼠标
oldx = LOWORD (lParam);
oldy = HIWORD (lParam);
adrx = (oldx-offsetx)/WIDTH_BOX;
adry = (oldy-HEIGHT_FACE)/HEIGHT_BOX;
if (!PtInRect (&bombregion, oldx, oldy)) //没有点击方格
break;
if (flag_bombout) //地雷已被标识
break;
if (flag_finished) //标识完成
break;
if (!bTimer) //时间停止
bTimer = TRUE; //时间开始
/*****RBUTTONDOWN & LBUTTONDOWN******/
/*如果点击右或左键,调用BothButtonDownProc()按键函数*/
if (wParam & KS_LEFTBUTTON){
BothButtonDownProc(hWnd,adrx,adry);
break;
}
/******* only rbuttondown *******/
if (bom[adrx][adry].test) //如果文本框显示
break;
if (!bom[adrx][adry].hit ) //没有被遮盖着
{
bom[adrx][adry].hit = TRUE; //设置被遮盖
leftbombnum--; //剩余地雷数减1
}
else
{ bom[adrx][adry].hit = FALSE; //设置没有被遮盖
leftbombnum++; //剩余地雷数加1
}
SetRect (&onerect, adrx*WIDTH_BOX+offsetx,
adry*HEIGHT_BOX+HEIGHT_FACE,
(adrx+1)*WIDTH_BOX+offsetx,
(adry+1)*HEIGHT_BOX+HEIGHT_FACE);
InvalidateRect (hWnd, &onerect, FALSE);
InvalidateRect (hWnd, &bombnumber, FALSE);
break;
case MSG_RBUTTONUP: /*鼠标右键释放消息*/
break;
case MSG_LBUTTONUP: /*鼠标左键释放消息*/
break;
/*MSG_PAINT窗口绘图消息.可处理文字或图形显示 *lParam参数指明需要重绘的区域(CLIPRGN指针)*/
case MSG_PAINT:
hdc = BeginPaint (hWnd); //获取窗口设备上下文句柄
sprintf(seconds, "%03d", second); //时间的三位数字存入数组seconds
DrawDigit(hdc, seconds, TRUE); //绘制时间数
if (leftbombnum >= 0){ //如果剩余地雷数大于等于0
sprintf(bomn,"%02d",leftbombnum); //两位数字存入数组bomn
DrawDigit(hdc, bomn, FALSE); //绘制地雷数
}
if (flag_finished) //如果标识完成 /*显示完成任务笑脸位图*/
DrawMyBitmap (hdc, fValidfinalface?&bmpfinalface:NULL,
x_face+1, 1, 0, 0);
else
if (flag_bombout) //如果是标识地雷 /*显示笑脸位图*/
DrawMyBitmap (hdc, fValidface?&bmpface:NULL,
x_face, 0, 0, 0);
else /*显示触雷笑脸位图*/
DrawMyBitmap(hdc, fValid1?&bitmap1:NULL,
x_face, 0, 0, 0);
for (i = 0; i < sg_boxnumx; i++)
for (j = 0; j < sg_boxnumy; j++)
{ /*如果没有显示文本框,没有被标识为地雷(自动认为地雷)*/
if (!bom[i][j].test && !bom[i][j].bombout){
SetPenColor (hdc,COLOR_darkgray); //设置画笔颜色
Rectangle(hdc,
i*WIDTH_BOX+offsetx,
j*HEIGHT_BOX+HEIGHT_FACE,
(i+1)*WIDTH_BOX+offsetx,
(j+1)*HEIGHT_BOX+HEIGHT_FACE); //绘制矩形区域
Draw3DUpThickFrame (hdc,
i*WIDTH_BOX+1+offsetx,
j*HEIGHT_BOX+1+HEIGHT_FACE,
(i+1)*WIDTH_BOX+offsetx,
(j+1)*HEIGHT_BOX+HEIGHT_FACE,
COLOR_lightgray); //刷画为亮灰
}
if ( 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); //绘制标识地雷位图
//如果判断错误
if (bom[i][j].error) {
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);
}
//如果是地雷
if (bom[i][j].bombout) {
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);
}
}
/*绘制数值*/
for ( i = 0; i < itime; i++ )
{
Cancel3DFrame(hdc,(NoAdr[i].x)*WIDTH_BOX+offsetx,
(NoAdr[i].y)*HEIGHT_BOX+HEIGHT_FACE,
WIDTH_BOX, HEIGHT_BOX);
if(NoAdr[i].NY) //如果是数字方格
TextValue(hdc,(NoAdr[i].x)*WIDTH_BOX+offsetx,
(NoAdr[i].y)*HEIGHT_BOX+HEIGHT_FACE,
bom[NoAdr[i].x][NoAdr[i].y].value); //显示数值
}
EndPaint (hWnd, hdc); //释放窗口设备上下文句柄
return 0;
case MSG_CLOSE: //关闭窗口命令消息
UnloadBitmap(&bmpbom); //御载位图资源
UnloadBitmap(&bmpface);
UnloadBitmap(&bitmap1);
UnloadBitmap(&bmpfinalface);
UnloadBitmap(&bmphitfalse);
UnloadBitmap(&bmpflag);
KillTimer(hWnd, ID_CLOCK); //删除定时器
for (i = 0; i < 10; i++)
UnloadBitmap(sg_bmpDigit + i); //御载0-9位图资源
DestroyMainWindow (hWnd); //销毁主窗口
PostQuitMessage (hWnd); //发送MSG_QUIT消息(以终止消息循环)
return 0;
}
return DefaultMainWinProc(hWnd, message, wParam, lParam); //默认的主窗口过程函数
}
/***********************************************************名 称:InitMyWinCreateInfo()*功 能: 建立主窗口*入口参数: 主窗口*出口参数: 无**********************************************************/
void InitMyWinCreateInfo(PMAINWINCREATE pCreateInfo)
{
pCreateInfo->dwStyle = WS_CAPTION | WS_BORDER | WS_SYSMENU | WS_VISIBLE; //窗口风格设置
pCreateInfo->dwExStyle = WS_EX_NONE; //不使用窗口扩展风格
pCreateInfo->spCaption="Bomb Game "; //窗口标题
pCreateInfo->hMenu = createmenu1(); //下拉式菜单
pCreateInfo->hCursor = GetSystemCursor(0); //设置窗口光标
pCreateInfo->hIcon = 0; //无窗口图标
pCreateInfo->MainWindowProc = TestMyWinProc; //窗口过程函数
pCreateInfo->lx = 0; //窗口的位置
pCreateInfo->ty = 0; //窗口的位置
pCreateInfo->rx = WIDTH_LARGEWIN; //窗口的大小(宽)
pCreateInfo->by = HEIGHT_LARGEWIN; //窗口的大小(高)
pCreateInfo->iBkColor = COLOR_lightgray; //窗口背景色
pCreateInfo->dwAddData = 0; //无附加数据
pCreateInfo->hHosting = HWND_DESKTOP; //托管窗口句柄
}
/***********************************************************名 称:MiniGUIMain()*功 能: MiniGUI程序入口点*入口参数: args 参数个数* arg 参数字符串指针*出口参数: 返回0**********************************************************/
#ifdef _LITE_VERSION
int MiniGUIMain(int args, const char* arg[])
#else
void* TestMyWindow(void* data)
#endif
{
MSG Msg;
MAINWINCREATE CreateInfo;
HWND hMainWnd;
#if defined(_LITE_VERSION) && !(_STAND_ALONE)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -