1,游戏操作规则
1) 点击模式:通过输入d+下标+下标 进行点击相对应方块.(由于没加入鼠标操作就只能这样了)
2)标记模式:通过输入f+下标+下标 进行标记对应方块
3)检测模式:通过输入s+任意下标+任意下标 如果雷全部被标记则游戏结束
2,演示页面
点击
标记
3,制作实现步骤:
1)申请内存,并进行数组的初始化(为0)
2)随机雷的位置
3)将为雷周围添加标记
◆表示雷,□表示空白(即周围没雷)
4)将上述页面翻转隐藏
5)设置点击翻转,如果点到数字①②③④⑤⑥⑦⑧则只翻转本身,如果点到空白□则翻转周围8个框
6)再进行扩散性翻转,如果周围八个中还有空白□,则递归继续翻周围,如果不是空白□则不继续递归翻周围!
7)设置标记功能
8)设置游戏游戏结束.....
4,源码
#include<iostream>
using namespace std;
int isgameOver = false;//判断是否结束游戏
int Num = 0;//雷的数量
int COL = 0;//存储地图列数大小
int ROW = 0;//储存地图行数
int** GetMemory(int row, int col);//给地图(二维数组)申请内存
void InitMap(int** pp, int row, int col, int num);//初始化数组000,并随机布置num个雷!
void PrintMarry(int** pp, int row, int col);//打印出数组
void FlagMap(int** pp, int row, int col);//给找到雷,然后做数字标记,确定地图
void MarkAround(int** pp, int row, int col, int x, int y);//将雷周围标记
void DrawMap(int** pp, int row, int col);//绘制地图
void HideMap(int** pp, int row, int col);//隐藏地图
void ShowMap(int** pp, int row, int col, int x, int y,char mode);//点击翻开单个地图
void Spread(int** pp, int row, int col, int x, int y);//扩散性翻开空白地图
void Failure(int** pp, int row, int col);//游戏失败
void IsSuccessful(int** pp, int row, int col);//判断游戏是否成功
void PrintX(int col);//打印列数,显示X坐标
void FreeMemory(int **&pp, int row);//游戏结束释放内存
int main()
{
srand((unsigned)time(NULL));//随机种子
int** pp = GetMemory(20, 20);
InitMap(pp, 20, 20, 25);//编辑地图设置雷数量
PrintMarry(pp, 20, 20);//打印数组 -1代表雷
cout << endl;
FlagMap(pp, 20, 20);
HideMap(pp, 20, 20);
PrintX(COL);//显示X坐标系
DrawMap(pp, 20, 20);
while (true)
{
int x,y;
char mode;
cin >>mode>> y >> x;
y--, x--;
ShowMap(pp, 20, 20, (x), (y),mode);
if (pp[x][y] == -1)
{
Failure(pp, 20, 20);//结束游戏
PrintX(COL);//显示X坐标系
DrawMap(pp, 20, 20);//打印地图
FreeMemory(pp, 20);//内存释放
break;//跳出死循环
}
else
{
if (isgameOver)
{
FreeMemory(pp, 20);
break;
}
PrintX(COL);//显示X坐标系
DrawMap(pp, 20, 20);//重新打印地图
}
}
system("pause");
return 0;
}
//给地图(二维数组)申请内存
int** GetMemory(int row, int col)
{
//给每一行的首地址申请内存
int** pp = new int* [row];
for (int i = 0; i < row; i++)
{
//给每一行中的元素申请内存
pp[i] = new int[col];
}
return pp;
}
//初始化数组,给其行列row,num进行赋值,并随机布置num个雷!
void InitMap(int** pp, int row, int col, int num)
{
Num = num;//记录有多少个雷
COL = col;//记录有多少列
ROW = row;//记录地图行数
for (int i = 0; i < row; i++)
{
for (int k = 0; k < col; k++)
{
if (num > 0)
{
pp[i][k] = -1;//雷用-1表示
num--;//布置一个则数量减少
}
else {
pp[i][k] = 0;//其他则用雷表示
}
}
}
for (int i = 0; i < row; i++)
{
for (int k = 0; k < col; k++)
{
int r = rand() % row;
int c = rand() % col;
int flag = pp[r][c];
pp[r][c] = pp[i][k];
pp[i][k] = flag;
}
}
}
//打印出数组
void PrintMarry(int** pp, int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int k = 0; k < col; k++)
{
printf("%2d", pp[i][k]);
}
cout << endl;
}
}
//给找到雷,然后做数字标记,确定地图
void FlagMap(int** pp, int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int k = 0; k < col; k++)
{
if (pp[i][k] == -1)//找到雷
{
MarkAround(pp,row,col, i, k);//标记周围
}
}
}
}
//将雷周围标记
void MarkAround(int** pp, int row, int col, int x, int y)
{
for (int i = x-1; i <=x+1; i++)
{
for (int k = y-1; k <=y+1; k++)
{
if(i>=0&&i<row&&k>=0&&k<col&&pp[i][k]!=-1)
pp[i][k]++;
}
}
}
//绘制地图
void DrawMap(int** pp, int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int k = 0; k < col; k++)
{
switch (pp[i][k])
{
case -1:
cout << "◆";
break;
case 0:
cout << "□";
break;
case 1:
cout << "①";
break;
case 2:
cout << "②";
break;
case 3:
cout << "③";
break;
case 4:
cout << "④";
break;
case 5:
cout << "⑤";
break;
case 6:
cout << "⑥";
break;
case 7:
cout << "⑦";
break;
case 8:
cout << "⑧";
break;
case 9:
case 10:
case 11:
case 12:
case 13:
case 14:
case 15:
case 16:
case 17:
case 18:
cout << "★";
break;
default:
cout << "■";
break;
}
}
cout << i+1;
cout << endl;
}
}
//隐藏地图
void HideMap(int** pp, int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int k = 0; k < col; k++)
{
pp[i][k] += 20;
}
}
}
//模式切换:d点击翻开,f对雷标记
void ShowMap(int** pp, int row, int col, int x, int y,char mode)
{
// x >= 0 && y >= 0 && x < row && y < col防止输入越界
if (pp[x][y] >= 19&&(mode=='d'||mode=='D') && x >= 0 && y >= 0 && x < row && y < col)//点击翻开,
{
pp[x][y] -= 20;
Spread(pp, row, col, x, y);
}
else if (mode == 'f' || mode == 'F' && x >= 0 && y >= 0 && x < row && y < col)
{
if (pp[x][y] >= 19)
{
pp[x][y] -= 10;
}
else if(pp[x][y]>=9)
{
pp[x][y] += 10;
}
}
else if(mode=='s'||mode=='S')
{
cout << "检测模式:" << endl;
IsSuccessful(pp, row, col);
}
else {
cout << "输入格式错误!" << endl;
}
}
//扩散性翻开空白地图
void Spread(int** pp, int row, int col, int x, int y)
{
if (pp[x][y]==0)//如果被翻开
{
for (int i = x-1; i <=x+1; i++)
{
for (int k = y-1; k <= y+1; k++)
{
//pp[i][k] >= 19排除被翻开的,以及不能越界,不能为自身
if ((i != x || k != y) && i >= 0 && i < row && k >= 0 && k < col &&pp[i][k]>=19)
{
pp[i][k] -= 20;
Spread(pp, row, col, i, k);
}
}
}
}
}
//游戏失败
void Failure(int** pp, int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int k = 0; k < col; k++)
{
if (pp[i][k] == 19)
{
pp[i][k] = -1;//将雷显示出来
}
}
}
cout << "游戏失败!"<<endl;
}
//判断游戏是否成功
void IsSuccessful(int** pp, int row, int col)
{
int count = 0;//用于判断标记的雷和实际数量是否相等
for (int i = 0; i < row; i++)
{
for (int k = 0; k < col; k++)
{
if (pp[i][k] == 9)//标记的雷
count++;
}
}
if (count == Num)
{
cout << "恭喜你成功过关!" << endl;
isgameOver = true;//用于跳出游戏
}
}
void PrintX(int col)//打印列数
{
for (int i = 1; i <= col; i++)
{
if (i > 100)
{
i = i % 100;
}
printf("%2d", i);
}
cout <<endl;
}
void FreeMemory(int **&pp, int row)//游戏结束释放内存
{
for (int i = 0; i < row; i++)
{
delete[] pp[i];
}
delete[] pp;
pp = nullptr;
cout << "内存释放完成!";
}