×

windows扫雷代码

windows扫雷代码(windows扫雷作弊码)

admin admin 发表于2023-04-03 20:35:12 浏览55 评论0

抢沙发发表评论

本文目录一览:

C++扫雷源代码

这是字符界面的扫雷:

#include iostream

#include cstdlib

#include ctime

#include windows.h

#include conio.h

// defines

#define KEY_UP 0xE048

#define KEY_DOWN 0xE050

#define KEY_LEFT 0xE04B

#define KEY_RIGHT 0xE04D

#define KEY_ESC 0x001B

#define KEY_1 '1'

#define KEY_2 '2'

#define KEY_3 '3'

#define GAME_MAX_WIDTH 100

#define GAME_MAX_HEIGHT 100

// Strings Resource

#define STR_GAMETITLE "ArrowKey:MoveCursor Key1:Open \

Key2:Mark Key3:OpenNeighbors"

#define STR_GAMEWIN "Congratulations! You Win! Thank you for playing!\n"

#define STR_GAMEOVER "Game Over, thank you for playing!\n"

#define STR_GAMEEND "Presented by yzfy . Press ESC to exit\n"

//-------------------------------------------------------------

// Base class

class CConsoleWnd

{

public:

static int TextOut(const char*);

static int GotoXY(int, int);

static int CharOut(int, int, const int);

static int TextOut(int, int, const char*);

static int GetKey();

public:

};

//{{// class CConsoleWnd

//

// int CConsoleWnd::GetKey()

// Wait for standard input and return the KeyCode

//

int CConsoleWnd::GetKey()

{

int nkey=getch(),nk=0;

if(nkey=128||nkey==0)nk=getch();

return nk0?nkey*256+nk:nkey;

}

//

// int CConsoleWnd::GotoXY(int x, int y)

// Move cursor to (x,y)

// Only Console Application

//

int CConsoleWnd::GotoXY(int x, int y)

{

COORD cd;

cd.X = x;cd.Y = y;

return SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),cd);

}

//

// int CConsoleWnd::TextOut(const char* pstr)

// Output a string at current position

//

int CConsoleWnd::TextOut(const char* pstr)

{

for(;*pstr;++pstr)putchar(*pstr);

return 0;

}

//

// int CConsoleWnd::CharOut(int x, int y, const int pstr)

// Output a char at (x,y)

//

int CConsoleWnd::CharOut(int x, int y, const int pstr)

{

GotoXY(x, y);

return putchar(pstr);

}

//

// int CConsoleWnd::TextOut(const char* pstr)

// Output a string at (x,y)

//

int CConsoleWnd::TextOut(int x, int y, const char* pstr)

{

GotoXY(x, y);

return TextOut(pstr);

}

//}}

//-------------------------------------------------------------

//Application class

class CSLGame:public CConsoleWnd

{

private:

private:

int curX,curY;

int poolWidth,poolHeight;

int bm_gamepool[GAME_MAX_HEIGHT+2][GAME_MAX_WIDTH+2];

public:

CSLGame():curX(0),curY(0){poolWidth=poolHeight=0;}

int InitPool(int, int, int);

int MoveCursor(){return CConsoleWnd::GotoXY(curX, curY);}

int DrawPool(int);

int WaitMessage();

int GetShowNum(int, int);

int TryOpen(int, int);

private:

int DFSShowNum(int, int);

private:

const static int GMARK_BOOM;

const static int GMARK_EMPTY;

const static int GMARK_MARK;

};

const int CSLGame::GMARK_BOOM = 0x10;

const int CSLGame::GMARK_EMPTY= 0x100;

const int CSLGame::GMARK_MARK = 0x200;

//{{// class CSLGame:public CConsoleWnd

//

// int CSLGame::InitPool(int Width, int Height, int nBoom)

// Initialize the game pool.

// If Width*Height = nBoom, or nBoom=0,

// or Width and Height exceed limit , then return 1

// otherwise return 0

//

int CSLGame::InitPool(int Width, int Height, int nBoom)

{

poolWidth = Width; poolHeight = Height;

if(nBoom=0 || nBoom=Width*Height

|| Width =0 || Width GAME_MAX_WIDTH

|| Height=0 || HeightGAME_MAX_HEIGHT

){

return 1;

}

// zero memory

for(int y=0; y=Height+1; ++y)

{

for(int x=0; x=Width+1; ++x)

{

bm_gamepool[y][x]=0;

}

}

// init seed

srand(time(NULL));

// init Booms

while(nBoom)

{

int x = rand()%Width + 1, y = rand()%Height + 1;

if(bm_gamepool[y][x]==0)

{

bm_gamepool[y][x] = GMARK_BOOM;

--nBoom;

}

}

// init cursor position

curX = curY = 1;

MoveCursor();

return 0;

}

//

// int CSLGame::DrawPool(int bDrawBoom = 0)

// Draw game pool to Console window

//

int CSLGame::DrawPool(int bDrawBoom = 0)

{

for(int y=1;y=poolHeight;++y)

{

CConsoleWnd::GotoXY(1, y);

for(int x=1;x=poolWidth;++x)

{

if(bm_gamepool[y][x]==0)

{

putchar('.');

}

else if(bm_gamepool[y][x]==GMARK_EMPTY)

{

putchar(' ');

}

else if(bm_gamepool[y][x]0 bm_gamepool[y][x]=8)

{

putchar('0'+bm_gamepool[y][x]);

}

else if(bDrawBoom==0 (bm_gamepool[y][x] GMARK_MARK))

{

putchar('#');

}

else if(bm_gamepool[y][x] GMARK_BOOM)

{

if(bDrawBoom)

putchar('*');

else

putchar('.');

}

}

}

return 0;

}

//

// int CSLGame::GetShowNum(int x, int y)

// return ShowNum at (x, y)

//

int CSLGame::GetShowNum(int x, int y)

{

int nCount = 0;

for(int Y=-1;Y=1;++Y)

for(int X=-1;X=1;++X)

{

if(bm_gamepool[y+Y][x+X] GMARK_BOOM)++nCount;

}

return nCount;

}

//

// int CSLGame::TryOpen(int x, int y)

// Try open (x, y) and show the number

// If there is a boom, then return EOF

//

int CSLGame::TryOpen(int x, int y)

{

int nRT = 0;

if(bm_gamepool[y][x] GMARK_BOOM)

{

nRT = EOF;

}

else

{

int nCount = GetShowNum(x,y);

if(nCount==0)

{

DFSShowNum(x, y);

}

else bm_gamepool[y][x] = nCount;

}

return nRT;

}

//

// int CSLGame::DFSShowNum(int x, int y)

// Private function, no comment

//

int CSLGame::DFSShowNum(int x, int y)

{

if((0x x=poolWidth)

(0y y=poolHeight)

(bm_gamepool[y][x]==0))

{

int nCount = GetShowNum(x, y);

if(nCount==0)

{

bm_gamepool[y][x] = GMARK_EMPTY;

for(int Y=-1;Y=1;++Y)

for(int X=-1;X=1;++X)

{

DFSShowNum(x+X,y+Y);

}

}

else bm_gamepool[y][x] = nCount;

}

return 0;

}

//

// int CSLGame::WaitMessage()

// Game loop, wait and process an input message

// return: 0: not end; 1: Win; otherwise: Lose

//

int CSLGame::WaitMessage()

{

int nKey = CConsoleWnd::GetKey();

int nRT = 0, nArrow = 0;

switch (nKey)

{

case KEY_UP:

{

if(curY1)--curY;

nArrow=1;

}break;

case KEY_DOWN:

{

if(curYpoolHeight)++curY;

nArrow=1;

}break;

case KEY_LEFT:

{

if(curX1)--curX;

nArrow=1;

}break;

case KEY_RIGHT:

{

if(curXpoolWidth)++curX;

nArrow=1;

}break;

case KEY_1:

{

nRT = TryOpen(curX, curY);

}break;

case KEY_2:

{

if((bm_gamepool[curY][curX]

~(GMARK_MARK|GMARK_BOOM))==0)

{

bm_gamepool[curY][curX] ^= GMARK_MARK;

}

}break;

case KEY_3:

{

if(bm_gamepool[curY][curX] 0xF)

{

int nb = bm_gamepool[curY][curX] 0xF;

for(int y=-1;y=1;++y)

for(int x=-1;x=1;++x)

{

if(bm_gamepool[curY+y][curX+x] GMARK_MARK)

--nb;

}

if(nb==0)

{

for(int y=-1;y=1;++y)

for(int x=-1;x=1;++x)

{

if((bm_gamepool[curY+y][curX+x]

(0xF|GMARK_MARK)) == 0)

{

nRT |= TryOpen(curX+x, curY+y);

}

}

}

}

}break;

case KEY_ESC:

{

nRT = EOF;

}break;

}

if(nKey == KEY_1 || nKey == KEY_3)

{

int y=1;

for(;y=poolHeight;++y)

{

int x=1;

for(;x=poolWidth; ++x)

{

if(bm_gamepool[y][x]==0)break;

}

if(x=poolWidth) break;

}

if(! (y=poolHeight))

{

nRT = 1;

}

}

if(nArrow==0)

{

DrawPool();

}

MoveCursor();

return nRT;

}

