1、C+扫雷程序输出报告材料程序输出报告程序设计时使用环境-Win10 VS20151程序设计思路模块化设计一个扫雷游戏。要实现埋雷,计算一个格子周围雷数,打开雷位,显示雷区几个功能.需要以下几个主要数据,判断雷位的雷是否存在,雷位周围的雷数,是否已经被打开,游戏是否结束,雷区大小,布雷量(本程序中非必须保存于类中数据)2功能的具体实现为了方便计算和理解先分出类class OneMine OneMine(); /雷位构造函数 void InitOneMine(); /初始化一个雷位 bool IsMine; /是否是雷 bool Opened; /是否已经打开 short AroundMines;
2、 /周边的雷数 friend class Operation; friend class Mines;class Mines/创建雷区类 bool GameOver; /扫雷是否结束 short Rows; /雷区的行数 short Cols; /雷区的列数 short MinesCount; /布设雷的数量 OneMine *pos5050; /存放雷对象的数组指针public: Mines(); /雷区类构造函数 Mines(); /析构函数 friend class Operation;class Operation :public Mines/操作类public: void ReIni
3、tMine(short row, short col, short mines); /重新初始化雷区 void LayOneMines(); /布置一个地雷 void CalculateAroundMine(int x, int y); /计算每个雷周边的雷数 void ShowOneMine(int x,int y); /触雷时的执行函数 void ShowMine(); /显示未触雷时的雷区情况 void ShowAllMine(); /触雷时的触发函数 void OpenOneMine(int x, int y); /打开一个雷位;实现埋雷/布一个地雷void Operation:Lay
4、OneMines() /布一个地雷 int m, n; do m = rand() % Cols + 1; n = rand() % Rows + 1; /随机产生雷位坐标 while (posmn-IsMine); posmn-IsMine = true;PS:rand()函数的输出是依赖于默认输入数据的,需要使用windows.h中的GetTickCount()函数来初始化实现计算格子周围雷数void Operation:CalculateAroundMine(int x, int y) /计算雷位周边雷数 int mines = 0; for (int i = x - 1; i = x
5、+ 1; i+) for (int j = y - 1; j IsMine; /利用IsMine数据的特性计算周围雷数 posxy-AroundMines = mines;实现打开雷位void Operation:OpenOneMine(int x, int y) /打开一个雷位 if (xCols | xRows | yOpened) return; /如果该位置已经打开,则返回 if (posxy-IsMine) /如果该雷位是地雷 ShowAllMine(); /找出所有的地雷,并显示出来 cout Opened = true; if (posxy-AroundMines = 0) /如
6、果该雷位周边的雷数为零,打开周边的雷位,采用递归调用的方法 if (x != 1) OpenOneMine(x - 1, y); /打开左边 if (x != Cols) OpenOneMine(x + 1, y); /打开右边 if (y != 1) OpenOneMine(x, y - 1); /打开上边 if (y != Rows) OpenOneMine(x, y + 1); /打开下边 if (x != 1 & y != 1) OpenOneMine(x - 1, y - 1); /打开左上 if (x != 1 & y != Rows) OpenOneMine(x - 1, y +
7、 1); /打开左下 if (x != Cols&y != 1) OpenOneMine(x + 1, y - 1); /打开右上 if (x != Cols&y != Rows)OpenOneMine(x + 1, y + 1); /打开右下 实现输出未触雷的雷区 void Operation:ShowMine() /显示雷区 int k = 0; /换行判定变量 if (GameOver = false) if (Rows = 10) cout ; cout ; for (int i = 1; i = Cols; i+) /输出横坐标 cout i = 10 & i 10) cout ;
8、for (int i = 1; i = Rows; i+) for (int j = 1; j = Cols; j+) if (k%Cols = 0) cout endl i % (Rows + 1) ; /纵坐标+按列 if (i = 10) cout = 10) cout Opened) cout AroundMines ; k+; else cout H ; k+; cout IsMine)/right cout M ; else cout AroundMines= 10) cout ; cout ; for (int i = 1; i = Cols; i+) /输出横坐标 cout i
9、 = 10 & i 10) cout ; for (int i = 1; i = Rows; i+) for (int j = 1; j = Cols; j+, k+) if (k%Cols = 0) cout endl i % (Rows + 1) ; /纵坐标+按列 if (i = 10) cout = 10) cout ; ShowOneMine(j, i); cout endl;3程序运行结果 4程序分析由于不是鼠标操作,加一道标记操作显得过于繁琐,所以没有加入标记地雷功能,也因此该地雷游戏其实没有完整的胜利途径.没有将雷区框架(即X-Y轴)输出函数化5程序改进思路加入标记地雷功能,使
10、用条件判断,每次输入打开行列坐标前,请求输入Y/N是否进行标记操作.对类进行详细分类,分别封装是否存雷类,是否打开类,是否结束游戏类.6附:完整源代码/ ConsoleApplication1.cpp : 定义控制台应用程序的入口点。/#include stdafx.h#include#include windows.husing namespace std;class OneMine OneMine(); /雷位构造函数 void InitOneMine(); /初始化一个雷位 bool IsMine; /是否是雷 bool Opened; /是否已经打开 short AroundMines
11、; /周边的雷数 friend class Operation; friend class Mines;class Mines/创建雷区类 bool GameOver; /扫雷是否结束 short Rows; /雷区的行数 short Cols; /雷区的列数 short MinesCount; /布设雷的数量 OneMine *pos5050; /存放雷对象的数组指针public: Mines(); /雷区类构造函数 Mines(); /析构函数 friend class Operation;class Operation :public Mines/操作类public: void ReIn
12、itMine(short row, short col, short mines); /重新初始化雷区 void LayOneMines(); /布置一个地雷 void CalculateAroundMine(int x, int y); /计算每个雷周边的雷数 void ShowOneMine(int x,int y); /触雷时的执行函数 void ShowMine(); /显示未触雷时的雷区情况 void ShowAllMine(); /触雷时的触发函数 void OpenOneMine(int x, int y); /打开一个雷位;OneMine:OneMine()/雷位构造函数 In
13、itOneMine();void OneMine:InitOneMine()/重新初始化一个雷位 IsMine = false; /雷位默认无雷 Opened = 0; /雷位默认未打开 AroundMines = 0; /雷位周围雷数默认为无Mines:Mines()/雷区构造函数 for (int i = 0; i50; i+) for (int j = 0; j50; j+) posji = new OneMine();Mines:Mines()/雷区析构函数 for (int i = 0; i50; i+) for (int j = 0; j50; j+) delete posji;v
14、oid Operation:ReInitMine(short row, short col, short mines)/重新初始化雷区 int i, j; GameOver = false; /游戏默认为未结束 Rows = row; Cols = col; /行数列数 MinesCount = mines; /初始雷数 for (i = 1; i = Rows; i+) /把所有的雷位地雷清除 for (j = 1; j InitOneMine(); /InitOneMine()为初始化雷位函数 srand(unsigned)GetTickCount(); /初始化产生随机数函数 for (
15、i = 0; iMinesCount; i+) /布置地雷 LayOneMines(); for (i = 1; i = Rows; i+) /计算每个雷位周边的雷数 for (j = 1; j IsMine); posmn-IsMine = true;void Operation:CalculateAroundMine(int x, int y) /计算雷位周边雷数 int mines = 0; for (int i = x - 1; i = x + 1; i+) for (int j = y - 1; j IsMine; /利用IsMine数据的特性计算周围雷数 posxy-AroundM
16、ines = mines;void Operation:ShowOneMine(int x,int y) /触发雷后显示一个雷 int i = x; int j = y; if (posij-IsMine)/right cout M ; /雷显示为M else cout AroundMines= 10) /适当输出空格使得雷区不至于变形(以下输出空格均属于此功能) cout ; cout ; for (int i = 1; i = Cols; i+) /输出横坐标 cout i = 10 & i 10) cout ; for (int i = 1; i = Rows; i+) for (int
17、 j = 1; j = Cols; j+, k+) if (k%Cols = 0) cout endl i % (Rows + 1) ; /纵坐标+按列 if (i = 10) cout = 10) cout ; ShowOneMine(j, i); cout = 10) cout ; cout ; for (int i = 1; i = Cols; i+) /输出横坐标 cout i = 10 & i 10) cout ; for (int i = 1; i = Rows; i+) for (int j = 1; j = Cols; j+) if (k%Cols = 0) cout endl
18、 i % (Rows + 1) ; /纵坐标+按列 if (i = 10) cout = 10) cout Opened) cout AroundMines ; k+; else cout H ; k+; cout Cols | xRows | yOpened) return; /如果该位置已经打开,则返回 if (posxy-IsMine) /如果该雷位是地雷 ShowAllMine(); /找出所有的地雷,并显示出来 cout Opened = true; if (posxy-AroundMines = 0) /如果该雷位周边的雷数为零,打开周边的雷位 if (x != 1) OpenOn
19、eMine(x - 1, y); /打开左边 if (x != Cols) OpenOneMine(x + 1, y); /打开右边 if (y != 1) OpenOneMine(x, y - 1); /打开上边 if (y != Rows) OpenOneMine(x, y + 1); /打开下边 if (x != 1 & y != 1) OpenOneMine(x - 1, y - 1); /打开左上 if (x != 1 & y != Rows) OpenOneMine(x - 1, y + 1); /打开左下 if (x != Cols&y != 1) OpenOneMine(x +
20、 1, y - 1); /打开右上 if (x != Cols&y != Rows)OpenOneMine(x + 1, y + 1); /打开右下 int main()/主函数 short row, col, mines; int x, y, i; Operation p; cout 请输入行、列、布雷数 row col mines; p.ReInitMine(row, col, mines); p.ShowMine(); for (i = 0; i = row*col; i+) /循环要求输入打开雷位并循环输出雷区 cout 请输入要打开的行、列坐标: y x; p.OpenOneMine(x, y); p.ShowMine(); cout endl; return 0;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1