⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bomb.c~

📁 Linux下扫雷 1.开始游戏----新游戏的开始。 ⒉难度设定——有初级、中级、高级三种难度的选择适合不同的玩家。 ⒊排名---在所有玩过此游戏的玩家进行排名。
💻 C~
📖 第 1 页 / 共 5 页
字号:
                  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 + -