//}}

//-------------------------------------------------------------

//{{

//

// main function

//

int main(void)

{

int x=50, y=20, b=100,n; // define width height n_booms

CSLGame slGame;

// Init Game

{

CConsoleWnd::GotoXY(0,0);

CConsoleWnd::TextOut(STR_GAMETITLE);

slGame.InitPool(x,y,b);

slGame.DrawPool();

slGame.MoveCursor();

}

while((n=slGame.WaitMessage())==0) // Game Message Loop

;

// End of the Game

{

slGame.DrawPool(1);

CConsoleWnd::TextOut("\n");

if(n==1)

{

CConsoleWnd::TextOut(STR_GAMEWIN);

}

else

{

CConsoleWnd::TextOut(STR_GAMEOVER);

}

CConsoleWnd::TextOut(STR_GAMEEND);

}

while(CConsoleWnd::GetKey()!=KEY_ESC)

;

return 0;

}

//}}

windows xp扫雷秘籍

你的方法没错!!!!!!!!!!!!!!!!!!!!!!!!!!!!!你把网页关掉然后1.打开扫雷游戏 2.按xyzzy 3.按shift一秒 4.你会看到桌面最左上角有个白点而不是黑点,再放在你要点的格子上,有雷的话那个白点会消失!没雷就会亮着! 一定要看我的,我也之前试了很多便没成功,后来关了网页就好了!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!-windows扫雷代码

如何查看电脑自带的扫雷游戏的有代码

有两种方法可以找到:

一.控制面板-〉添加删除windows组件-〉附件和工具-;点击详细信息-;把游戏画勾->确定.

二.进入“我的电脑”-;C盘;--windows文件选择

system32 windows游戏就在这里面有:(不过里面的文件比较多,要慢慢找)

纸牌游戏程序名是sol.exe

“扫雷”游戏程序名是winmine.exe

“三维弹球”游戏程序名是PINBALL.EXE

“空当接龙”纸牌游戏程序名是freecell.exe

红心大战纸牌游戏程序名是mshearts.exe

如果第一种用不了,就用第二种,

要是用第二种找的了,你想经常玩的话,你可以把它复制到;桌面;

OK,就是这么简单.呵呵多玩电脑你也会边得很棒的咯.

windows自带的扫雷游戏作弊方法

不用这么麻烦的,有一次在办公室玩,差点被BOSS发现,情急之下点了一下“快速启动”栏中的“显示桌面”按钮,把桌面上所有内容都最小化了。等领导走后,居然发现扫雷的时间停止了!自己又试了几遍,都可以(直接最小化窗口不行,必须是点“显示桌面”),您一试便知!-windows扫雷代码

注:我们的系统都是XP,其他系统没有试验过!

如何用C++写扫雷?????????????

用VC++编写扫雷游戏

用VC++编写扫雷游戏

王洪亚

本文从分析windows扫雷游戏的功能特点开始,应用面向对象的可视化编程语言visual c++给出了个功能模块的具体实现方法,并提供了编写小游戏程序的一般方法和visual c++的一些使用技巧。 -windows扫雷代码

首先分析扫雷的最基本功能。

点击鼠标左键于未知区域,如果未知区域有雷,游戏停止,显示所有的地雷。如果没雷,则显示周围雷数,如果周围没雷,则再查看周围八个区域是否有雷直到有雷为止并显示,这其实是一个递归过程。

点击鼠标右键于未知区域,则将其置为有雷而不管是否真的有雷。可选择初、中、高三级并可自定义雷数和区域大小。

雷区上部左侧显示总雷数减被标明有雷区域的数目。

雷区上部中间位置显示一按钮用于开局和显示鼠标动作的结果。

雷区上部右侧显示扫雷的时间。

将雷全部扫清后,则显示一对话框将你的姓名记入排行榜。以时间排序。

为完成上述功能,应用visual c++的具体技术细节如下:

1. 应用appwizard创建基于sdi的应用程序cbombapp,去除打印和状态条支持,在资源编辑器中修改菜单和相应的加速键,使其与windows扫雷游戏一致。具体为开局(id-game-begin)、初级(id-game-junior)、中级(id-game-middle)、高级(id-game-senior)、自定义(id-game-custom)、颜色(id-game-color)、英雄榜(id-game-sort)、退出(id-game-exit)、帮助(id-help)。 -windows扫雷代码

2. 在资源编辑器中对应于雷区的每个小区域的13个属性。用画笔或其他绘图工具绘制出相对应的13个10乘10的16色小位图,三个对应于小人表情的20乘20的16色小位图,供更换颜色时使用的一套与前16个对应的单色位图,显示时间和雷数的0~9十个数字位图(底色为黑色)。 -windows扫雷代码

定制customer对话框,内含三个静态文本控件和三个编辑控件,三个编辑控件分别对应成员m_irownum,m_icolumnnum,m_ibombnum。该对话框用于定制雷数,行列数,其相应的mfc类为ccustomer。定制sort对话框,内含九个静态文本控件,其中六个显示排行榜的姓名和时间,其对应的mfc类为csort。定制input对话框,内含一个静态文本控件和一个编辑控件,编辑控件用于在游戏成功结束时输入姓名,其对应的mfc类为cinput。 -windows扫雷代码

3. 定义类bomb,封装每颗雷的相关属性。

class bomb

{

public:

int isbomb;//决定初始时是否是雷

bool issel; //判断区域是否被处理过且周围有雷

bool isdone;//判断递归时是否被处理过

int num; //周围雷数

bool findbomb; //排雷者认为是雷时置一(但是不一定真是雷)

} ;

4. 重载cmainframe中precreatewindow,并设置相应属性,使其窗体大小固定,这样就固定了显示区域的大小为初始10乘10个雷和外加雷区上部的控制区域,部分代码如下。

cs.style=ws_overlapped|ws_sysmenu| ws_border|ws_minimizebox;

cs.cy = 10*15+6;

cs.cx = 10*15+60; //6和60分别是横纵的附加值,用于边框、菜单、标题条、控制区域。

5. 游戏的主要工作就是呈现不断变换的图形或动画,并按用户的输入交互进行显示,而windows文档-----视窗构架中的视窗的功能正是接受用户输入并负责显示,因此由cview类来完成扫雷的大部分工作。在cbombview中定义下列成员变量记录相关操作的结果或对象的状态。 -windows扫雷代码

bomb m_bomb[30][30]; //最大的地雷区域

cstring m_currenttime; //用于记录并显示扫雷时间

ctime m_begintime;//记录游戏开始时的时间

bool m_timerbegin;//定时器是否开启

int m_ibomnum;//雷的数目

int m_irow;//雷的行数

int m_icolumn;//雷的列数

int m_ibombfound;//指示被认为是雷的数目

cbitmapbutton m_bitbutton;//控制区的位图按钮

int m_currentlevel;//指示当前游戏的级别

bool m_biscolor;//指示当前是彩色还是单色

cbitmap m_bmbomb[12];//用于存放12个小位图

int m_igameover;//游戏未结束置0,已清除所有的雷置1,被炸死置2。

重载cbombview中oncreate函数创建位图按钮,该位图按钮的两幅位图对应了正常、排雷正确两种状态,当要显示被炸死的状态时应动态销毁该按钮,并重新创建一位图对应正常和被炸死两种状态,将该位图按钮的id号定为id_game_begin,这样一来当点击按钮时便可重新开始游戏,部分代码如下。 -windows扫雷代码

crect rcclient;

getclientrect(rcclient);

crect rect(rcclient.cx/2-8,10,rcclient.cx/2+8,20);

m_button.create("new",bs_defpushbutton|ws_visible|

bs_ownerdraw,rect,this,id_game_begin);

m_button.loadbitmaps(idb_face1, idb_face2);

显示时间的功能相对比较简单,在响应第一个wm_lbuttomdown消息时开启定时器,并记录游戏开始的时间,在wm_time消息响应函数ontimer中获得当前时间,减去游戏开始时的时间,在显示时间的客户区域显示得到的时间差(用数字位图),当游戏结束时(排完全部雷或被炸死)关闭定时器,停止显示。 -windows扫雷代码

