自定义头文件:
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define EAZY_COUNT 10
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);
void PrintSweepThunder(char board[ROWS][COLS], int row, int col);
void SetSweepThunder(char board[ROWS][COLS],int row,int col);
void FindSweepThunder(char SweepThunder1[ROW][COL], char SweepThunder2[ROW][COL], int row, int col);
//改进展开就用递归,改进的两个条件:1.坐标不是雷2.该坐标周围没有雷,不满足
主体文件:
#include"saolei.h"
void menu()
{
printf(" ************************** \n");
printf(" ****** 游戏名:乐乐扫雷 ****** \n");
printf(" ************* 1.play ************* \n");
printf("************** 0.exit **************\n");
printf("****** 作者:徽商职业学院乐乐 ******\n");
printf(" ********************************** \n");
}
void game()
{
char SweepThunder1[ROWS][COLS] = { 0 };
char SweepThunder2[ROWS][COLS] = { 0 };
InitBoard(SweepThunder1, ROWS, COLS, '0');
InitBoard(SweepThunder2, ROWS, COLS,'*');//这里也设置成11*11而不是9*9是为了两张盘对应坐标;
//PrintSweepThunder(SweepThunder1, ROW, COL);
PrintSweepThunder(SweepThunder2, ROW, COL);
SetSweepThunder(SweepThunder1, ROW, COL);
//PrintSweepThunder(SweepThunder1, ROW, COL);
FindSweepThunder(SweepThunder1,SweepThunder2, ROW, COL);
}
void main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("玩家请选择是否开始游戏:>");
scanf("%d", &input);
switch (input)
{
case 1:
printf("开始乐乐扫雷\n");
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("没有这个选项啦,重新选择(0/1)\n");
break;
}
} while (input);
}
函数实现:
#include"saolei.h"
void InitBoard(char board[ROWS][COLS], int rows, int cols,char set)
{
int i = 0;
int j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
board[i][j] = set;
}
}
}
void PrintSweepThunder(char board[ROWS][COLS], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i <= col; i++)
{
printf("%d ", i);
}
printf("\n");
for (i = 1; i <= row; i++)
{
printf("%d ",i);
for (j = 1; j <= col; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
}
void SetSweepThunder(char board[ROWS][COLS], int row, int col)
{
int count = EAZY_COUNT;//布置一个雷就count--
while (count)
{
int i = rand() % row + 1;
int j = rand() % col + 1;
if (board[i][j] == '0')
{
board[i][j] = '1';
count--;
}
}
}
//'1'-'0'=1;即:'a'-'0'=a;
int Get_Thunder_Counts(char SweepThunder1[ROWS][COLS], int x, int y)
{
//把周围8个字符数分别减去'0'转换成数字再加起来等于A就代表A,比分别判断8个是否为1方便;
return SweepThunder1[x - 1][y - 1] + SweepThunder1[x][y - 1] + SweepThunder1[x + 1][y - 1] +
SweepThunder1[x + 1][y] + SweepThunder1[x + 1][y + 1] + SweepThunder1[x][y + 1] +
SweepThunder1[x - 1][y + 1] + SweepThunder1[x][y - 1]-8*'0';
}
void FindSweepThunder(char SweepThunder1[ROWS][COLS], char SweepThunder2[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int win = 0;
while (win<row*col-EAZY_COUNT)
{
printf("请输入一个坐标:>");
scanf("%d%d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
//坐标合法;
//1.踩雷:
if (SweepThunder1[x][y] == '1')
{
printf("哈哈,你被炸了!!\n");
PrintSweepThunder(SweepThunder1, row, col);
break;
}
else//没踩到雷:
{
//统计周围有几个雷;
int count = Get_Thunder_Counts(SweepThunder1, x, y);
SweepThunder2[x][y] = count + '0';
PrintSweepThunder(SweepThunder2, row, col);
win++;
}
}
else
{
printf("输入坐标非法,请重新输入好不!\n");
}
}
if (win == row * col - EAZY_COUNT)
{
printf("害,乐乐的游戏难不倒你嘛,那只能恭喜你咯\n Victory!!\n雷阵为:");
PrintSweepThunder(SweepThunder2, row, col);
}
}
控制台实现效果: