提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
扫雷这个游戏很多人都玩过,我是写这个项目之前没玩过,所以还专门去查了下扫雷的一些游戏规则,今天就分享一下我的代码把,用的是vs,头文件和main 老规矩放最下面了/font>
提示:以下是本篇文章正文内容,下面案例可供参考
一、初始化地图
void initMap()
{
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
{
flagMap[i][j] = 0;
}
}
setMine();
}
首先做一个9 9 的地图,遍历二维数组,全部赋值为0,数组flagMap这个数组用来表示格子有没有被翻开,0表示没翻开,1表示翻开了
二、setMine函数
void setMine()
{
int countOfMine = 10;
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
{
if (countOfMine>0)
{
map[i][j] = 9;
countOfMine--;
}
else
{
map[i][j] = 0;
}
}
}
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
{
int x = rand() % 9;
int y = rand() % 9;
int temp = map[i][j];
map[i][j] = map[x][y];
map[x][y] = temp;
}
}
setMine函数在初始化地图最下面被调用了了,这是个布雷的函数,可以看到函数里面用的数组名为map,所以就像我上面说的一样,要用两个数组,一个数组表示格子有没有被翻开,另外一个数组表示格子的元素了,map[][]是第二者,在这里呢,设置了数字9为雷,0到8表示周围的雷的数量
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
{
if (map[i][j] != 9)
{
map[i][j] = getCountOfMineForPos(i, j);
}
}
}
}
这个部分用来计算每个点周围雷的数量,周围的范围就是以这个给点为中心的9宫格,getCountOfMineForPos函数在下面进行介绍
三、getCountOfMineForPos 函数
int getCountOfMineForPos(int x, int y)
{
int count = 0;
for (int i = -1; i <= 1; i++)
{
for (int j = -1; j <= 1; j++)
{
if (x + i<0 || x + i>8 || y + j<0 || y + j >8)
continue;
if (i == 0 && j == 0)
continue;
if (map[x + i][y + j] == 9)
count++;
}
}
return count;
}
getCountOfMineForPos函数用于获取指定位置雷的数量
三、渲染地图
void renderMap()
{
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
{
if (flagMap[i][j] == 0)
cout << "■";
else if (flagMap[i][j] == 1)
{
if (map[i][j] == 0)
cout << " ";
else if (map[i][j] == 9)
cout << "☆";
else
cout << map[i][j] << " ";
}
}
cout << endl;
}
}
四、f函数
void f(int x, int y)
{
map[x][y] = getCountOfMineForPos(x, y);
if (map[x][y] == 0)
{
flagMap[x][y] = 1;
for (int i = x - 1; i < x + 1; i++)
{
for (int j = y - 1; j < y + 1; j++)
{
if (x == i && y == j)
continue;
if (i<0 || i >8 || j<0 || j>8)
continue;
else if (map[i][j] == 0)
{
flagMap[i][j] = 1;
f(i, j);
}
else
{
continue;
}
}
}
}
}
f函数是一个递归函数,是用于格子的递归展开,就是一个点被翻开周围没有雷,那么对这个点周围的元素进行遍历,和它情况一样的都翻开
四、游戏更新
void GameUpdate()
{
int x, y;
cin >> x >> y;
if (map[x][y] == 9)
{
boom();
cout << "Game Over~~~" << endl;
isOver = true;
}
else
{
flagMap[x][y] = 1;
f(x, y);
}
}
上面用到的boom函数,就是当你翻到雷的时候,游戏失败了,显示出所有的雷
void boom()
{
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
{
if (map[i][j] == 9)
flagMap[i][j] = 1;
}
}
}
五、头文件和main函数
void GameInit();
void GameRender();
void GameUpdate();
void setMine();
void initMap();
int getCountOfMineForPos(int x, int y);
void renderMap();
void boom();
void f(int x,int y);
void game();
int main()
{
srand(time(nullptr));
int input = 0;
do{
cout << "*************************" << endl;
cout << "****1.开始游戏 2.清屏 ***" << endl;
cout << "**** 3.退出游戏 ***" << endl;
cout << "*************************" << endl;
cin >> input;
switch (input)
{
case 1:
game();
return 0;
break;
case 2:
system("cls");
break;
case 3:cout << "退出游戏" << endl;
return 0;
break;
default:
cout << "请重新输入" << endl;
Sleep(1000);
system("cls");
break;
}
} while (input);
}
六、总结
天气太热了,就直接把代码的整体发一下把
#include <iostream>
using namespace std;
#include "czl.h"
#include <time.h>
#include<Windows.h>
int map[9][9];
int flagMap[9][9];
bool isOver = false;
void initMap()
{
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
{
flagMap[i][j] = 0;
}
}
setMine();
}
void setMine()
{
int countOfMine = 10;
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
{
if (countOfMine>0)
{
map[i][j] = 9;
countOfMine--;
}
else
{
map[i][j] = 0;
}
}
}
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
{
int x = rand() % 9;
int y = rand() % 9;
int temp = map[i][j];
map[i][j] = map[x][y];
map[x][y] = temp;
}
}
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
{
if (map[i][j] != 9)
{
map[i][j] = getCountOfMineForPos(i, j);
}
}
}
}
int getCountOfMineForPos(int x, int y)
{
int count = 0;
for (int i = -1; i <= 1; i++)
{
for (int j = -1; j <= 1; j++)
{
if (x + i<0 || x + i>8 || y + j<0 || y + j >8)
continue;
if (i == 0 && j == 0)
continue;
if (map[x + i][y + j] == 9)
count++;
}
}
return count;
}
void renderMap()
{
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
{
if (flagMap[i][j] == 0)
cout << "■";
else if (flagMap[i][j] == 1)
{
if (map[i][j] == 0)
cout << " ";
else if (map[i][j] == 9)
cout << "☆";
else
cout << map[i][j] << " ";
}
}
cout << endl;
}
}
void GameInit()
{
initMap();
}
void GameRender()
{
system("CLS");
renderMap();
}
void GameUpdate()
{
int x, y;
cin >> x >> y;
if (map[x][y] == 9)
{
boom();
cout << "Game Over~~~" << endl;
isOver = true;
}
else
{
flagMap[x][y] = 1;
f(x, y);
}
}
void f(int x, int y)
{
map[x][y] = getCountOfMineForPos(x, y);
if (map[x][y] == 0)
{
flagMap[x][y] = 1;
for (int i = x - 1; i < x + 1; i++)
{
for (int j = y - 1; j < y + 1; j++)
{
if (x == i && y == j)
continue;
if (i<0 || i >8 || j<0 || j>8)
continue;
else if (map[i][j] == 0)
{
flagMap[i][j] = 1;
f(i, j);
}
else
{
continue;
}
}
}
}
}
void boom()
{
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
{
if (map[i][j] == 9)
flagMap[i][j] = 1;
}
}
}
void game()
{
GameInit();
GameRender();
while (!isOver)
{
GameUpdate();
GameRender();
}
system("pause");
}
int main()
{
srand(time(nullptr));
int input = 0;
do{
cout << "*************************" << endl;
cout << "****1.开始游戏 2.清屏 ***" << endl;
cout << "**** 3.退出游戏 ***" << endl;
cout << "*************************" << endl;
cin >> input;
switch (input)
{
case 1:
game();
return 0;
break;
case 2:
system("cls");
break;
case 3:cout << "退出游戏" << endl;
return 0;
break;
default:
cout << "请重新输入" << endl;
Sleep(1000);
system("cls");
break;
}
} while (input);
}
洗澡休息去了,这两天更新一下笔记,然后把自己写的魔塔游戏的项目也发一下,c++萌新,不足和错误还希望各位多多指出
|