wm_lbuttomdown消息响应函数onlbuttomdown是处理用户输入的主要执行者,函数首先判断点中位置是否是雷,是则关闭定时器,销毁原位图按钮,创建一对应正常和被炸死两种状态的新位图按钮,并调用setstate将其设置为pushdown(小人哭的状态),将m_bgameover,置为true标志游戏结束,否则先调用setstate 设置位图按钮为pushdown (小人笑的状态),并在onlbuttomup中设置位图按钮为正常状态,然后调用caculate函数记下周围雷的数目,最后调用invalidate使客户区无效,迫使ondraw函数重绘客户区域,在调用invalidate时不应重画背景,避免闪烁,这样就完成了在雷区按下左键的响应动作。 -windows扫雷代码

wm_rbuttomdown消息响应函数onlbuttomdown将被认为有雷位置的m_ibombnum.findbomb置一,减少左上角的雷记数,然后判断是否真正全部排完了雷,是则结束游戏弹出input对话框,让扫雷的人输入姓名,在响应idok通知码时将其写入注册表,没有全部排完则使客户区无效,迫使ondraw函数重绘客户区域完成在雷区按下右键的动作。 -windows扫雷代码

ondraw函数在每次点击左键或右键时都会被调用重雷区和控制区域,因为点击情况的复杂性和雷属性的多元化导致ondraw函数需要精心设计。

函数caculate计算某个雷周围的雷数,根据前面的分析知道,计算某个雷周围的雷数本身就是一个递归过程,在编制时应注意递归的边界条件,稍不注意会陷入无穷递归而耗尽了系统的资源。

6. 菜单命令的响应是游戏交互的另一个重要方式,下面的九个命令响应函数分别与九个菜单项相对应,用以完成用户的更新和设置命令。

ongamebegin完成初始时间清零,随机布雷,依据颜色指示装载12幅小位图,使雷区无效调用ondraw重绘等工作。其中随机布雷就是多次调用rand(),根据其返回值决定m_bomb[i][j].isbomb的值。 -windows扫雷代码

ongamecustom首先弹出ccustomer对话框,在用户输入设置后响应idok通知码时将用户输入的雷数、行列数分别赋给cview的数据成员m_ibombnum、m_irow、m_icolumn,得到框架窗口的指针,用其调用movewindow将窗口调至所需大小,销毁原位置的位图按钮,并在x轴坐标为新窗口宽1/2减8处,y轴坐标为新窗口顶部加30的位置创建一新按钮。最后调用ongamebegin重新开始游戏。 -windows扫雷代码

ongamejunior、ongamemiddle、ongamesenior三个函数与ongamecustom类似,只不过将分别赋给cview的数据成员m_ibombnum、m_irow、m_icolumn以固定的值,其大小可由编程者自定,笔者定为junior(20,8,8,)、middle(40,13,13)、senior(99,20,25)。 -windows扫雷代码

ongamecolor函数销毁原位图按钮,根据重新装载位图的标志m_iscolor来创建新的位图按钮,将装载12幅单色位图的标志取反,调用ongamebegin重新开始游戏。

ongamesort函数根据当前游戏级别从注册表中读出排名并弹出sort对话框显示结果。到现在为止,一个自己编制的扫雷游戏就基本完成了,将数百行代码编译一下,找出小错误,最后build一遍,run一下,好了,可爱的扫雷游戏就出现在你的面前了。怎么样,自己的劳动成果并不比microsoft的差吧,而且你还可以把小位图画成各种样子,当然你自己要认得出才行了。-windows扫雷代码

扫雷游戏的C代码给个网址或代码也行

用TC自己玩一下吧

/*5.3.4 源程序*/

#include graphics.h

#include stdlib.h

#include dos.h

#define LEFTPRESS 0xff01

#define LEFTCLICK 0xff10

#define LEFTDRAG 0xff19

#define MOUSEMOVE 0xff08

struct

{

int num;/*格子当前处于什么状态,1有雷,0已经显示过数字或者空白格子*/

int roundnum;/*统计格子周围有多少雷*/

int flag;/*右键按下显示红旗的标志,0没有红旗标志,1有红旗标志*/

}Mine[10][10];

int gameAGAIN=0;/*是否重来的变量*/

int gamePLAY=0;/*是否是第一次玩游戏的标志*/

int mineNUM;/*统计处理过的格子数*/

char randmineNUM[3];/*显示数字的字符串*/

int Keystate;

int MouseExist;

int MouseButton;

int MouseX;

int MouseY;

void Init(void);/*图形驱动*/

void MouseOn(void);/*鼠标光标显示*/

void MouseOff(void);/*鼠标光标隐藏*/

void MouseSetXY(int,int);/*设置当前位置*/

int LeftPress(void);/*左键按下*/

int RightPress(void);/*鼠标右键按下*/

void MouseGetXY(void);/*得到当前位置*/

void Control(void);/*游戏开始,重新,关闭*/

void GameBegain(void);/*游戏开始画面*/

void DrawSmile(void);/*画笑脸*/

void DrawRedflag(int,int);/*显示红旗*/

void DrawEmpty(int,int,int,int);/*两种空格子的显示*/

void GameOver(void);/*游戏结束*/

void GameWin(void);/*显示胜利*/

int MineStatistics(int,int);/*统计每个格子周围的雷数*/

int ShowWhite(int,int);/*显示无雷区的空白部分*/

void GamePlay(void);/*游戏过程*/

void Close(void);/*图形关闭*/

void main(void)

{

Init();

Control();

Close();

}

void Init(void)/*图形开始*/

{

int gd=DETECT,gm;

initgraph(gd,gm,"c:\\tc");

}

void Close(void)/*图形关闭*/

{

closegraph();

}

void MouseOn(void)/*鼠标光标显示*/

{

_AX=0x01;

geninterrupt(0x33);

}

void MouseOff(void)/*鼠标光标隐藏*/

{

_AX=0x02;

geninterrupt(0x33);

}

void MouseSetXY(int x,int y)/*设置当前位置*/

{

_CX=x;

_DX=y;

_AX=0x04;

geninterrupt(0x33);

}

int LeftPress(void)/*鼠标左键按下*/

{

_AX=0x03;

geninterrupt(0x33);

return(_BX1);

}

int RightPress(void)/*鼠标右键按下*/

{

_AX=0x03;

geninterrupt(0x33);

return(_BX2);

}

void MouseGetXY(void)/*得到当前位置*/

{

_AX=0x03;

geninterrupt(0x33);

MouseX=_CX;

MouseY=_DX;

}

void Control(void)/*游戏开始,重新,关闭*/

{

int gameFLAG=1;/*游戏失败后判断是否重新开始的标志*/

while(1)

{

if(gameFLAG)/*游戏失败后没判断出重新开始或者退出游戏的话就继续判断*/

{

GameBegain(); /*游戏初始画面*/

GamePlay();/*具体游戏*/

if(gameAGAIN==1)/*游戏中重新开始*/

{

gameAGAIN=0;

continue;

}

}

MouseOn();

gameFLAG=0;

if(LeftPress())/*判断是否重新开始*/

{

MouseGetXY();

if(MouseX280MouseX300MouseY65MouseY85)

{

gameFLAG=1;

continue;

}

}

if(kbhit())/*判断是否按键退出*/

break;

}

MouseOff();

}

void DrawSmile(void)/*画笑脸*/

{

setfillstyle(SOLID_FILL,YELLOW);

fillellipse(290,75,10,10);

setcolor(YELLOW);

setfillstyle(SOLID_FILL,BLACK);/*眼睛*/

fillellipse(285,75,2,2);

fillellipse(295,75,2,2);

setcolor(BLACK);/*嘴巴*/

bar(287,80,293,81);

}

void DrawRedflag(int i,int j)/*显示红旗*/

{

setcolor(7);

setfillstyle(SOLID_FILL,RED);

bar(198+j*20,95+i*20,198+j*20+5,95+i*20+5);

setcolor(BLACK);

line(198+j*20,95+i*20,198+j*20,95+i*20+10);

}

void DrawEmpty(int i,int j,int mode,int color)/*两种空格子的显示*/

{

setcolor(color);

setfillstyle(SOLID_FILL,color);

if(mode==0)/*没有单击过的大格子*/

bar(200+j*20-8,100+i*20-8,200+j*20+8,100+i*20+8);

else

if(mode==1)/*单击过后显示空白的小格子*/

bar(200+j*20-7,100+i*20-7,200+j*20+7,100+i*20+7);

}

void GameBegain(void)/*游戏开始画面*/

