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

📄 bomb.c~

📁 Linux下扫雷 1.开始游戏----新游戏的开始。 ⒉难度设定——有初级、中级、高级三种难度的选择适合不同的玩家。 ⒊排名---在所有玩过此游戏的玩家进行排名。
💻 C~
📖 第 1 页 / 共 5 页
字号:
/*
** $Id: bomb.c,v 1.19 2006/06/07 zhangxin $
**
** bomb.c: The MineSweeper game.
**
*/



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <pwd.h>

#include <minigui/common.h>  //包含了MiNiGUI常用的宏以及数据类型的定义
#include <minigui/minigui.h>   //包含了全局的和通用的接口函数以及某些杂项函数的定义
#include <minigui/gdi.h>       //包含了MiNiGUI绘图函数的接口定义
#include <minigui/window.h>   //包含了窗口有关的宏,数据类型,数据结构定义以及函数接口的声明.
#include <minigui/control.h>    /*包含了libminigui中所由内建控件的接口定义.			    *使用预定义控件的MiNiGUI程序需要包含此头文件*/	
/*定义方格结构体*/
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];	//最大30*16格
static NO NoAdr[540];	
static SCORE score[3];	//大,中,小三个模式最高分
static int itime, leftbombnum;	//itime已打开方格数,leftbombnum剩余地雷数
static int bombnum = 99;		//初始化的地雷数是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);
/*定义下拉菜单乡ID值,ID值大于100,且不能重复*/
#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  //一个数字的宽是14
#define  WIDTH_BOMNUM    (2*WIDTH_DIGIT)  //地雷数是两个数字宽
#define  HEIGHT_BOMNUM   30		     //一个地雷数高30
/*定义时钟数控件大小*/
#define  WIDTH_CLOCK     (3*WIDTH_DIGIT)  //时钟数是三个数字宽
#define  HEIGHT_CLOCK    30      //一个时钟数高30
#define  FREQ_CLOCK      10      //时钟间隔
/*定义方格大小*/
#define  WIDTH_BOX       18
#define  HEIGHT_BOX      18

static int sg_boxnumx = 30;	  //方格横坐标数30	
static int sg_boxnumy = 16;  //方格纵坐标数16
static BITMAP sg_bmpDigit[10];  //存0-9的位图的位图数组指针

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;  //整体方格边框的最左上角x坐标
static int x_face, x_bomnum, x_clock; //定义三个控件:笑脸,地雷数,时间
/****************************************************名    称:DrawMyBitmap()*功    能:进行位图输出*入口参数: hdc  窗口设置上下文句柄*         bmp  位数据结构指针*         x     图片位置x坐标值*         y     图片位置y坐标值*         w     图片宽*	  h      图片高*出口参数:无****************************************************/
void DrawMyBitmap(HDC hdc, PBITMAP bmp, int x, int y, int w, int h)
{     /*FillBoxWithBitmap:位块填充函数(BOOL型,用设备相关位图对象填充矩形框)      *                (x,y位图所在矩形的左上角坐标值;w,h矩形的宽高;bmp位图对象指针)*/     /*TextOut:文本输出函数(宏函数),返回输出字符串的长度*/
    if (bmp)
        FillBoxWithBitmap(hdc, x, y, w, h, bmp);  
    else
        TextOut (hdc, x, y, "a");
}
/****************************************************名    称:Cancel3DFrame()*功    能: 绘制方格*入口参数: hdc  窗口设置上下文句柄*         l     左上角横坐标值*         t     左上角纵坐标值*         w    横坐标偏移值*	  h     纵坐标偏移值*出口参数:无****************************************************/
void Cancel3DFrame(HDC hdc, int  l, int  t, int w, int h)
{    /*SetPenColor:设置画笔颜色(宏函数),返回旧的画笔颜色*/    /*Rectangle:画矩形函数,(l,t矩形左上角坐标值;l+w,t+h矩形右上角坐标值)*/    /*SetBrushColor:设置画刷颜色(宏函数),返回旧的画笔颜色*/    /*FillBox:位块填充函数*/        //绘制灰色框
    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); 
} 
/****************************************************名    称:TextValue()*功    能: 显示方格*入口参数: hdc   窗口设置上下文句柄*          x    方格左上角横坐标值*          y    方格左上角纵坐标值*         value  方格内的数字*出口参数:无****************************************************/
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:设置文本背景颜色(宏函数)*/    /*SetTextColor:设置文本颜色(宏函数)*/
    SetBkColor(hdc,COLOR_lightgray);
    SetTextColor(hdc,color);
    sprintf(va,"%d",value); //将8个值存入va数组中
        /*TextOut:文本输出函数(宏函数)             va:待输出的字符串(指针)*/
    TextOut(hdc, x + ((WIDTH_BOX - GetSysCharWidth ()) >> 1), 
        y + ((HEIGHT_BOX - GetSysCharHeight ()) >> 1), va);
}  
/***********************************************************名    称:SearchGround()*功    能: 寻找无数字方格.如果是无数字方格,判断显示其8个方向的数值*入口参数: hdc   窗口设置上下文句柄*          x    方格左上角横坐标值*          y    方格左上角纵坐标值*出口参数:无**********************************************************/
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);
          /*依此判断8个方向*/     while( i <= 8 )
     {
         switch(i) 
         {             /*8个方向*/
             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;   //上
         }         /*在方格范围内,如果某方向不是数字方格(被灰格遮盖着,文本框无显示,无数值),继续递归此函数,判断其8个方向的值*/
         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++; //判断下一个方向
     }
 }
/***********************************************************名    称:Open()*功    能: 打开方格内容*入口参数: hWnd  窗口(或控件)句柄*          x    方格左上角横坐标值*          y    方格左上角纵坐标值*出口参数:操作成功返回TRUE;否则返回FALSE**********************************************************/
BOOL Open(HWND hWnd,int x,int y)
{ 
    int x1=0,y1=0;
    int i=1;
    HDC hdc;

    hdc = GetClientDC(hWnd);  //获取窗口客户区窗口句柄    //判断8个方向
    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;
        }
            /*在方格范围内,如果某方向没有被标识,并且是无数字方格,则调用SearchGround()函数*/             
        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;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -