C++控制臺(tái)版掃雷游戲
本文實(shí)例為大家分享了C++控制臺(tái)版掃雷游戲的具體代碼,供大家參考,具體內(nèi)容如下
先說(shuō)思路,其實(shí)挺簡(jiǎn)單的。
(1) 隨機(jī)生成10個(gè)雷,標(biāo)記到二維數(shù)組里,然后計(jì)算八個(gè)方向的雷的總數(shù)記錄下來(lái),這是預(yù)處理階段。
(2)輸入要翻開(kāi)的位置的坐標(biāo),如果是數(shù)字直接顯示,是空白的話,這里采用bfs即寬度優(yōu)先搜索解決,搜到最外層是數(shù)字(僅一層)時(shí)結(jié)束,具體詳見(jiàn)代碼。

// 掃雷程序?
#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<<"請(qǐng)輸入要翻開(kāi)的位置的坐標(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<<"請(qǐng)輸入要翻開(kāi)的位置的坐標(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<<"請(qǐng)輸入要翻開(kāi)的位置的坐標(biāo):"<<endl;
?? ??? ?}
?? ?}
?? ?return 0;
}?以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
解析使用C++編寫(xiě)無(wú)錯(cuò)代碼的方法技巧
本篇文章是對(duì)使用C++編寫(xiě)無(wú)錯(cuò)代碼的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之學(xué)生信息管理系統(tǒng)課程設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之學(xué)生信息管理系統(tǒng)課程設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11
C++訪問(wèn)Redis的mset 二進(jìn)制數(shù)據(jù)接口封裝方案
這篇文章主要介紹了C++訪問(wèn)Redis的mset 二進(jìn)制數(shù)據(jù)接口封裝方案的相關(guān)資料,需要的朋友可以參考下2015-07-07
C語(yǔ)言數(shù)據(jù)的存儲(chǔ)超詳細(xì)講解上篇
使用編程語(yǔ)言進(jìn)行編程時(shí),需要用到各種變量來(lái)存儲(chǔ)各種信息。變量保留的是它所存儲(chǔ)的值的內(nèi)存位置。這意味著,當(dāng)您創(chuàng)建一個(gè)變量時(shí),就會(huì)在內(nèi)存中保留一些空間。您可能需要存儲(chǔ)各種數(shù)據(jù)類(lèi)型的信息,操作系統(tǒng)會(huì)根據(jù)變量的數(shù)據(jù)類(lèi)型,來(lái)分配內(nèi)存和決定在保留內(nèi)存中存儲(chǔ)什么2022-04-04
VC實(shí)現(xiàn)ODBC數(shù)據(jù)庫(kù)操作實(shí)例解析
這篇文章主要介紹了VC實(shí)現(xiàn)ODBC數(shù)據(jù)庫(kù)操作的方法,非常有實(shí)用價(jià)值,需要的朋友可以參考下2014-07-07
C語(yǔ)言SetConsoleCursorInfo函數(shù)使用方法
這篇文章介紹了C語(yǔ)言SetConsoleCursorInfo函數(shù)的使用方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-12-12