{

int i,j;

cleardevice();

if(gamePLAY!=1)

{

MouseSetXY(290,70); /*鼠标一开始的位置,并作为它的初始坐标*/

MouseX=290;

MouseY=70;

}

gamePLAY=1;/*下次按重新开始的话鼠标不重新初始化*/

mineNUM=0;

setfillstyle(SOLID_FILL,7);

bar(190,60,390,290);

for(i=0;i10;i++)/*画格子*/

for(j=0;j10;j++)

DrawEmpty(i,j,0,8);

setcolor(7);

DrawSmile();/*画脸*/

randomize();

for(i=0;i10;i++)/*100个格子随机赋值有没有地雷*/

for(j=0;j10;j++)

{

Mine[i][j].num=random(8);/*如果随机数的结果是1表示这个格子有地雷*/

if(Mine[i][j].num==1)

mineNUM++;/*现有雷数加1*/

else

Mine[i][j].num=2;

Mine[i][j].flag=0;/*表示没红旗标志*/

}

sprintf(randmineNUM,"%d",mineNUM); /*显示这次总共有多少雷数*/

setcolor(1);

settextstyle(0,0,2);

outtextxy(210,70,randmineNUM);

mineNUM=100-mineNUM;/*变量取空白格数量*/

MouseOn();

}

void GameOver(void)/*游戏结束画面*/

{

int i,j;

setcolor(0);

for(i=0;i10;i++)

for(j=0;j10;j++)

if(Mine[i][j].num==1)/*显示所有的地雷*/

{

DrawEmpty(i,j,0,RED);

setfillstyle(SOLID_FILL,BLACK);

fillellipse(200+j*20,100+i*20,7,7);

}

}

void GameWin(void)/*显示胜利*/

{

setcolor(11);

settextstyle(0,0,2);

outtextxy(230,30,"YOU WIN!");

}

int MineStatistics(int i,int j)/*统计每个格子周围的雷数*/

{

int nNUM=0;

if(i==0j==0)/*左上角格子的统计*/

{

if(Mine[0][1].num==1)

nNUM++;

if(Mine[1][0].num==1)

nNUM++;

if(Mine[1][1].num==1)

nNUM++;

}

else

if(i==0j==9)/*右上角格子的统计*/

{

if(Mine[0][8].num==1)

nNUM++;

if(Mine[1][9].num==1)

nNUM++;

if(Mine[1][8].num==1)

nNUM++;

}

else

if(i==9j==0)/*左下角格子的统计*/

{

if(Mine[8][0].num==1)

nNUM++;

if(Mine[9][1].num==1)

nNUM++;

if(Mine[8][1].num==1)

nNUM++;

}

else

if(i==9j==9)/*右下角格子的统计*/

{

if(Mine[9][8].num==1)

nNUM++;

if(Mine[8][9].num==1)

nNUM++;

if(Mine[8][8].num==1)

nNUM++;

}

else if(j==0)/*左边第一列格子的统计*/

{

if(Mine[i][j+1].num==1)

nNUM++;

if(Mine[i+1][j].num==1)

nNUM++;

if(Mine[i-1][j].num==1)

nNUM++;

if(Mine[i-1][j+1].num==1)

nNUM++;

if(Mine[i+1][j+1].num==1)

nNUM++;

}

else if(j==9)/*右边第一列格子的统计*/

{

if(Mine[i][j-1].num==1)

nNUM++;

if(Mine[i+1][j].num==1)

nNUM++;

if(Mine[i-1][j].num==1)

nNUM++;

if(Mine[i-1][j-1].num==1)

nNUM++;

if(Mine[i+1][j-1].num==1)

nNUM++;

}

else if(i==0)/*第一行格子的统计*/

{

if(Mine[i+1][j].num==1)

nNUM++;

if(Mine[i][j-1].num==1)

nNUM++;

if(Mine[i][j+1].num==1)

nNUM++;

if(Mine[i+1][j-1].num==1)

nNUM++;

if(Mine[i+1][j+1].num==1)

nNUM++;

}

else if(i==9)/*最后一行格子的统计*/

{

if(Mine[i-1][j].num==1)

nNUM++;

if(Mine[i][j-1].num==1)

nNUM++;

if(Mine[i][j+1].num==1)

nNUM++;

if(Mine[i-1][j-1].num==1)

nNUM++;

if(Mine[i-1][j+1].num==1)

nNUM++;

}

else/*普通格子的统计*/

{

if(Mine[i-1][j].num==1)

nNUM++;

if(Mine[i-1][j+1].num==1)

nNUM++;

if(Mine[i][j+1].num==1)

nNUM++;

if(Mine[i+1][j+1].num==1)

nNUM++;

if(Mine[i+1][j].num==1)

nNUM++;

if(Mine[i+1][j-1].num==1)

nNUM++;

if(Mine[i][j-1].num==1)

nNUM++;

if(Mine[i-1][j-1].num==1)

nNUM++;

}

return(nNUM);/*把格子周围一共有多少雷数的统计结果返回*/

}

