c++ 控制台版 掃雷遊戲

來源:互聯網
上載者:User

標籤: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++ 控制台版 掃雷遊戲

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.