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

📄 mine.c

📁 开放源码实时操作系统源码.
💻 C
📖 第 1 页 / 共 3 页
字号:
#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 + -