C++控制臺實現(xiàn)掃雷游戲_第1頁
C++控制臺實現(xiàn)掃雷游戲_第2頁
C++控制臺實現(xiàn)掃雷游戲_第3頁
C++控制臺實現(xiàn)掃雷游戲_第4頁
C++控制臺實現(xiàn)掃雷游戲_第5頁
已閱讀5頁,還剩9頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論