0
已解决
曹灿阳
初级天翼
初级天翼
今天是大年三十!!!
又是一年扫雷热,依然十里爆炸红。
我又更新了我的扫雷。
顺便说一下: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版(更上层楼)!\n特别鸣谢:沙宸安","欢迎",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;
}