C++控制臺版掃雷游戲
更新時間:2022年05月07日 11:22:14 作者:NK_test
這篇文章主要為大家詳細介紹了C++控制臺版掃雷游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本文實例為大家分享了C++控制臺版掃雷游戲的具體代碼,供大家參考,具體內(nèi)容如下
先說思路,其實挺簡單的。
(1) 隨機生成10個雷,標記到二維數(shù)組里,然后計算八個方向的雷的總數(shù)記錄下來,這是預處理階段。
(2)輸入要翻開的位置的坐標,如果是數(shù)字直接顯示,是空白的話,這里采用bfs即寬度優(yōu)先搜索解決,搜到最外層是數(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) //處理點擊空白? { ?? ?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; }?
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
C++ 中CloseHandle 函數(shù)--關閉一個句柄
這篇文章主要介紹了C++ 中CloseHandle 函數(shù)--關閉一個句柄的相關資料,需要的朋友可以參考下2017-05-05