自定义头文件:

#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);

}

}


控制台实现效果:

作业:C语言扫雷_#include