问题标题: 酷町堂:求扫雷代码

0
0

0
1
张沛熠
张沛熠
新手守护
新手守护

#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;

 

}

0
0
0
0
我要回答