C++控制臺版掃雷游戲
本文實例為大家分享了C++控制臺版掃雷游戲的具體代碼,供大家參考,具體內(nèi)容如下
先說思路,其實挺簡單的。
(1) 隨機生成10個雷,標記到二維數(shù)組里,然后計算八個方向的雷的總數(shù)記錄下來,這是預(yù)處理階段。
(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)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C++ 中CloseHandle 函數(shù)--關(guān)閉一個句柄
這篇文章主要介紹了C++ 中CloseHandle 函數(shù)--關(guān)閉一個句柄的相關(guān)資料,需要的朋友可以參考下2017-05-05
opencv3/C++關(guān)于移動對象的輪廓的跟蹤詳解
今天小編就為大家分享一篇opencv3/C++關(guān)于移動對象的輪廓的跟蹤詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12
C++ OpenCV學(xué)習(xí)之圖像金字塔與圖像融合詳解
圖像金字塔分為兩種:高斯金字塔和拉普拉斯金字塔。圖像金字塔在保持細節(jié)的條件下進行圖像融合等多尺度編輯操作非常有用。本文將利用圖像金字塔實現(xiàn)圖像融合,需要的可以參考一下2022-03-03

