C++控制臺(tái)版掃雷游戲
本文實(shí)例為大家分享了C++控制臺(tái)版掃雷游戲的具體代碼,供大家參考,具體內(nèi)容如下
先說思路,其實(shí)挺簡單的。
(1) 隨機(jī)生成10個(gè)雷,標(biāo)記到二維數(shù)組里,然后計(jì)算八個(gè)方向的雷的總數(shù)記錄下來,這是預(yù)處理階段。
(2)輸入要翻開的位置的坐標(biāo),如果是數(shù)字直接顯示,是空白的話,這里采用bfs即寬度優(yōu)先搜索解決,搜到最外層是數(shù)字(僅一層)時(shí)結(jié)束,具體詳見代碼。
// 掃雷程序? #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}};//方向數(shù)組? int res;? struct node { ?? ?int x; ?? ?int y; }; void bfs(int nx,int ny) //處理點(diǎn)擊空白? { ?? ?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<<"請輸入要翻開的位置的坐標(biāo):"<<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<<"請輸入要翻開的位置的坐標(biāo):"<<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<<"請輸入要翻開的位置的坐標(biāo):"<<endl; ?? ??? ?} ?? ?} ?? ?return 0; }?
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C++ 中CloseHandle 函數(shù)--關(guān)閉一個(gè)句柄
這篇文章主要介紹了C++ 中CloseHandle 函數(shù)--關(guān)閉一個(gè)句柄的相關(guān)資料,需要的朋友可以參考下2017-05-05opencv3/C++關(guān)于移動(dòng)對(duì)象的輪廓的跟蹤詳解
今天小編就為大家分享一篇opencv3/C++關(guān)于移動(dòng)對(duì)象的輪廓的跟蹤詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-12-12C++ OpenCV學(xué)習(xí)之圖像金字塔與圖像融合詳解
圖像金字塔分為兩種:高斯金字塔和拉普拉斯金字塔。圖像金字塔在保持細(xì)節(jié)的條件下進(jìn)行圖像融合等多尺度編輯操作非常有用。本文將利用圖像金字塔實(shí)現(xiàn)圖像融合,需要的可以參考一下2022-03-03C++實(shí)踐數(shù)組類運(yùn)算的實(shí)現(xiàn)參考
今天小編就為大家分享一篇關(guān)于C++實(shí)踐數(shù)組類運(yùn)算的實(shí)現(xiàn)參考,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-02-02