int ShowWhite(int i,int j)/*显示无雷区的空白部分*/

{

if(Mine[i][j].flag==1||Mine[i][j].num==0)/*如果有红旗或该格处理过就不对该格进行任何判断*/

return;

mineNUM--;/*显示过数字或者空格的格子就表示多处理了一个格子,当所有格子都处理过了表示胜利*/

if(Mine[i][j].roundnum==0Mine[i][j].num!=1)/*显示空格*/

{

DrawEmpty(i,j,1,7);

Mine[i][j].num=0;

}

else

if(Mine[i][j].roundnum!=0)/*输出雷数*/

{

DrawEmpty(i,j,0,8);

sprintf(randmineNUM,"%d",Mine[i][j].roundnum);

setcolor(RED);

outtextxy(195+j*20,95+i*20,randmineNUM);

Mine[i][j].num=0;/*已经输出雷数的格子用0表示已经用过这个格子*/

return ;

}

/*8个方向递归显示所有的空白格子*/

if(i!=0Mine[i-1][j].num!=1)

ShowWhite(i-1,j);

if(i!=0j!=9Mine[i-1][j+1].num!=1)

ShowWhite(i-1,j+1);

if(j!=9Mine[i][j+1].num!=1)

ShowWhite(i,j+1);

if(j!=9i!=9Mine[i+1][j+1].num!=1)

ShowWhite(i+1,j+1);

if(i!=9Mine[i+1][j].num!=1)

ShowWhite(i+1,j);

if(i!=9j!=0Mine[i+1][j-1].num!=1)

ShowWhite(i+1,j-1);

if(j!=0Mine[i][j-1].num!=1)

ShowWhite(i,j-1);

if(i!=0j!=0Mine[i-1][j-1].num!=1)

ShowWhite(i-1,j-1);

}

void GamePlay(void)/*游戏过程*/

{

int i,j,Num;/*Num用来接收统计函数返回一个格子周围有多少地雷*/

for(i=0;i10;i++)

for(j=0;j10;j++)

Mine[i][j].roundnum=MineStatistics(i,j);/*统计每个格子周围有多少地雷*/

while(!kbhit())

{

if(LeftPress())/*鼠标左键盘按下*/

{

MouseGetXY();

if(MouseX280MouseX300MouseY65MouseY85)/*重新来*/

{

MouseOff();

gameAGAIN=1;

break;

}

if(MouseX190MouseX390MouseY90MouseY290)/*当前鼠标位置在格子范围内*/

{

j=(MouseX-190)/20;/*x坐标*/

i=(MouseY-90)/20;/*y坐标*/

if(Mine[i][j].flag==1)/*如果格子有红旗则左键无效*/

continue;

if(Mine[i][j].num!=0)/*如果格子没有处理过*/

{

if(Mine[i][j].num==1)/*鼠标按下的格子是地雷*/

{

MouseOff();

GameOver();/*游戏失败*/

break;

}

else/*鼠标按下的格子不是地雷*/

{

MouseOff();

Num=MineStatistics(i,j);

if(Num==0)/*周围没地雷就用递归算法来显示空白格子*/

ShowWhite(i,j);

else/*按下格子周围有地雷*/

{

sprintf(randmineNUM,"%d",Num);/*输出当前格子周围的雷数*/

setcolor(RED);

outtextxy(195+j*20,95+i*20,randmineNUM);

mineNUM--;

}

MouseOn();

Mine[i][j].num=0;/*点过的格子周围雷数的数字变为0表示这个格子已经用过*/

if(mineNUM1)/*胜利了*/

{

GameWin();

break;

}

}

}

}

}

if(RightPress())/*鼠标右键键盘按下*/

{

MouseGetXY();

if(MouseX190MouseX390MouseY90MouseY290)/*当前鼠标位置在格子范围内*/

{

j=(MouseX-190)/20;/*x坐标*/

i=(MouseY-90)/20;/*y坐标*/

MouseOff();

if(Mine[i][j].flag==0Mine[i][j].num!=0)/*本来没红旗现在显示红旗*/

{

DrawRedflag(i,j);

Mine[i][j].flag=1;

}

else

if(Mine[i][j].flag==1)/*有红旗标志再按右键就红旗消失*/

{

DrawEmpty(i,j,0,8);

Mine[i][j].flag=0;

}

}

MouseOn();

sleep(1);

}

}

}