初级天翼
经过我这个晚上1.5个小时的奋斗,我的扫雷更新了!!!
输入时可能会有点麻烦,但是抱歉,我目前没有更好的解决方案。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cstdlib>
#include <cmath>
#include <ctime>
#include <bits/stdc++.h>
#include <windows.h>
#include <fstream>
#include <iomanip>
#define INF 0x3f3f3f3f
using namespace std;
const int dir[8][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};
int mmap[40][40],win,lose;
bool vis[40][40],fflag[40][40];
bool pd(int m,int n){
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(vis[i][j]==0&&mmap[i][j]!=INF)
return false;
}
}
return true;
}
bool valid(int x,int y,int m,int n){
if(x>=1&&x<=m&&y>=1&&y<=n)
return true;
return false;
}
void fankai(int x,int y,int m,int n){
for(int i=0;i<8;i++){
int nx=x+dir[i][0],ny=y+dir[i][1];
if(valid(nx,ny,m,n)&&vis[nx][ny]==0){
if(mmap[nx][ny]!=INF)
vis[nx][ny]=true;
if(mmap[nx][ny]==0)
fankai(nx,ny,m,n);
}
}
}
bool saolei(int m,int n){
srand(time(NULL));
memset(mmap,0,sizeof(mmap));
memset(vis,0,sizeof(vis));
memset(fflag,0,sizeof(fflag));
system("cls");
int cnt_b=m*(n+1)/10+1;
for(int i=1;i<=cnt_b;i++){
int x=rand()%m+1,y=rand()%n+1;
mmap[x][y]=INF;
}
cnt_b=0;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(mmap[i][j]==INF){
cnt_b++;
}
}
}
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(mmap[i][j]!=INF){
for(int k=0;k<8;k++){
int nx=i+dir[k][0],ny=j+dir[k][1];
if(valid(nx,ny,m,n)&&mmap[nx][ny]==INF){
mmap[i][j]++;
}
}
}
}
}
while(!pd(m,n)){
system("cls");
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(fflag[i][j]){
cout<<"F ";
}
else if(vis[i][j]&&mmap[i][j]!=INF){
cout<<mmap[i][j]<<" ";
}
else{
cout<<"? ";
}
}
cout<<left<<setw(2)<<i<<endl;
}
for(int j=1;j<=n;j++)
cout<<left<<setw(2)<<j;
cout<<" ←列"<<endl;
cout<<right<<setw(n*2+2)<<" ↑"<<endl;
cout<<right<<setw(n*2+2)<<" 行"<<endl;
Sleep(1000);
cout<<"输入说明:\n";
cout<<"先输入两个数,空格隔开,表示你要操作的坐标。\n";
cout<<"接着,输入一个数,表示操作类型:\n\t1表示翻开,\n\t2表示插旗,\n\t3表示快捷翻开周围的格子(前提是正确插旗)\n\t4表示撤销插旗\n\n\n";
int xa,xb,caozuo;
cin>>xa>>xb>>caozuo;
if(!valid(xa,xb,m,n)||(caozuo<1||caozuo>4)){
cout<<"输入错误,请重新输入!";
Sleep(1000);
system("cls");
continue;
}
if(caozuo==1){
if(mmap[xa][xb]==INF){
system("cls");
cout<<"你踩到地雷了!!!扫雷失败!!!\n这是答案:\n";
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(mmap[i][j]==INF){
cout<<"* ";
}
else{
cout<<mmap[i][j]<<" ";
}
}
cout<<endl;
}
system("pause");
return false;
}
vis[xa][xb]=true;
if(mmap[xa][xb]==0)
fankai(xa,xb,m,n);
}
if(caozuo==2){
if(vis[xa][xb]){
cout<<"操作失败!";
Sleep(1000);
system("cls");
continue;
}
fflag[xa][xb]=true;
}
if(caozuo==3){
if(!vis[xa][xb]){
cout<<"操作失败!";
Sleep(1000);
system("cls");
continue;
}
int cnt=0,tmp_flag=false;
for(int i=0;i<8;i++){
int nx=xa+dir[i][0],ny=xb+dir[i][1];
if(valid(nx,ny,m,n)&&fflag[nx][ny]){
cnt++;
if(mmap[nx][ny]!=INF){
tmp_flag=true;
}
}
}
if(cnt!=mmap[xa][xb]){
cout<<"操作格子周围的雷数不对,请注意。";
Sleep(1000);
system("cls");
continue;
}
else if(tmp_flag){
system("cls");
cout<<"插旗错误!!!扫雷失败!!!\n这是答案:\n";
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(mmap[i][j]==INF){
cout<<"* ";
}
else{
cout<<mmap[i][j]<<" ";
}
}
cout<<endl;
system("pause");
return false;
}
}
else{
for(int i=0;i<8;i++){
int nx=xa+dir[i][0],ny=xb+dir[i][1];
if(valid(nx,ny,m,n)&&mmap[nx][ny]!=INF){
vis[nx][ny]=true;
if(mmap[nx][ny]==0){
fankai(nx,ny,m,n);
}
}
}
}
}
if(caozuo==4){
if(fflag[xa][xb])
fflag[xa][xb]=false;
else{
cout<<"操作失败!";
Sleep(1000);
continue;
}
}
system("cls");
}
system("cls");
cout<<"你完成了扫雷,真厉害!\n这是答案:\n";
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(mmap[i][j]==INF){
cout<<"* ";
}
else{
cout<<mmap[i][j]<<" ";
}
}
cout<<endl;
}
system("pause");
system("cls");
return true;
}
void goto_saolei(){
system("cls");
int m,n;
while(1){
cout<<"请输入你要玩多少行,多少列的扫雷?\n";
cin>>m>>n;
if(!(m>=3&&m<=30&&n>=3&&n<=30)){
cout<<"输入数据不合理,请重新输入!"<<endl;
Sleep(1000);
system("cls");
continue;
}
else{
break;
}
}
if(saolei(m,n))
win++;
else
lose++;
system("cls");
}
int main(){
MessageBox(NULL,"欢迎来到益智游戏大全1.1版(不负众望)!","欢迎",MB_OK);
MessageBox(NULL,"输入是核对一下,输入的内容不要有字母或者\n其他奇奇怪怪的东西,否则会让程序崩溃!!!","注意!",MB_OK);
bool cd;
cout<<"请问您是否使用上一次的存档???(输入1或0)";
cin>>cd;
if(cd){
cout<<"好的,恢复存档。"<<endl;
ifstream fin("益智游戏大全.txt");
fin>>win>>lose;
fin.close();
Sleep(1000);
}
while(1){
system("cls");
cout<<"你要玩什么游戏?\n1. 扫雷\n输入-1退出游戏。\n其余在开发中,敬请期待!";
int g;
cin>>g;
if(g==-1)
break;
switch(g){
case 1:goto_saolei();break;
default:cout<<"输入错误,请重新输入!";Sleep(1000);continue;
}
}
system("cls");
bool bc;
cout<<"你赢了"<<win<<"局,输了"<<lose<<"局。\n";
Sleep(1500);
cout<<"是否保存???(输入1或0)";
cin>>bc;
if(bc){
cout<<"好的,保存后请立即退出。"<<endl;
ofstream fout("益智游戏大全.txt");
fout<<win<<" "<<lose;
fout.close();
Sleep(1000);
}
else{
system("cls");
cout<<"再见!!!";
ofstream fout("益智游戏大全.txt");
fout<<0<<" "<<0;
fout.close();
Sleep(1000);
}
return 0;
}
目前有奖悬赏:
1. O3优化怎么写?(我绝对不会把它用在刷题上的,否则我就是*)(回答好的话赏金可以加到30)
2. 如何将同一个屏幕中不同的字设置不同的颜色(回答的好的话赏金可以加到150)
3. 请指出不少于1处bug(每一处有意义的bug可以给30~50豆)
请你们尊重一下我的劳动成果,不要刷“666”“NB”之类的无聊的没有价值的话,请给出客观、真实的评价。
请勿在回答中喷人、骂人,否则我一律举报!!!
曹灿阳在2021-02-10 20:56:46追加了内容
刚刚忘了说了,每个客观、真实的评价,我可以给10~20豆
曹灿阳在2021-02-10 20:57:58追加了内容
dingding
曹灿阳在2021-02-10 22:19:57追加了内容
我要关电脑了,有什么是明天再说(明天大年三十!!!)
无奖竞答:有谁和我一起守岁???电脑(上问答)或手机(对我比较熟悉的人)或电话手表(对我比较熟悉的人)联系我
曹灿阳在2021-02-11 11:50:15追加了内容
今天是大年三十,我更新了我的扫雷!
又是一年扫雷热,依然十里爆炸红。
二话不说,上代码!!!
顺便说一下,1.0版扫雷的名称是初出茅庐,1.1版是不负众望,1.2版是更上层楼。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cstdlib>
#include <cmath>
#include <ctime>
#include <bits/stdc++.h>
#include <windows.h>
#include <fstream>
#include <iomanip>
#define INF 0x3f3f3f3f
using namespace std;
void color(int corcorcor){
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),corcorcor+64);
}
const int dir[8][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};
int mmap[40][40],win,lose;
bool vis[40][40],fflag[40][40];
bool pd(int m,int n){
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(vis[i][j]==0&&mmap[i][j]!=INF)
return false;
}
}
return true;
}
bool valid(int x,int y,int m,int n){
if(x>=1&&x<=m&&y>=1&&y<=n)
return true;
return false;
}
void fankai(int x,int y,int m,int n){
for(int i=0;i<8;i++){
int nx=x+dir[i][0],ny=y+dir[i][1];
if(valid(nx,ny,m,n)&&vis[nx][ny]==0){
if(mmap[nx][ny]!=INF)
vis[nx][ny]=true;
if(mmap[nx][ny]==0)
fankai(nx,ny,m,n);
}
}
}
bool saolei_p1(int m,int n){
memset(vis,0,sizeof(vis));
while(!pd(m,n)){
system("cls");
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(fflag[i][j]){
color(11);
cout<<"F ";
}
else if(vis[i][j]&&mmap[i][j]!=INF){
if(mmap[i][j]==0){
color(13);
}
else{
color(15);
}
cout<<mmap[i][j]<<" ";
}
else{
color(12);
cout<<"? ";
}
}
color(9);
cout<<left<<setw(2)<<i<<endl;
}
color(9);
for(int j=1;j<=n;j++)
cout<<left<<setw(2)<<j;
cout<<" ←列"<<endl;
cout<<right<<setw(n*2+2)<<" ↑"<<endl;
cout<<right<<setw(n*2+2)<<" 行"<<endl;
Sleep(1000);
color(14);
cout<<"输入说明:\n";
cout<<"先输入两个数,空格隔开,表示你要操作的坐标。\n";
cout<<"接着,输入一个数,表示操作类型:\n\t1表示翻开,\n\t2表示插旗,\n\t3表示快捷翻开周围的格子(前提是正确插旗)\n\t4表示撤销插旗\n\n\n";
int xa,xb,caozuo;
cin>>xa>>xb>>caozuo;
if(!valid(xa,xb,m,n)||(caozuo<1||caozuo>4)){
cout<<"输入错误,请重新输入!";
Sleep(1000);
system("cls");
continue;
}
if(caozuo==1){
if(mmap[xa][xb]==INF){
system("cls");
cout<<"你踩到地雷了!!!扫雷失败!!!\n这是答案:\n";
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(mmap[i][j]==INF){
color(11);
cout<<"* ";
}
else{
if(mmap[i][j]==0)
color(13);
else
color(15);
cout<<mmap[i][j]<<" ";
}
}
cout<<endl;
}
color(14);
system("pause");
return false;
}
vis[xa][xb]=true;
if(mmap[xa][xb]==0)
fankai(xa,xb,m,n);
}
if(caozuo==2){
if(vis[xa][xb]){
cout<<"操作失败!";
Sleep(1000);
system("cls");
continue;
}
fflag[xa][xb]=true;
}
if(caozuo==3){
if(!vis[xa][xb]){
cout<<"操作失败!";
Sleep(1000);
system("cls");
continue;
}
int cnt=0,tmp_flag=false;
for(int i=0;i<8;i++){
int nx=xa+dir[i][0],ny=xb+dir[i][1];
if(valid(nx,ny,m,n)&&fflag[nx][ny]){
cnt++;
if(mmap[nx][ny]!=INF){
tmp_flag=true;
}
}
}
if(cnt!=mmap[xa][xb]){
cout<<"操作格子周围的雷数不对,请注意。";
Sleep(1000);
system("cls");
continue;
}
else if(tmp_flag){
system("cls");
cout<<"插旗错误!!!扫雷失败!!!\n这是答案:\n";
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(mmap[i][j]==INF){
color(11);
cout<<"* ";
}
else{
if(mmap[i][j]==0)
color(13);
else
color(15);
cout<<mmap[i][j]<<" ";
}
}
cout<<endl;
}
color(14);
system("pause");
return false;
}
else{
for(int i=0;i<8;i++){
int nx=xa+dir[i][0],ny=xb+dir[i][1];
if(valid(nx,ny,m,n)&&mmap[nx][ny]!=INF){
vis[nx][ny]=true;
if(mmap[nx][ny]==0){
fankai(nx,ny,m,n);
}
}
}
}
}
if(caozuo==4){
if(fflag[xa][xb])
fflag[xa][xb]=false;
else{
cout<<"操作失败!";
Sleep(1000);
continue;
}
}
system("cls");
}
system("cls");
cout<<"你完成了扫雷,真厉害!\n这是答案:\n";
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(mmap[i][j]==INF){
color(11);
cout<<"* ";
}
else{
if(mmap[i][j]==0)
color(13);
else
color(15);
cout<<mmap[i][j]<<" ";
}
}
cout<<endl;
}
color(14);
system("pause");
system("cls");
return true;
}
bool saolei(int m,int n){
srand(time(NULL));
memset(mmap,0,sizeof(mmap));
memset(vis,0,sizeof(vis));
memset(fflag,0,sizeof(fflag));
system("cls");
int cnt_b=m*(n+1)/10+1;
for(int i=1;i<=cnt_b;i++){
int x=rand()%m+1,y=rand()%n+1;
mmap[x][y]=INF;
}
cnt_b=0;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(mmap[i][j]==INF){
cnt_b++;
}
}
}
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(mmap[i][j]!=INF){
for(int k=0;k<8;k++){
int nx=i+dir[k][0],ny=j+dir[k][1];
if(valid(nx,ny,m,n)&&mmap[nx][ny]==INF){
mmap[i][j]++;
}
}
}
}
}
system("cls");
bool tmp=saolei_p1(m,n);
system("cls");
while(tmp==0){
lose++;
color(14);
bool a;
cout<<"是否重新开始相同的地图?(1表示是,0表示否)";
cin>>a;
if(a){
cout<<"好的,重新开始。";
system("cls");
tmp=saolei_p1(m,n);
}
else
break;
}
return tmp;
}
void goto_saolei(){
system("cls");
int m,n;
while(1){
cout<<"请输入你要玩多少行,多少列的扫雷?\n";
cin>>m>>n;
if(!(m>=3&&m<=30&&n>=3&&n<=30)){
cout<<"输入数据不合理,请重新输入!"<<endl;
Sleep(1000);
system("cls");
continue;
}
else{
break;
}
}
if(saolei(m,n))
win++;
else
lose++;
system("cls");
}
int main(){
system("cls");
color(0);
system("cls");
color(14);
MessageBox(NULL,"欢迎来到益智游戏大全1.2版(更上层楼)!","欢迎",MB_OK);
MessageBox(NULL,"输入是核对一下,输入的内容不要有字母或者\n其他奇奇怪怪的东西,否则会让程序崩溃!!!","注意!",MB_OK);
system("cls");
bool cd;
cout<<"请问您是否使用上一次的存档???(输入1或0)";
cin>>cd;
if(cd){
cout<<"好的,恢复存档。"<<endl;
ifstream fin("益智游戏大全.txt");
fin>>win>>lose;
fin.close();
Sleep(1000);
}
while(1){
system("cls");
cout<<"你要玩什么游戏?\n1. 扫雷\n输入-1退出游戏。\n其余在开发中,敬请期待!";
int g;
cin>>g;
if(g==-1)
break;
switch(g){
case 1:goto_saolei();break;
default:cout<<"输入错误,请重新输入!";Sleep(1000);continue;
}
}
system("cls");
bool bc;
cout<<"你赢了"<<win<<"局,输了"<<lose<<"局。成功率:";
printf("%.1f",win*100/(double)(win+lose));
cout<<"%\n";
Sleep(1500);
cout<<"是否保存???(输入1或0)";
cin>>bc;
if(bc){
cout<<"好的,保存后请立即退出。"<<endl;
ofstream fout("益智游戏大全.txt");
fout<<win<<" "<<lose;
fout.close();
Sleep(1000);
}
else{
system("cls");
cout<<"再见!!!";
ofstream fout("益智游戏大全.txt");
fout<<0<<" "<<0;
fout.close();
Sleep(1000);
}
return 0;
}
呵呵
高级启示者
我先回答您的第二个问题:
可以参考我在开发XA-codingtang和XACRAFT时调用的函数:
头文件:
#include<windows.h>
调用:
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);
//其中a代表色号
前景色
1 深蓝色
2 深绿色
3 深青色
4 深红色
5 深粉色
6 黄色
7 深白色
8 灰色
9 浅蓝色
10 浅绿色
11 浅青色
12 浅红色
13 浅粉色
14 浅黄色
15 浅白色
背景色
1~15 黑色
16~31 深蓝色
32~47 深绿色
48~63 深青色
64~79 深红色
80~95 深粉色
96~111 深黄色
112~127 深白色
128~143 灰色
144~159 浅蓝色
160~175 浅绿色
176~191 浅青色
192~207 浅红色
208~223 浅粉色
224~239 浅黄色
240~255 浅白色
前景与背景共用时,色号为:(前景色+背景色范围的第一个数)
如:前景灰色,背景浅蓝。色号:(8+144)
具体还可以参考吴庞茂旭的帖子:https://wenda.codingtang.com/questions/11177/
使用效果:
色号:240、249、252
沙宸安在2021-02-10 21:26:22追加了内容
那比如像我这一段:
system("cls");
color(9);
cout<<"操作系统:XA-codingtang 2021特别版"<<endl;
color(7);
string time=getTime();
cout<<time<<endl;
color(14);
cout<<"文件夹路径:";
color(7);
findesktop(cmmd);
cout<<endl;
for(i=1;i<=filestd[cmmd];i++){
if(1){
cout<<i<<" : "<<file[cmmd][i]<<endl;
}
}
color(14);
cout<<"基本操作:"<<endl;
color(7);
cout<<"C-打开功能栏"<<endl<<"O-打开小工具"<<endl<<"A-打开应用"<<endl<<"I-应用商店"<<endl<<"T-投诉&反馈"<<endl;
color(14);
cout<<"XA应用:"<<endl;
color(7);
沙宸安在2021-02-10 21:30:09追加了内容
建议:
1、引入判断机制,首次选择格子一定不会踩雷,要不然开头雷岂不尴尬吗
2、添加计分板功能,统计成功局数、失败局数、成功率等
3、如果不慎踩雷,可以选择重新玩这一张地图
初级天翼
@沙宸安
请问这是怎么回事?
请问color()函数到底怎么用?有什么头文件?
曹灿阳在2021-02-10 22:00:30追加了内容
为什么我的是这样的:
请问出了什么问题?
曹灿阳在2021-02-10 22:03:37追加了内容
谢谢,这下好了:
曹灿阳在2021-02-10 22:07:33追加了内容
这下好了:
高级启示者
对不起,我大意了。
void color(int corcorcor){
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),corcorcor);
}
我用color只是为了方便不写那么一大堆,你应该要把这个加上
沙宸安在2021-02-10 22:02:21追加了内容
像你用的是win7的,最好在每次清屏的时候这么写:
system("cls");
color(?);
system("cls");
不然容易卡
沙宸安在2021-02-10 22:03:22追加了内容
就有可能出现你的那种情况
新手启示者
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cstdlib>
#include <cmath>
#include <ctime>
#include <bits/stdc++.h>
#include <windows.h>
#include <fstream>
#include <iomanip>
#define INF 0x3f3f3f3f
using namespace std;
const int dir[8][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};
int mmap[40][40],win,lose;
bool vis[40][40],fflag[40][40];
bool pd(int m,int n){
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(vis[i][j]==0&&mmap[i][j]!=INF)
return false;
}
}
return true;
}
bool valid(int x,int y,int m,int n){
if(x>=1&&x<=m&&y>=1&&y<=n)
return true;
return false;
}
void fankai(int x,int y,int m,int n){
for(int i=0;i<8;i++){
int nx=x+dir[i][0],ny=y+dir[i][1];
if(valid(nx,ny,m,n)&&vis[nx][ny]==0){
if(mmap[nx][ny]!=INF)
vis[nx][ny]=true;
if(mmap[nx][ny]==0)
fankai(nx,ny,m,n);
}
}
}
bool saolei(int m,int n){
srand(time(NULL));
memset(mmap,0,sizeof(mmap));
memset(vis,0,sizeof(vis));
memset(fflag,0,sizeof(fflag));
system("cls");
int cnt_b=m*(n+1)/10+1;
for(int i=1;i<=cnt_b;i++){
int x=rand()%m+1,y=rand()%n+1;
mmap[x][y]=INF;
}
cnt_b=0;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(mmap[i][j]==INF){
cnt_b++;
}
}
}
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(mmap[i][j]!=INF){
for(int k=0;k<8;k++){
int nx=i+dir[k][0],ny=j+dir[k][1];
if(valid(nx,ny,m,n)&&mmap[nx][ny]==INF){
mmap[i][j]++;
}
}
}
}
}
while(!pd(m,n)){
system("cls");
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(fflag[i][j]){
cout<<"F ";
}
else if(vis[i][j]&&mmap[i][j]!=INF){
cout<<mmap[i][j]<<" ";
}
else{
cout<<"? ";
}
}
cout<<left<<setw(2)<<i<<endl;
}
for(int j=1;j<=n;j++)
cout<<left<<setw(2)<<j;
cout<<" ←列"<<endl;
cout<<right<<setw(n*2+2)<<" ↑"<<endl;
cout<<right<<setw(n*2+2)<<" 行"<<endl;
Sleep(1000);
cout<<"输入说明:\n";
cout<<"先输入两个数,空格隔开,表示你要操作的坐标。\n";
cout<<"接着,输入一个数,表示操作类型:\n\t1表示翻开,\n\t2表示插旗,\n\t3表示快捷翻开周围的格子(前提是正确插旗)\n\t4表示撤销插旗\n\n\n";
int xa,xb,caozuo;
cin>>xa>>xb>>caozuo;
if(!valid(xa,xb,m,n)||(caozuo<1||caozuo>4)){
cout<<"输入错误,请重新输入!";
Sleep(1000);
system("cls");
continue;
}
if(caozuo==1){
if(mmap[xa][xb]==INF){
system("cls");
cout<<"你踩到地雷了!!!扫雷失败!!!\n这是答案:\n";
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(mmap[i][j]==INF){
cout<<"* ";
}
else{
cout<<mmap[i][j]<<" ";
}
}
cout<<endl;
}
system("pause");
return false;
}
vis[xa][xb]=true;
if(mmap[xa][xb]==0)
fankai(xa,xb,m,n);
}
if(caozuo==2){
if(vis[xa][xb]){
cout<<"操作失败!";
Sleep(1000);
system("cls");
continue;
}
fflag[xa][xb]=true;
}
if(caozuo==3){
if(!vis[xa][xb]){
cout<<"操作失败!";
Sleep(1000);
system("cls");
continue;
}
int cnt=0,tmp_flag=false;
for(int i=0;i<8;i++){
int nx=xa+dir[i][0],ny=xb+dir[i][1];
if(valid(nx,ny,m,n)&&fflag[nx][ny]){
cnt++;
if(mmap[nx][ny]!=INF){
tmp_flag=true;
}
}
}
if(cnt!=mmap[xa][xb]){
cout<<"操作格子周围的雷数不对,请注意。";
Sleep(1000);
system("cls");
continue;
}
else if(tmp_flag){
system("cls");
cout<<"插旗错误!!!扫雷失败!!!\n这是答案:\n";
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(mmap[i][j]==INF){
cout<<"* ";
}
else{
cout<<mmap[i][j]<<" ";
}
}
cout<<endl;
system("pause");
return false;
}
}
else{
for(int i=0;i<8;i++){
int nx=xa+dir[i][0],ny=xb+dir[i][1];
if(valid(nx,ny,m,n)&&mmap[nx][ny]!=INF){
vis[nx][ny]=true;
if(mmap[nx][ny]==0){
fankai(nx,ny,m,n);
}
}
}
}
}
if(caozuo==4){
if(fflag[xa][xb])
fflag[xa][xb]=false;
else{
cout<<"操作失败!";
Sleep(1000);
continue;
}
}
system("cls");
}
system("cls");
cout<<"你完成了扫雷,真厉害!\n这是答案:\n";
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(mmap[i][j]==INF){
cout<<"* ";
}
else{
cout<<mmap[i][j]<<" ";
}
}
cout<<endl;
}
system("pause");
system("cls");
return true;
}
void goto_saolei(){
system("cls");
int m,n;
while(1){
cout<<"请输入你要玩多少行,多少列的扫雷?\n";
cin>>m>>n;
if(!(m>=3&&m<=30&&n>=3&&n<=30)){
cout<<"输入数据不合理,请重新输入!"<<endl;
Sleep(1000);
system("cls");
continue;
}
else{
break;
}
}
if(saolei(m,n))
win++;
else
lose++;
system("cls");
}
int main(){
MessageBox(NULL,"欢迎来到益智游戏大全1.1版(不负众望)!","欢迎",MB_OK);
MessageBox(NULL,"输入是核对一下,输入的内容不要有字母或者\n其他奇奇怪怪的东西,否则会让程序崩溃!!!","注意!",MB_OK);
bool cd;
cout<<"请问您是否使用上一次的存档???(输入1或0)";
cin>>cd;
if(cd){
cout<<"好的,恢复存档。"<<endl;
ifstream fin("益智游戏大全.txt");
fin>>win>>lose;
fin.close();
Sleep(1000);
}
while(1){
system("cls");
cout<<"你要玩什么游戏?\n1. 扫雷\n输入-1退出游戏。\n其余在开发中,敬请期待!";
int g;
cin>>g;
if(g==-1)
break;
switch(g){
case 1:goto_saolei();break;
default:cout<<"输入错误,请重新输入!";Sleep(1000);continue;
}
}
system("cls");
bool bc;
cout<<"你赢了"<<win<<"局,输了"<<lose<<"局。\n";
Sleep(1500);
cout<<"是否保存???(输入1或0)";
cin>>bc;
if(bc){
cout<<"好的,保存后请立即退出。"<<endl;
ofstream fout("益智游戏大全.txt");
fout<<win<<" "<<lose;
fout.close();
Sleep(1000);
}
else{
system("cls");
cout<<"再见!!!";
ofstream fout("益智游戏大全.txt");
fout<<0<<" "<<0;
fout.close();
Sleep(1000);
}
return 0;
}
main.cpp:9:21: fatal error: windows.h: No such file or directory
#include <windows.h>
^
compilation terminated.
what>?