標籤:c++ 控制台 掃雷 bfs
白天看了一天書看累了,晚上瞅見掃雷遊戲,就自己琢磨著做一個唄。想了一會,也沒看別人怎麼做的,大概1個多小時完成了這個簡單版本的掃雷遊戲,由於沒怎麼學過c#,介面的事情可能遲幾天再做,明天要回家啦,哈哈!
先說思路,其實挺簡單的。
(1) 隨機產生10個雷,標記到二維數組裡,然後計算八個方向的雷的總數記錄下來,這是預先處理階段。
(2)輸入要翻開的位置的座標,如果是數字直接顯示,是空白的話,這裡採用bfs即寬度優先搜尋解決,搜到最外層是數字(僅一層)時結束,具體詳見代碼。
// 掃雷程式 #include <iostream>#include <string>#include <queue>#include <cstring>#include <ctime>using namespace std;int grid[100][100];int randMark[100][100];char showUs[100][100];int vis[100][100];int dir[8][2]={{-1,0},{1,0},{0,1},{0,-1},{-1,-1},{-1,1},{1,-1},{1,1}};//方向數組 int res; struct node{int x;int y;};void bfs(int nx,int ny) //處理點擊空白 {queue <node> q;node temp;node t;t.x=nx,t.y=ny;q.push(t);vis[nx][ny]=1;while(!q.empty()){res++;temp=q.front();showUs[temp.x][temp.y]=grid[temp.x][temp.y]+'0';q.pop();for(int i=0;i<8;i++){int xx=temp.x+dir[i][0];int yy=temp.y+dir[i][1];if(xx>=0&&xx<10&&yy>=0&&yy<10){if(!vis[xx][yy]&&grid[xx][yy]==0){ t.x=xx,t.y=yy; vis[xx][yy]=1; showUs[xx][yy]=grid[xx][yy]+'0'; q.push(t); }if(!vis[xx][yy]&&grid[xx][yy]>0&&grid[temp.x][temp.y]==0){ t.x=xx,t.y=yy; vis[xx][yy]=1; showUs[xx][yy]=grid[xx][yy]+'0'; q.push(t); }}}}}int main(){memset(grid,0,sizeof(grid));memset(randMark,0,sizeof(randMark));memset(vis,0,sizeof(vis));for(int i=0;i<10;i++)for(int j=0;j<10;j++)showUs[i][j]='*';srand(unsigned(time(NULL)));int sum=0;while(1){int x=rand()%10;int y=rand()%10;if(randMark[x][y]!=1){randMark[x][y]=1;//有雷sum++;}if(sum==10)break; } res=0;for(int i=0;i<10;i++)for(int j=0;j<10;j++){if(randMark[i][j])grid[i][j]=-1;} for(int i=0;i<10;i++)for(int j=0;j<10;j++){if(grid[i][j]!=-1){for(int k=0;k<8;k++){int x=i+dir[k][0];int y=j+dir[k][1];if(x>=0&&x<10&&y>=0&&y<10&&grid[x][y]==-1){ grid[i][j]++;}}}}for(int i=0;i<10;i++){for(int j=0;j<10;j++)cout<<showUs[i][j]<<" ";cout<<endl;}cout<<"請輸入要翻開的位置的座標:"<<endl;int x,y;while(1){if(res==90)cout<<"恭喜您勝利啦,排雷成功!"<<endl; cin>>x>>y;if(grid[x][y]==-1){cout<<"您中雷啦!"<<endl;break;}else if(!vis[x][y]&&grid[x][y]>0){res++;vis[x][y]=1;showUs[x][y]=grid[x][y]+'0';system("cls");for(int i=0;i<10;i++) { for(int j=0;j<10;j++) cout<<showUs[i][j]<<" "; cout<<endl; } cout<<"請輸入要翻開的位置的座標:"<<endl;}else if(!vis[x][y]&&grid[x][y]==0){bfs(x,y);system("cls");for(int i=0;i<10;i++) { for(int j=0;j<10;j++) cout<<showUs[i][j]<<" "; cout<<endl; } cout<<"請輸入要翻開的位置的座標:"<<endl;}}return 0;}
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
c++ 控制台版 掃雷遊戲