扫雷游戏程序

时间:2023-01-11 12:03:30

程序大纲

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>

#include"game.h"


void menu()

{

printf("*******************************\n");

printf("************1.play*************\n");

printf("************0.exit******* *****\n");

printf("*******************************\n");

}


void game()

{

//1.布置好雷的信息

char mine[ROWS][COLS] = { 0 };

//2.摆查出雷的信息

char show[ROWS][COLS] = { 0 };

//初始化

InitBoard(mine, ROWS, COLS,'0');

InitBoard(show, ROWS, COLS,'*');

//打印棋盘

//DisplayBoard(mine,ROW,COL);

DisplayBoard(show, ROW, COL);

//布置雷

SetMine(mine, ROW, COL);

DisplayBoard(mine, ROW, COL);

//扫雷

FindMine(mine, show, ROW, COL);

}

void test()

{

int input = 0;

srand((unsigned int)time(NULL));//只能调用一次

do

{

 menu();

 printf("请选择:>");

       scanf("%d", &input);

 switch (input)

 {

 case 1:

  game();

  break;

 case 0:

  printf("退出游戏\n");

  break;

 default:

  printf("选择错误,重新选择!\n");

  break;

 }

} while (input);

}


int main()

{

test();

return 0;

}


函数声明

#define _CRT_SECURE_NO_WARNINGS 1


#include<stdio.h>//要把include库文件放到define前面,要不然自定义函数可能识别不了EASY_COUNT的值

#include<stdlib.h>

#include<time.h>


#define ROW 9

#define COL 9

#define ROWS ROW+2

#define COLS COL+2


#define EASY_COUNT 79




void InitBoard(char board[ROWS][COLS],int rows,int cols,char set);

void DisplayBoard(char board[ROWS][COLS], int row, int col);

void SetMine(char board[ROWS][COLS], int row, int col);

void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

void spread(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y);



函数定义

#include "game.h"


#define _CRT_SECURE_NO_WARNINGS 1


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;

 }

}

}




int get_mine_count(char mine[ROWS][COLS], int x, int y)

{

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 DisplayBoard(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++)//从1开始,到第9行,相当于数组中间

{

 printf("%d ", i);

 for (j = 1; j <= col; j++)//同理

 {

  printf("%c ", board[i][j]);

 }

 printf("\n");

}

}


void SetMine(char board[ROWS][COLS], int row, int col)//还是ROWS不打折

{

int count = EASY_COUNT;

while (count)

{

 int x = rand() % row + 1;//模出0-8,需要1-9还是数组中间

 int y = rand() % col + 1;

 if (board[x][y] == '0')

 {

  board[x][y] = '1';

  count--;

 }

}

}


void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)

{

int x = 0;

int y = 0;

int win = 0;

while (win<row*col-EASY_COUNT)

{

 printf("请输入排查雷的坐标:>");

       scanf("%d%d", &x, &y);

 if (x >= 1 && x <= row && y >= 1 && y <= col)

 {

  //坐标合法

  //1.踩雷

  if (mine[x][y] == '1')

  {

   printf("很遗憾,您被炸死了\n");

   DisplayBoard(mine, row, col);

   break;

  }

  else//不是雷

  {

   //计算x,y坐标周围有几个雷

   spread(mine, show, x, y);

   DisplayBoard(show, row, col);

   win++;

  }

 }

 else

 {

  printf("输入坐标非法,请重新输入!\n");

 }

 if (win == row * col - EASY_COUNT)

 {

  printf("恭喜你,排雷成功\n");

  DisplayBoard(mine, row, col);

 }

}


}


void spread(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)

{

int count = get_mine_count(mine, x, y);

if (count == 0)

{

 show[x][y] = ' ';

 int m = 0;//将i,j换成m,n可以正常运行,j的值循环的时候直接为2

 int n = 0;

 for(m=-1;m<=1;m++)

 {

  for (n =-1; n<= 1;n++)

  {

   if ((x + m > 0) && (y + n > 0) && (x + m < ROWS) && (y + n < COLS) && (show[x+m][y+n] == '*'))

   {

    DisplayBoard(show, ROW, COL);

    spread(mine, show, x + m, y + n);

   }

  }

 }

   

   

}

else

{

 show[x][y] = count + '0';

}

}