扫雷核心算法c++实现

#include <time.h> 
#include <stdio.h> 
#include <iostream> 
using namespace std; 
class Algo{
public:
Algo(int w=10,int h=10);
void show();
void flip(int x,int y);
bool satisfy(int x,int y);
private:
int w,h;
int** field;//0,1,2,3,4,5,6,7,8
int** fieldMine;//0,1
int** shadow;//0,1

};



#include "coreAlgo.h"
Algo::Algo(int w,int h){
//initialize h&w.
this->w=w;
this->h=h;
//initialize field&mine array.
field=new int*[w];
fieldMine=new int*[w];
shadow=new int*[w];
for(int i=0;i<w;i++){
field[i]=new int[h];
fieldMine[i]=new int[h];
shadow[i]=new int[h];
}
srand( (unsigned)time( NULL ) );
for(int i=0;i<w;i++){
for(int j=0;j<h;j++){
if(rand()%100<50)
fieldMine[i][j]=0;
else
fieldMine[i][j]=1;
shadow[i][j]=1;
}
}
int result=0;
for(int i=0;i<w;i++){
for(int j=0;j<h;j++){
result=0;
if(satisfy(i-1,j-1) && fieldMine[i-1][j-1]==1)
result++;
if(satisfy(i,j-1)&& fieldMine[i][j-1]==1)
result++;
if(satisfy(i+1,j-1)&& fieldMine[i+1][j-1]==1)
result++;
if(satisfy(i-1,j)&& fieldMine[i-1][j]==1)
result++;
if(satisfy(i+1,j)&& fieldMine[i+1][j]==1)
result++;
if(satisfy(i-1,j+1)&& fieldMine[i-1][j+1]==1)
result++;
if(satisfy(i,j+1)&& fieldMine[i][j+1]==1)
result++;
if(satisfy(i+1,j+1)&& fieldMine[i+1][j+1]==1)
result++;
field[i][j]=result;
}
}
}
void Algo::show(){
for(int i=0;i<w;i++){
for(int j=0;j<h;j++){
cout<<fieldMine[i][j]<<" ";
}
cout<<"          ";
for(int j=0;j<h;j++){
cout<<field[i][j]<<" ";
}
cout<<"          ";
for(int j=0;j<h;j++){
cout<<shadow[i][j]<<" ";
}
cout<<endl;
}
}
void Algo::flip(int x,int y){
//(x-1,y-1)(x,y-1)(x+1,y-1)
//(x-1,y)(x,y)(x+1,y)
//(x-1,y+1)(x,y+1)(x+1,y+1)
int result=0;
if(satisfy(x,y) && fieldMine[x][y]==0 && shadow[x][y]==1){
shadow[x][y]=0;
flip(x-1,y-1);
flip(x,y-1);
flip(x+1,y-1);
flip(x-1,y);
flip(x+1,y);
flip(x-1,y+1);
flip(x,y+1);
flip(x+1,y+1);
}
}
bool Algo::satisfy(int x,int y){
if(x<w && x>=0 && y<h && y>=0)
return true;
else
return false;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值