📄 bomb.c~
字号:
/*
** $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 + -