




免费预览已结束,剩余5页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
/ 扫雷游戏在C+中编译即可 作者 范训占 QQ:363299541#include #include #include #include #include using namespace std; #define N 48/地图的行大小 ,最好不要超过165#define M 20/地图的列大小,不要超过45#define T 100/需要布雷总数 HANDLE hout=GetStdHandle(STD_OUTPUT_HANDLE);HANDLE hin=GetStdHandle(STD_INPUT_HANDLE);SYSTEMTIME st1,st2; INPUT_RECORD mouse;DWORD state=0,res;COORD pos=0,0;char leiNN;unsigned int num=0,TT=0;/num是用来统计扫过的数组数,TT用来统计标志雷的数intcaiNN;int doubtNN;int seek2=0,0;void super()/用来设置地图的大小hout=GetStdHandle(STD_OUTPUT_HANDLE);COORD size=N+1,M+2;SetConsoleScreenBufferSize(hout,size);SMALL_RECT rc = 0,0, N+1, M+2;/4个数字的大小分别指的是底部,左边,右边,顶部SetConsoleWindowInfo(hout,true,&rc); void gotoxy(int x, int y)COORD position;CONSOLE_CURSOR_INFO cursor;cursor.bVisible=false;/为了不显示光标cursor.dwSize=10;/光标显示的百分度position.X=x;position.Y=y;SetConsoleCursorInfo(hout,&cursor);SetConsoleCursorPosition (hout, position);/CloseHandle(hout); void disptime() GetLocalTime(&st2);/获取时时系统时间 CONSOLE_SCREEN_BUFFER_INFO info; GetConsoleScreenBufferInfo(hout,&info); gotoxy(38,info.srWindow.Bottom); printf( 已用时间: %02d:%02d:%02d, st2.wHour-st1.wHour, st2.wMinute-st1.wMinute, st2.wSecond-st1.wSecond);/输出运行时间差时 void menu()/主菜单函数 SetConsoleTitle(扫雷游戏); /设置控制台窗口标题 gotoxy(0,0);coutendl;cout欢迎来玩扫雷游戏endl;cout*游戏说明*endl;cout用鼠标的左键扫雷,用鼠标的右键标记雷,标志出雷后同时按下左右键周围扫雷endl;cout 胜利的条件是把所有的*的格子打开,并且不能遇到雷endl;cout 游戏过程中按下鼠标中的滚动键退出游戏endl;cout地图大小:N*Mendl;cout 地雷总数:Tendl;cout*endl;cout按任意键开始游戏endl;getch(); void dispmine()/用于显示数组中的雷 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |FOREGROUND_RED | FOREGROUND_BLUE);/用紫色显示雷 for (int iy=0;iyN;iy+) for (int jy=0;jyM;jy+) gotoxy(iy,jy);/到指点位置输出数组中的值 if(leiiyjy=X) coutX; void clearscreen()/用填充原理来清屏 CONSOLE_SCREEN_BUFFER_INFO info; GetConsoleScreenBufferInfo(hout,&info);/获得窗口信息 COORD home = 0 , 0; unsigned long size = info.dwSize.X * info.dwSize.Y; FillConsoleOutputAttribute(hout,info.wAttributes,size,home,NULL);/整个屏幕填充后的属性与填充前的属性相同 FillConsoleOutputCharacter(hout, ,size,home,NULL);/整个屏幕填充空字符 void init()/对整个棋盘进行初始化 num=0; TT=T; clearscreen();GetLocalTime(&st1);/获得初始化时的系统时间seek0=0;seek1=0;if(N*MT*3) /为了完善雷与地图的比例,当地图放不下雷,退出游戏cout雷的放置不合理,游戏无法运行请退出后重新配制endl;exit(0);for (int i=0;iN;i+) for (int j=0;jM;j+)leiij=0;caiij=0;doubtij=0;/用于右键排疑雷srand( (unsigned)time( NULL ); /srand()函数产生一个以当前时间开始的随机种子应该放在for等循环语句前面 /不然要很长时间等待for(int iv=0;ivT;)/T为需要布的雷数int x=rand()%(N);/用来随机布雷int y=rand()%(M);if(leixy=X);elseleixy=X;iv+; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN);/初始化用白色输出到屏幕上for (int iy=0;iyN;iy+)for (int jy=0;jyM;jy+)gotoxy(iy,jy);/到指点位置输出数组中的值cout*;/coutleiiyjy; int win()/胜利的条件是未扫的数组数等于雷数if(num=N*M-T&TT=0)clearscreen();gotoxy(0,0);cout你赢啦,好厉害哦!按回车键继续开始游戏,否则退出游戏;char m=getch();if(m=13)return 1;elseexit(0);return 0;int count(int row,int col)int temp=0;for(int i=-1;i2;i+)for(int j=-1;j=0 & i+row = 0 & j + col M )temp+;return temp; int sweep(int row,int col) if(rowN-1|colM-1|cairowcol=1|leirowcol=X | doubtrowcol=1)/不在格子内,或遇到雷,标过雷的return 1; else/满足条件的才继续 gotoxy(row,col);switch(count(row,col)case 0:/调用递归扫雷cout ;cairowcol=1;num+;for(int i=-1;i=1;i+)for(int j=-1;j=1;j+)sweep(row+i,col+j);break; case 1:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN );/1显示黄色coutcount(row,col);/输出此格子周围的雷数cairowcol=1;/标记表示这个格子已经被扫过num+;/统计共扫的格子数break;case 2:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN | FOREGROUND_INTENSITY);/2显示绿色coutcount(row,col);cairowcol=1;num+;break;case 3:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED | FOREGROUND_INTENSITY);/3显示红色coutcount(row,col);cairowcol=1;num+;break;default:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |FOREGROUND_RED | FOREGROUND_BLUE);/其它显示紫色coutcount(row,col);cairowcol=1;num+;break; return 1; int sweepsurround(int row, int col)int temp=0;for(int i = -1; i 2 ; i+)for(int j = -1; j =0 & row+i=0 & col+jM)temp+;if(temp=count(row, col)/标记的雷数与真实的雷数相等for(int iv = -1; iv 2 ; iv+)for(int jv = -1; jv 2 ; jv+)if(leirow+ivcol+jv=X&doubtrow+ivcol+jv = 0)/是雷却没标记,就直接输出所有的雷dispmine();gotoxy(0,M);cout你踩到雷了,按回车键继续游戏,否则退出游戏=0 & row+iv=0 & col+jvM)/格子内,未踩,无雷gotoxy(row+iv,col+jv);switch(count(row+iv,col+jv)case 0:/调用递归扫雷cout ;cairow+ivcol+jv=1;num+;for(int im=-1;im2;im+)for(int jm=-1;jm2;jm+)sweep(row+iv+im,col+jv+jm);break; case 1:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN );/1显示黄色coutcount(row+iv,col+jv);/输出此格子周围的雷数cairow+ivcol+jv=1;/标记表示这个格子已经被扫过num+;/统计共扫的格子数break;case 2:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN | FOREGROUND_INTENSITY);/2显示绿色coutcount(row+iv,col+jv);cairow+ivcol+jv=1;num+;break;case 3:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED | FOREGROUND_INTENSITY);/3显示红色coutcount(row+iv,col+jv);cairow+ivcol+jv=1;num+;break;default:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |FOREGROUND_RED | FOREGROUND_BLUE);/其它显示紫色coutcount(row+iv,col+jv);cairow+ivcol+jv=1;num+;break;return 1;void DispMousePos(COORD pos)/ 在窗口底部显示鼠标位置CONSOLE_SCREEN_BUFFER_INFO bInfo;GetConsoleScreenBufferInfo(hout,&bInfo);COORD home=0,bInfo.srWindow.Bottom;SetConsoleCursorPosition(hout,home);SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN);/用白色printf(X = %3d, Y = %3d,雷的个数 = %4d,pos.X, pos.Y,TT);disptime();void shift()ReadConsoleInput(hin,&mouse,1,&res);if(mouse.EventType=MOUSE_EVENT) if(mouse.Event.MouseEvent.dwEventFlags=FROM_LEFT_2ND_BUTTON_PRESSED) clearscreen();gotoxy(0,0); cout游戏结束= 0 & pos.X = 0 & pos. Y M)if(mouse.Event.MouseEvent.dwButtonState=FROM_LEFT_1ST_BUTTON_PRESSED & doubtpos.Xpos.Y=0)/表示未标过雷if(leipos.Xpos.Y=X)dispmine();gotoxy(0,M);cout你踩到雷了,按回车键继续游戏,否则退出游戏endl;char r=getch();if(r=13) clearscreen();init();elseexit(0);elsesweep(pos.X,pos.Y);if(mouse.Event.MouseEvent.dwButtonState=RIGHTMOST_BUTTON_PRESSED & F
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 房产经纪人劳动合同书
- 2025届河南省洛阳市等2地高三下学期三模化学试题(含答案)
- 幸福新疆娃课件
- 小龙虾水彩课件教学
- 输液泵微量泵使用课件
- 小鸭子学走路的课件
- 民间个人医疗借款合同模板(含保险配套与还款安排)
- 个人鱼塘养殖承包与养殖环境监测合同
- 模块化橱柜设计研发生产销售合同
- 高端制造企业技术秘密保护及竞业限制合同
- AII6000B呼吸机的使用
- 感冒的中医护理课件
- 20G361预制混凝土方桩
- 中医运动养生教学课件
- 医学院研究生招生宣传
- 工业锅炉司炉G1理论考试题库(附答案)
- 《光纤激光器的工作原理》课件
- 2025中煤电力有限公司总部及所属企业招聘笔试参考题库附带答案详解
- GB/T 25820-2025包装用钢带
- 线描创意画课件
- 中国成人患者围手术期液体治疗临床实践指南(2025版)解读课件
评论
0/150
提交评论