该版本较为基础,适合C语言小白,我在代码中放了很多注释供初学者参考,如果有不懂的地方欢迎评论留言!!!
一些小白可能不懂的点:
system("cls")清屏
system("pause");按任意键继续
该程序实现了扫雷的基本逻辑,但颜色单一,体验感不佳。可以进行相关颜色更改提高体验感。
初学者可以提高的点:
1.难度选择
2.标记功能
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 9
#define COL 9
#define ROWS 11
#define COLS 11
#define EASY 10
void menu()
{
printf("****************\n");
printf("*****1 play*****\n");
printf("****************\n");
printf("*****0 exit*****\n");
printf("****************\n");
}
void initArray(char arr[ROWS][COLS], char a)
{
for (int i = 0; i <ROWS; i++)
{
for (int j = 0; j < COLS; j++)
{
arr[i][j] = a;
}
}
}
void setMine(char arr[ROWS][COLS])//设置地雷
{
srand((unsigned int)time(NULL));
for (int i = 0; i < EASY; i++)
{
while (1)
{
int x = rand() % ROW + 1;
int y = rand() % COL + 1;
if (arr[x][y] != '1')//判断此处是否已被设为雷
{
arr[x][y] = '1';
break;
}
}
}
}
int getCount(char mine[ROWS][COLS], int x, int y)//周围有多少炸弹
{
//由于mine初始都为'0',炸弹为'1',根据ASCII码可知’0‘+1=’1‘
//所以只要把该位置周围的'0'和'1'相加再减去8个'0’就得到了该位置
//的炸弹数量
return mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1] +
mine[x][y - 1] + mine[x][y + 1] +
mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1] - 8 * '0';
}
void display(char arr[ROWS][COLS])//显示
{
printf("------------------------------------------\n");
printf(" ");
for (int i = 1; i <= ROW; i++)//设置列序号标记
{
printf("%d ", i);
}
printf("\n");
for (int i = 1; i <= ROW; i++)
{
printf("%d", i);//设置行序号标记
for (int j = 1; j <= COL; j++)
{
printf(" %c", arr[i][j]);
}
printf("\n");
}
printf("------------------------------------------\n");
}
void click(char mine[ROWS][COLS], char show[ROWS][COLS],int x,int y)//功能:点一下显示周围的炸弹,点到炸弹游戏结束,周围为0的位置用递归全部显现
{
if (x == 0 || x == COLS - 1 || y == 0 || y == ROWS - 1||show[x][y]!='?')//防止越界,同时防止重新点击已经点击过的位置
return;
show[x][y] = '0' + getCount(mine, x, y);
if (show[x][y] == '0')//这里相当于如果该地周围没炸弹,周围一定都可以点,所以自动点一遍,
//一直到周围的点上都有数字为止
{
click(mine, show, x - 1, y - 1);
click(mine, show, x - 1, y);
click(mine, show, x - 1, y + 1);
click(mine, show, x, y - 1);
click(mine, show, x, y + 1);
click(mine, show, x + 1, y - 1);
click(mine, show, x + 1, y);
click(mine, show, x + 1, y + 1);
}
}
void Judge(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)//判断是否胜利
{
if (mine[x][y] == '1')
{
system("cls");
printf("碰到炸弹了!\n");
show[x][y] = '!';
display(show);
system("pause");
exit(0);
}
int count = 0;
for(int i=1;i<=ROW;i++)
for (int j = 1; j <= COL; j++)
{
if (show[i][j] == '?')
count++;
}
if (count == EASY)
{
system("cls");
printf("胜利!!!\n");
system("pause");
exit(0);
}
}
void game(char mine[ROWS][COLS],char show[ROWS][COLS])
{
initArray(mine, '0');
initArray(show, '?');
setMine(mine);
while (1)
{
int x;
int y;
system("cls");
display(show);
do
{
printf("请输入行:");
scanf("%d", &x);
printf("请输入列:");
scanf("%d", &y);
if (x<1 || y<1 || x>ROW || y>COL)
{
printf("位置有误,请重新输入!\n");
continue;
}
click(mine, show, x, y);
Judge(mine, show, x, y);
system("cls");
display(show);
} while (1);
}
}
int main()
{
char mine[ROWS][COLS] = { 0 };
char show[ROWS][COLS] = { 0 };
menu();
int input;
do {
scanf("%d", &input);
if (input != 0 && input != 1)
{
printf("输入有误,请重新输入\n");
continue;
}
switch (input)
{
case 0:
exit(0);
break;
case 1:
game(mine, show);
break;
}
} while (1);
return 0;
}