




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第C++控制臺實現(xiàn)掃雷游戲本文實例為大家分享了C++控制臺實現(xiàn)掃雷游戲的具體代碼,供大家參考,具體內(nèi)容如下
花了一下午寫出來的控制臺掃雷,主要通過修改和打印數(shù)組來實現(xiàn)。
主要的問題點:
1.在顯示地圖的過程中,既要顯示數(shù)字,又要顯示雷和符號,所以的用string類型的二維向量,vectorvectorstring.;中間要利用ASCII碼將int型的數(shù)字轉(zhuǎn)化為字符串。
2.生成地圖的時候,雷是隨機的,我這里采用的做法是取余生成雷,舉個例子,如果雷數(shù)是格子數(shù)的十分之一,那我遍歷整個二維數(shù)組,在rand()%8==0時放置一顆雷,當(dāng)放置10顆之后停止,這樣可能會導(dǎo)致我的雷都偏前面一點,哈哈。
3.對于沒有雷的格子,需要做一個遍歷,統(tǒng)計周邊的雷數(shù),為了方便,實際地圖要大一圈,實際的邊長+2,邊不作為地圖,只為統(tǒng)計雷數(shù)時方便存在。
4.當(dāng)點開一顆雷之后,如果數(shù)字是0,那么四周為0的數(shù)字也要被點亮,因此在這里使用遞歸實現(xiàn)dfs。
5.在每次進(jìn)行一個格子操作之后,使用一個count計數(shù),所有格子操作完后,游戲結(jié)束統(tǒng)計游戲結(jié)果,在此之前,踩到雷也會導(dǎo)致游戲結(jié)束。
附上游戲截圖和代碼
主函數(shù)
#includevector
#includealgorithm
#includefunctional
#includeiostream
#includewindows.h
#include"gameManager.h"
#include"map.h"
usingnamespacestd;
intmain(){
GameManager*game=newGameManager();
while(true){
intdiff=game-difficultNumber();//玩家的難度選擇參數(shù)
Map*m=newMap(diff);
m-initMap();
while(true){
m-showMap();
intswicth;
cout"1.踩雷"endl;
cout"2.插旗子"endl;
cout"3.取消插旗子"endl;
cinswicth;
if(swicth==1){
//踩雷;如果踩到雷了返回1,沒踩到返回0
if(game-stepOnMine(m))break;
}
elseif(swicth==2){
//插旗子
game-flagMine(m);
}
elseif(swicth==3){
//取消插旗子
game-cancelFalgMine(m);
}
else{
cout"您的輸入有誤!"endl;
}
//判斷格子是否被開完,開完了則取勝
if(m-gameOver()){
cout"恭喜你獲得勝利!"endl;
m-showMap();
break;
}
}
intover=0;
cout"1.回到主菜單"endl;
cout"other.退出游戲"endl;
cinover;
if(over==1){
system("cls");
continue;
}
elsebreak;
}
system("pause");
return0;
}
map類
頭文件
```cpp
#pragmaonce
#includectime
#includevector
#includestring
#includeiostream
usingnamespacestd;
classMap{
public:
Map(int);//根據(jù)難度構(gòu)造地圖
voidinitMap();//根據(jù)難度初始化地圖
stringaroudMineNum
(constvectorvectorstring,constint,constint)const;//判斷某個坐標(biāo)桌邊的雷數(shù)
voidshowMap();//打印showMapArray數(shù)組
intdateUpMap(constint,constint//如果返回值為1,繼續(xù),返回值為0表示結(jié)束,如果返回值為-1表示非法輸入
intflag(constint,constint//插旗子修改顯示數(shù)組
intcancelFlag(constint,constint//取消旗子時修改顯示數(shù)組
boolgameOver();
private:
intmapCount;//格子用完的計數(shù)
intdifficult;//難度
vectorvectorstringmap;//隱藏的雷表
vectorvectorstringshowMapArray;//公開的顯示數(shù)組
};
源文件
#include"map.h"
Map::Map(intdifficult):
difficult(difficult),
mapCount(difficult*difficult)
//初始化地圖數(shù)組
voidMap::initMap()
//根據(jù)難度設(shè)置二維數(shù)組的大小以及雷的數(shù)量
intmineNumber=difficult*difficult*10;//雷的數(shù)量
intsize=10*difficult;//此處尺寸加2,四邊都為零,這樣方便統(tǒng)計沒有雷的格子上的數(shù)據(jù)
srand(time(0));
//使用隨機數(shù)設(shè)置雷的數(shù)量
for(inti=0;isize+2;++i){
vectorstringtemp;
for(intj=0;jsize+2;++j){
if(rand()%8==0mineNumber!=0i!=0j!=0i!=size-1j!=size-1){
temp.push_back("*");
--mineNumber;
}
else{
temp.push_back("0");
}
}
map.push_back(temp);
}
//此外還需要根據(jù)雷的位置和數(shù)量在其他位置上提示!
for(inti=1;isize-1;++i){
for(intj=1;jsize-1;++j){
if(map[i][j]!="*"){
map[i][j]=aroudMineNum(map,i,j);
}
}
}
//初始化顯示顯示數(shù)組,注意!此數(shù)組要顯示行列數(shù),所以比上述數(shù)組多一行一列
for(inti=0;isize+1;++i){
vectorstringtemp;
for(intj=0;jsize+1;++j){
if(i==0){
stringt;
if(j10){
t.push_back(48);
t.push_back(j+48);
}
elseif(j20){
t.push_back(49);
t.push_back(j+38);
}
elseif(j30){
t.push_back(50);
t.push_back(j+28);
}
else{
t.push_back('3');
t.push_back('0');
}
temp.push_back(t);
}
elseif(j==0){
stringt;
if(i10){
t.push_back(48);
t.push_back(i+48);
}
elseif(i20){
t.push_back(49);
t.push_back(i+38);
}
elseif(i30){
t.push_back(50);
t.push_back(i+28);
}
else{
t.push_back('3');
t.push_back('0');
}
temp.push_back(t);
}
elsetemp.push_back("#");
}
showMapArray.push_back(temp);
}
//判斷自身格子上的數(shù)字為多少
stringMap::aroudMineNum(constvectorvectorstringmap,constinti,constintj)const
intcount=0;
stringans;
for(intx=i-1;x=i+1;++x){
for(inty=j-1;y=j+1;++y){
if(map[x][y]=="*"){
++count;
}
}
}
ans.push_back(48);
ans.push_back(count+48);
returnans;
//按照地圖數(shù)組顯示畫面
voidMap::showMap()
intsideLength=showMapArray.size();
for(inti=0;isideLength;++i){
for(intj=0;jsideLength;++j){
coutshowMapArray[i][j]"";
}
coutendl;
}
intMap::dateUpMap(constintx,constinty)
//判斷xy的值只能在0-30之間difficult*10
if(x1||x=(difficult*10)||y0||y=(difficult*10))return-1;
//判斷坐標(biāo)是否已經(jīng)被翻開,若被翻開,則輸入非法,返回-1
if(showMapArray[x][y]!="#")return-1;
//如果該點有雷,則把該點的雷翻出來,顯示游戲失敗
if(map[x][y]=="*"){
showMapArray[x][y]="*";
return0;
}
//如果該點的數(shù)字大于0,則只把單一數(shù)字翻出來
elseif(map[x][y]!="00"){
stringtemp;
temp.append(map[x][y]);
showMapArray[x][y]=temp;
--mapCount;//格子數(shù)減少統(tǒng)計,當(dāng)格子數(shù)為0時判斷游戲勝利!
}
//如果該點的數(shù)字為0,則把附近為0的點全部翻出來,直到翻出數(shù)字為止
else{
if(showMapArray[x][y]!="Q"){
--mapCount;//格子數(shù)減少統(tǒng)計,當(dāng)格子數(shù)為0時判斷游戲勝利!
showMapArray[x][y]="00";
}
if(showMapArray[x][y]=="Q"map[x][y]=="*"){
showMapArray[x][y]="*";
return-1;
}
for(inti=x-1;i=x+1;++i){
for(intj=y-1;j=y+1;++j){
if(!(i==xj==y)i0i(difficult*10)j0j(difficult*10)){
dateUpMap(i,j);
}
}
}
return1;
}
intMap::flag(constintx,constinty)
if(showMapArray[x][y]!="#")return-1;
else{
--mapCount;//格子數(shù)減少統(tǒng)計,當(dāng)格子數(shù)為0時判斷游戲勝利!
showMapArray[x][y]="Q";
}
return0;
intMap::cancelFlag(constintx,constinty)
if(showMapArray[x][y]!="Q")return-1;
else{
++mapCount;//格子數(shù)增加統(tǒng)計,當(dāng)格子數(shù)為0時判斷游戲勝利!
showMapArray[x][y]="#";
}
return0;
boolMap::gameOver()
if(mapCount==0)returntrue;
returnfalse;
}
gameManager類
頭文件
#pragmaonce
#includeiostream
#includewindows.h
#include"map.h"
usingnamespacestd;
classGameManager{
public:
voidshowMenu();//顯示主菜單
intdifficultNumber();//選擇難度
intstepOnMine(Map*m);//踩雷
intflagMine(Map*m);//插旗子
intcancelFalgMine(Map*m);//取消旗子
};
源文件
#include"gameManager.h"
#include"map.h"
voidGameManager::showMenu()
cout"***************主菜單***************"endl;
cout"************1.簡單模式**************"endl;
cout"************2.中等模式**************"endl;
cout"************3.困難模式**************"endl;
cout"**********請輸入你的選擇************"endl;
intGameManager::difficultNumber()
intdiff=0;
while(diff!=1diff!=2diff!=3){
this-showMenu();
cindiff;
}
returndiff;
intGameManager::stepOnMine(Map*m)
intx,y;
cout"請輸入你想排雷的坐標(biāo):"endl;
cout"x:"endl;
cinx;
cout"y:"endl;
ciny;
intresult=m-dateUpMap(x,y);
system("cls");
if(result==-1){
cout"您的輸入有誤,請重新輸入!"endl;
}
elseif(result==0){
cout"你踩到雷啦!"endl;
Sleep(300);
cout"游戲即將結(jié)束!"endl;
Sleep(300);
cout"5!"endl;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 環(huán)保噴粉采購合同(標(biāo)準(zhǔn)版)5篇
- 2025漢中市石門水電建筑安裝有限公司招聘(4人)模擬試卷帶答案詳解
- 2025甘肅金昌市第二批引進(jìn)高層次和急需緊缺人才70人模擬試卷含答案詳解
- 2025年中共江西省委黨校(江西行政學(xué)院)高層次人才招聘27人模擬試卷及答案詳解(全優(yōu))
- 2025國網(wǎng)電力空間技術(shù)有限公司第二批高校畢業(yè)生錄用人選的考前自測高頻考點模擬試題有完整答案詳解
- 2025年河北唐山灤州市森林草原消防專業(yè)隊員招聘7人模擬試卷及參考答案詳解
- 2025廣西柳州市柳江中學(xué)參加廣西師范大學(xué)研究生畢業(yè)生春季專場雙選會11人考前自測高頻考點模擬試題及完整答案詳解
- 2025年威海榮成市教育和體育局公開招聘教師(53人)考前自測高頻考點模擬試題及一套完整答案詳解
- 2025春季中國東航北京分公司校園招聘模擬試卷及答案詳解(新)
- 2025廣東“百萬英才匯南粵”佛山市高明區(qū)選聘公辦初中校長9人考前自測高頻考點模擬試題及完整答案詳解一套
- DB15∕T 3843-2025 新能源分布式電源并網(wǎng)技術(shù)規(guī)范
- 《鋰電池的制造工藝》課件
- 海上風(fēng)電場安全監(jiān)測技術(shù)的現(xiàn)狀與未來發(fā)展趨勢
- 足浴前臺禮儀培訓(xùn)課件
- 村級財務(wù)業(yè)務(wù)知識培訓(xùn)課件
- 2025年幼兒園中、高級教師職稱考試(綜合素質(zhì))歷年參考題庫含答案詳解(5卷)
- 美術(shù)基礎(chǔ) 課件全套 第1-5章 美術(shù)簡介 -中國民間美術(shù)
- 2024人教版七年級生物下冊期末復(fù)習(xí)全冊考點背誦提綱
- 生物力學(xué)正畸方案優(yōu)化-洞察及研究
- 《中職工程測量技術(shù)專業(yè)《GNSS測量技術(shù)與應(yīng)用》課程標(biāo)準(zhǔn)》
- 公安部門大數(shù)據(jù)管理辦法
評論
0/150
提交評論