有的时候闲下来写小游戏,挺不错的。扫雷游戏主要是二维数组,和图片加载,音乐播放,等实现。
思想:
比如 是12x12的扫雷区域,实际数组是14x14 二维数组的四周都有一个一个空格,,采用九宫格的思想。进行赋值,让后递归,便历
思想示意图如下
:
完成图如下:
核心代码如下:
//初始化数组为0
for (int i = 0; i < ROW + 2; i++){
for (int j = 0; j < COL + 2; j++){
map[i][j] = 0;
}
}
//随机设置一些雷 -1代表雷 多少个雷NUM
for (int i = 0; i < NUM;){ //10次
int r = rand() % ROW + 1; //随机得到行 //1-10
int c = rand() % COL + 1; //随机得到列 //1-10
if (map[r][c] == 0) //0
{
map[r][c] = -1;
i++;
}
}
//根据雷的分布 填充数组的数据
for (int i = 1; i <= ROW; i++){ //12 0-11 1-10
for (int j = 1; j <= COL; j++){ //遍历所有数组的元素
if (map[i][j] != -1){
//遍历9宫格 9宫格里面有多少个-1
for (int m = i - 1; m <= i + 1; m++){
for (int n = j - 1; n <= j + 1; n++){
//视频 源码 素材
if (map[m][n] == -1)
map[i][j]++;
}
}
}
}
}
//先给数组加密
for (int i = 1; i <= ROW; i++){ //辅助区 根据雷填充数字的时候
for (int j = 1; j <= COL; j++){
map[i][j] += 20;
}
}
win = 0; //点开一个格子 win+1 ROW*COL(格子的总数) - win点开的 = 雷的数量NUM
hwnd = GetHWnd();
}
//游戏的绘制
void GameDraw()
{
//打印数组 贴图
for (int i = 1; i <= ROW; i++){
for (int j = 1; j <= COL; j++){
if (map[i][j] >= 0 && map[i][j] <= 8) //0-8
putimage((i - 1)*SIZE, (j - 1)*SIZE, &img[map[i][j]]);
else if (map[i][j] == -1)
putimage((i - 1)*SIZE, (j - 1)*SIZE, &img[9]); //雷
else if (map[i][j] >= 19 && map[i][j]<=28)
putimage((i - 1)*SIZE, (j - 1)*SIZE, &img[10]); //加密
else if (map[i][j] >= 30) //只有在这种情况下
putimage((i - 1)*SIZE, (j - 1)*SIZE, &img[11]); //标记
}
}
}
//递归打开0
void OpenZero(int x,int y)
{
map[x][y] -= 20; //先翻开
win++;
//遍历9宫格
for (int i = x - 1; i <= x + 1; i++){
for (int j = y - 1; j <= y + 1; j++){
if (i >= 1 && i <= ROW&&j >= 1 && j <= COL)
{
if (map[i][j] >= 19 && map[i][j] <= 28)
{
if (map[i][j] != 20) //非0
{
map[i][j] -= 20;
win++;
}
else
{
OpenZero(i, j);
}
}
}
}
}