一扫雷设计
1. 创建一个源文件用来完成游戏的逻辑结构
#include<stdio.h>
#include"game.h"
void game()
{
/*创建两个数组一个作为雷地布置棋盘,一个作为扫雷的效果棋盘*/
char mine[rows][cols] = { 0 };
char show[rows][cols] = { 0 };
/*初始化棋盘函数*/
initboard(mine, rows, cols,'0');
initboard2(show, row, col,'*');
/*布置棋盘函数*/
setboard(mine, row, col);
/*打印棋盘函数*/
displayboard(show, row, col);
//displayboard(mine, row, col);
/*排查雷函数*/
findbomb(mine, show, row, col);
}
void mun()
{
printf("**********************\n");
printf("*** 扣1 进入游戏 ****\n");
printf("*** 扣0 退出游戏 ****\n");
printf("**********************\n");
}
/*菜单打印*/
void test()
{
srand((unsigned int)time(NULL));
int input;
do
{
mun();
printf("请选择=>:");
scanf_s("%d", &input);
switch (input)
{
case 1:game();
break;
case 0:printf("退出游戏\n");
break;
default:printf("选择错误\n");
break;
}
} while (input);
}
/*菜单选择的逻辑*/
int main()
{
test();
return 0;
}
2. 创建头文件用来声明设计中用到的函数
#pragma once
#include<stdio.h>
#define row 9
#define col 9
#define rows row+2
#define cols col+2
#define bombcount 10
void initboard2(char arr[rows][cols], int ROW, int COL, char set);
void initboard(char arr[rows][cols], int ROWS, int COLS, char set);
void setboard(char arr[rows][cols], int ROW, int COL);
void displayboard(char arr[rows][cols], int ROW, int COL);
void findbomb(char arr1[rows][cols], char arr2[rows], int ROW, int COL);
int get(char arr[rows], int x, int y);
void extand(char arr1[rows][cols], char arr2[rows][cols], int x, int y);
3. 再创建一个game源文件用来定义设计中用到的函数
#include"game.h"
#include<stdlib.h>
#include<time.h>
#include<windows.h>
void initboard2(char arr[rows][cols], int ROW, int COL, char set)
{
int i, j;
for (i = 1; i <= ROW; i++)
{
for (j = 1; j <= COL; j++)
{
arr[i][j] = set;
}
}
for (i = 0; i < ROW + 2; i++)
{
arr[i][0] = '#';
arr[i][COL + 1] = '#';
}
for (j = 0; j < COL + 2; j++)
{
arr[0][j] = '#';
arr[ROW + 1][j] = '#';
}
}
/*初始化棋盘函数*/
void initboard(char arr[rows][cols],int ROWS,int COLS,char set)
{
int i,j;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
arr[i][j] = set;
}
}
}
/*布置棋盘函数*/
void setboard(char arr[rows][cols], int ROW, int COL)
{
int count = bombcount;
while (count)
{
int x = rand() % ROW + 1;
int y = rand() % COL + 1;
if (arr[x][y] == '0')
{
arr[x][y] = '1';
count--;
}
}
}
/*打印棋盘函数*/
void displayboard(char arr[rows][cols], int ROW, int COL)
{
int i,j;
printf("------扫雷游戏------\n");
for (i = 0; i <= col; i++)
printf("%2d", i);
printf("\n");
for (i = 1; i <= ROW; i++)
{
printf("%2d", i);
for (j = 1; j <= COL; j++)
printf("%2c", arr[i][j]);
printf("\n");
}
}
/*排查雷函数*/
void findbomb(char arr1[rows][cols], char arr2[rows][cols], int ROW, int COL)
{
int s;
int count = row*col-bombcount;
while (count)
{
printf("输入需要排查的位置(x,y)=>:");
int x, y, i, j;
scanf_s("%d%d", &x, &y);
system("cls");
if (x > 0 && x <= row && y > 0 && y <= col)
{
if (arr1[x][y] == '1')
{
printf("很遗憾你被炸死了\n");
printf("雷地分布是这样的:\n");
displayboard(arr1, row, col);
break;
}
else
{
extand(arr1, arr2, x, y);
displayboard(arr2, row, col);
count--;
}
}
else
{
printf("坐标输入错误\n");
continue;
}
}
if (count == 0)
printf("恭喜你排雷成功\n");
}
/*计算输入坐标周围雷的个数的函数*/
int get(char arr[rows][cols], int x, int y)
{
int s,i;
s = arr[x - 1][y - 1] + arr[x - 1][y] + arr[x - 1][y + 1] +
arr[x][y - 1] + arr[x][y + 1] +
arr[x + 1][y - 1] + arr[x + 1][y] + arr[x + 1][y + 1];
i = s - 8 * '0';
return i;
}
/*递归扩展函数*/
void extand(char arr1[rows][cols], char arr2[rows][cols], int x, int y)
{
int i, j;
int s = get(arr1, x, y);
if (s != 0)
arr2[x][y] = '0' + s;
else
{
arr2[x][y] = '0';
for (i = x - 1; i <= x + 1; i++)
{
for (j = y - 1; j <= y + 1; j++)
{
if(arr2[i][j]== '*'&&arr2[i][j]!='#')
extand(arr1, arr2, i, j);
}
}
}
}
二、扫雷优化
1、递归展开
- arr1为扫雷布置数组,arr2为扫雷效果数组,x y是排查坐标。
- get函数用来计算排查坐标周围8个位置雷的数量。
- 如果get为0进行循环递归,判断递归条件,if(arr2[i][j]== '*'&&arr2[i][j]!='#'),只有周围未被展开且周围不存在效果数组的边框 ’ # ‘才可进行递归。
void extand(char arr1[rows][cols], char arr2[rows][cols], int x, int y)
{
int i, j;
int s = get(arr1, x, y);
if (s != 0)
arr2[x][y] = '0' + s;
else
{
arr2[x][y] = '0';
for (i = x - 1; i <= x + 1; i++)
{
for (j = y - 1; j <= y + 1; j++)
{
if(arr2[i][j]== '*'&&arr2[i][j]!='#')
extand(arr1, arr2, i, j);
}
}
}
}
int get(char arr[rows][cols], int x, int y)
{
int s,i;
s = arr[x - 1][y - 1] + arr[x - 1][y] + arr[x - 1][y + 1] +
arr[x][y - 1] + arr[x][y + 1] +
arr[x + 1][y - 1] + arr[x + 1][y] + arr[x + 1][y + 1];
i = s - 8 * '0';
return i;
}
2、清除指令
#include<windows.h>
system("cls");
清除指令system("cls");需要包含头文件include<windows.h>。
把指令放在坐标输入之后,让程序运行时更加美观简约。
3、模式选择
还在研究
嘿嘿