前言
windows一直有自带小游戏,其中一个便是扫雷。扫雷是一个十分经典的游戏,学会了这个代码怎么写,你也会做一些题了——比如连通块,片区面积,等等。
关于扫雷
作者的扫雷,共
1095行,
28619个字符,
3个函数,
内存2.9MB。
测试环境:
Windows7,
c++编译器5.11
创作此代码历经3个月,104次测试,少量bug,暂时没找到问题。#不影响使用#
代码分解
(完整代码放在篇尾,如果实在复制地恼火,点击下面链接免费下载cpp文件)
(文件正在审核中)
文件的开头
#include<conio.h>
#include<stdlib.h>
#include<windows.h>
#include<bits/stdc++.h>
using namespace std;
int again=0,hang,lie,lei,jsq,sjhang,sjlie,cj[40][40],i,j,k,ms=0,sum=0,lose=0;
char tmp[40][40],play[40][40],input;
函数3个,分别指:
空格查找模块
修改模式模块
主函数。
void space(int i,int j);
void moshi();
int main()
前面是菜单和初始化:
int main()
{
HANDLE consolehwnd;//创建句柄
consolehwnd=GetStdHandle(STD_OUTPUT_HANDLE);//实例化句柄
srand(time(NULL));
while(again==0)
{
system("cls");//20
SetConsoleTextAttribute(consolehwnd,FOREGROUND_INTENSITY|FOREGROUND_BLUE);
cout<<"welcome to minesweeper!\n初级:10X10,10个雷:1\n中级:16X16,40个雷:2\n高级:16X30,99个雷:3\n自定义:其它数字\n";
cin>>jsq;
if(jsq==1)hang=10,lie=10,lei=10;
else if(jsq==2)hang=16,lie=16,lei=40;
else if(jsq==3)hang=16,lie=30,lei=99;
else
{
system("cls");
cout<<"行数:";
cin>>hang;
cout<<"列数:";
cin>>lie;
cout<<"雷数:";
cin>>lei;
if(hang<9)hang=9;
if(hang>24)hang=24;
if(lie<9)lie=9;
if(lie>30)lie=30;
if(lei>688)lei=688;
if(lei<10)lei=10;
if(lei<hang*lie/72)lei=hang*lie/72;
if(lei>hang*lie*9/10)lei=hang*lie*9/10;//变量的准备
}
cout<<"开启开局作弊?开:1,关:0\n";
cin>>jsq;
cout<<"------------------------------\n";
for(i=0; i<hang+1; ++i)//22
{
for(j=0; j<lie+1; ++j)
{
tmp[i][j]='0';
}
}//初始化地图为0
for(i=0; i<lei; ++i)//39
{
sjhang=rand()%hang+1,sjlie=rand()%lie+1;
while(tmp[sjhang][sjlie]=='*')
{
sjhang=rand()%hang+1,sjlie=rand()%lie+1;
}
tmp[sjhang][sjlie]='*';
}//随机设置雷
for(i=1; i<=hang; ++i) //54
{
for(j=1; j<=lie; ++j)
{
if(tmp[i ][j ]=='*')continue;
if(tmp[i-1][j-1]=='*')tmp[i][j]++;
if(tmp[i-1][j ]=='*')tmp[i][j]++;
if(tmp[i-1][j+1]=='*')tmp[i][j]++;
if(tmp[i ][j+1]=='*')tmp[i][j]++;
if(tmp[i+1][j+1]=='*')tmp[i][j]++;
if(tmp[i+1][j ]=='*')tmp[i][j]++;
if(tmp[i+1][j-1]=='*')tmp[i][j]++;
if(tmp[i ][j-1]=='*')tmp[i][j]++;
}
}//数字
for(i=1; i<=hang; ++i) //69
{
for(j=1; j<=lie; ++j)
{
if(tmp[i][j]=='0')
{
tmp[i][j]=' ';
}
}
}//空格
for(i=1; i<=hang; ++i)
{
for(j=1; j<=lie; ++j)
{
play[i][j]=(char)30;
}
}
//begin
SetConsoleTextAttribute(consolehwnd,FOREGROUND_INTENSITY|FOREGROUND_GREEN);
cout<<"正在准备棋盘.";
Sleep(1000/3);
cout<<".";
Sleep(1000/3);
cout<<".";
Sleep(1000/3);
cout<<".";
Sleep(1000/3);
cout<<".";
Sleep(1000/3);
cout<<".";
Sleep(1000/3);
if(jsq==1)
{
cout<<"\n正在进行作弊.";
Sleep(1000/3);
cout<<".";
Sleep(1000/3);
cout<<".";
Sleep(1000/3);
cout<<".";
Sleep(1000/3);
cout<<".";
Sleep(1000/3);
cout<<".";
Sleep(1000/3);
sjhang=rand()%hang+1,sjlie=rand()%lie+1;
jsq=0;
while(tmp[sjhang][sjlie]!=' '&&jsq<hang*lie)
{
sjhang=rand()%hang+1,sjlie=rand()%lie+1;
jsq++;
}
while(tmp[sjhang][sjlie]=='*')
{
sjhang=rand()%hang+1,sjlie=rand()%lie+1;
jsq++;
}
play[sjhang][sjlie]=tmp[sjhang][sjlie];
if(jsq<hang*lie||jsq==hang*lie)
space(sjhang,sjlie);
}
100行。
判断是否胜利和输入板块:
while(jsq!=lei)
{
system("cls");
jsq=0,sum=0;
for(i=0; i<=hang; ++i)//484
{
if(i==0)
{
SetConsoleTextAttribute(consolehwnd,FOREGROUND_INTENSITY|FOREGROUND_RED);
cout<<' ';
for(k=0; k<=lie; ++k)
{
if(k<10)cout<<k<<' ';
else cout<<k;
}
cout<<'\n';
continue;
}
for(j=0; j<=lie; ++j)
{
if(j==0)
{
SetConsoleTextAttribute(consolehwnd,FOREGROUND_INTENSITY|FOREGROUND_RED);
cout<<setw(2)<<i<<' ';
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
continue;
}
if(play[i][j]==(char)30||play[i][j]==(char)19)jsq++;
if(play[i][j]==(char)30||play[i][j]==' ')SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
if(play[i][j]==(char)19)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED);
if(play[i][j]=='1')SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_BLUE);
if(play[i][j]=='2')SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN);
if(play[i][j]=='3')SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
if(play[i][j]=='4')SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_BLUE);
if(play[i][j]=='5')SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED|FOREGROUND_BLUE);
if(play[i][j]=='6')SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_BLUE);
if(play[i][j]=='7')SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_BLUE);
if(play[i][j]=='8')SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_BLUE);
cout<<play[i][j]<<' ';
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
}
cout<<'\n';
}//输出
if(jsq==lei)//501
{
Sleep(1000);
system("cls");
for(i=1; i<=hang; ++i)
{
for(j=1; j<=lie; ++j)
{
if(tmp[i][j]=='*')
{
SetConsoleTextAttribute(consolehwnd,FOREGROUND_INTENSITY|FOREGROUND_RED);
play[i][j]='*';
}
else
{
if(play[i][j]==(char)30||play[i][j]==' ')SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
if(play[i][j]==(char)19)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED);
if(play[i][j]=='1')SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_BLUE);
if(play[i][j]=='2')SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN);
if(play[i][j]=='3')SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
if(play[i][j]=='4')SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_BLUE);
if(play[i][j]=='5')SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED|FOREGROUND_BLUE);
if(play[i][j]=='6')SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_BLUE);
if(play[i][j]=='7')SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_BLUE);
if(play[i][j]=='8')SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_BLUE);
}
cout<<play[i][j]<<' ';
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
}
cout<<'\n';
}
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
cout<<"You win.\nagain:0\n";
cin>>again;
continue;
}//胜利条件
sjhang=0,sjlie=0,ms=0,lose=0,sum=0;
cout<<"当前模式:开方块模式\n";
cout<<"行数:(切换模式请按A。)";
while(sjhang%10==0)
{
input=getch();
if(input=='A'||input=='a')
{
ms=1;
moshi();
break;
}
if(input=='/')
{
if(sjhang!=0)
{
cout<<'\n';
break;
}
else continue;
}
if(input=='0')
{
sjhang+=10;
cout<<"+10";
}
if(input=='1')
{
sjhang+=1;
cout<<"+1\n";
}
if(input=='2')
{
sjhang+=2;
cout<<"+2\n";
}
if(input=='3')
{
sjhang+=3;
cout<<"+3\n";
}
if(input=='4')
{
sjhang+=4;
cout<<"+4\n";
}
if(input=='5')
{
sjhang+=5;
cout<<"+5\n";
}
if(input=='6')
{
sjhang+=6;
cout<<"+6\n";
}
if(input=='7')
{
sjhang+=7;
cout<<"+7\n";
}
if(input=='8')
{
sjhang+=8;
cout<<"+8\n";
}
if(input=='9')
{
sjhang+=9;
cout<<"+9\n";
}
}
if(ms==1)
continue;
while(sjhang>hang)
{
cout<<"无效的输入!请重新输入!\n行数:";
sjhang=0;
while(sjhang%10==0)
{
input=getch();
if(input=='/')
{
if(sjhang!=0)
{
cout<<'\n';
break;
}
else continue;
}
if(input=='0')
{
sjhang+=10;
cout<<"+10";
}
if(input=='1')
{
sjhang+=1;
cout<<"+1\n";
}
if(input=='2')
{
sjhang+=2;
cout<<"+2\n";
}
if(input=='3')
{
sjhang+=3;
cout<<"+3\n";
}
if(input=='4')
{
sjhang+=4;
cout<<"+4\n";
}
if(input=='5')
{
sjhang+=5;
cout<<"+5\n";
}
if(input=='6')
{
sjhang+=6;
cout<<"+6\n";
}
if(input=='7')
{
sjhang+=7;
cout<<"+7\n";
}
if(input=='8')
{
sjhang+=8;
cout<<"+8\n";
}
if(input=='9')
{
sjhang+=9;
cout<<"+9\n";
}
}
}
cout<<"列数:";
while(sjlie%10==0)
{
input=getch();
if(input=='/')
{
if(sjlie!=0)
{
cout<<'\n';
break;
}
else continue;
}
if(input=='0')
{
sjlie+=10;
cout<<"+10";
}
if(input=='1')
{
sjlie+=1;
cout<<"+1\n";
}
if(input=='2')
{
sjlie+=2;
cout<<"+2\n";
}
if(input=='3')
{
sjlie+=3;
cout<<"+3\n";
}
if(input=='4')
{
sjlie+=4;
cout<<"+4\n";
}
if(input=='5')
{
sjlie+=5;
cout<<"+5\n";
}
if(input=='6')
{
sjlie+=6;
cout<<"+6\n";
}
if(input=='7')
{
sjlie+=7;
cout<<"+7\n";
}
if(input=='8')
{
sjlie+=8;
cout<<"+8\n";
}
if(input=='9')
{
sjlie+=9;
cout<<"+9\n";
}
}
while(sjlie>lie)
{
cout<<"无效的输入!请重新输入!\n列数:";
sjlie=0;
while(sjlie%10==0)
{
input=getch();
if(input=='/')
{
if(sjlie!=0)
{
cout<<'\n';
break;
}
else continue;
}
if(input=='0')
{
sjlie+=10;
cout<<"+10";
}
if(input=='1')
{
sjlie+=1;
cout<<"+1\n";
}
if(input=='2')
{
sjlie+=2;
cout<<"+2\n";
}
if(input=='3')