資源簡介
掃雷游戲.cpp C++ 課程設計,注釋詳細,可以快速復制出一篇實習報告
代碼片段和文件信息
#include?
#include?
#include?
#include?
using?namespace?std;
class?Mine
{
public:
char?mine; //結點信息‘.‘為未翻開的結點,‘*‘為地雷,數字字符為個點翻開后周邊地雷數目?
bool?flg; //是否標記為雷
Mine()?:?mine(‘.‘)?flg(false)?{ }
};
class?CGame
{
public:
CGame(unsigned?int?x?=?8?unsigned?int?y?=?8?unsigned?int?m?=?20); //默認8行8列20個地雷?
virtual?~CGame()?
{
if(!map)
{
for(int?i?=?0;?i?!=?row;?++i)
delete?[]map[i];
}
delete?[]map;
}
void?initGame(); //初始化地圖?
void?print(); //顯示地圖?
bool?DoStep(); //是否繼續游戲?
void?FlgMine(int?x?int?y) //標記雷
{
if(map[x][y].mine?==?‘*‘?||?map[x][y].mine?==?‘.‘)
map[x][y].flg?=?!map[x][y].flg;
}
void?Open(int?x?int?y); //打開該結點
bool?Judge(); //判斷是否結束
void?Run(); //游戲運行
int?getmine(int?x?int?y); //獲取結點周邊地雷數目?
private:
unsigned?int?row?col; //地圖行列數?
unsigned?int?mines; //地雷數目 ?
?Mine?**map; //保存地圖的二維數組?
};
CGame::CGame(unsigned?int?x?unsigned?int?y?unsigned?int?m)
:?row(x)?col(y)?mines(m)?map(nullptr)
{
initGame();
}
void?CGame::initGame()
{
//根據行列數分配一個模擬的二維數組?
map?=?new?Mine*[row];
for(int?i?=?0;?i?!=?row;?++i)
map[i]?=?new?Mine[col];
//隨機布雷?
for(int?j?=?0;?j? {
int?x?=?0?y?=?0;
do
{
x?=?rand()?%?row;
y?=?rand()?%?col;
}while(map[x][y].mine?==?‘*‘);
map[x][y].mine?=?‘*‘;
}
}
void?CGame::print()
{
//打印列序號作為第一行?
cout?<“????“;
for(int?i?=?0;?i?!=?col;?++i)
cout?< cout?< //打印表格第一行?
cout?<“????“;
cout?<“┌“;
for(int?i?=?0;?i?!=?col;?++i)
{
if(i?!=?col?-?1)
cout?<“─┬“;
else
cout?<“─┐“;
}
cout?< //打印地圖信息?
for(int?i?=?0;?i?!=?row;?++i)
{
cout?< for(int?j?=?0;?j?!=?col;?++j)
{
if(map[i][j].flg?==?true) //如果這個點被標記為地雷,就輸出一個五角星號代表地雷?
cout?<“★│“;
else //沒有被標記?
{
if(map[i][j].mine?==?‘.‘?||?map[i][j].mine?==?‘*‘) //沒有被翻開的狀態顯示空白?
cout?<“??“?<“│“;
else //被翻開狀態,就顯示它周邊地雷數目?
cout?< }
}
cout?< if(i?!=?row?-?1)
{
cout?<“????├“;
for(int?i?=?0;?i?!=?col;?++i)
{
if(i?!=?col?-?1)
cout?<“─┼“;
else
cout?<“─┤“;
}
cout?< }
}
//打印表格最后一行?
cout?<“????“;
cout?<“└“;
for(int?i?=?0;?i?!=?col;?++i)
{
if(i?!=?col?-?1)
cout?<“─┴“;
else
cout?<“─┘“;
}
cout?<}
int?CGame::getmine(int?x?int?y)
{
//變量一個格子周邊8個格子,計算周邊地雷數目?
int?num?=?0;
//確定周邊格子的坐標以確保不會小于0和大于等于行列數?
int?x1?=?x?-?1?>?0???x?-?1?:?0;
int?x2?=?x?+?1? int?y1?=?y?-?1?>?0???y?-?1?:?0;
int?y2?=?y?+?1? for(int?i?=?x1;?i?<=?x2;?++i)
{
for(int?j?=?y1;?j?<=?y2;?++j)
{
if(map[i][j].mine?==?‘*‘) //計數?
++num;
}
}
return?num;
}
//打開一個格子,如果打開的格子周邊地雷數目為0,遞歸調用以打開跟它相連的格子?
void?CGame::Open(int?x?int?y) //打開該
評論
共有 條評論