C语言实现扫雷游戏

[复制链接]
发表于 2024-9-15 16:05:15 | 显示全部楼层 |阅读模式

扫雷游戏概述以及运行效果

   如下图所示,用户输入1时开始游戏,输入0时退出游戏


    开始游戏后打印地雷图(本文以9*9的地雷图为例子),让用户选择要扫雷的坐标(x,y)
假如该位置没有雷,则在该位置打印围绕在该坐标的地雷数。假如附近的地雷数为0,则会自动检查(x-1,y-1),(x-1,y),(x-1,y+1),(x,y-1),(x,y+1),(x+1,y-1),(x+1,y),(x+1,y+1)附近的地雷数并以此类推,直至每个坐标附近都有地雷围绕。

    假如该位置有雷则输出“您踩到雷了,游戏失败”并将地雷图打印出来(数字1的地方是埋雷的地方,数字0的地方是没有雷的地方)进入下次游戏的选择。

    假如最终游戏胜利则输出恭喜您游戏胜利

  一、扫雷游戏所必要的函数的先容和实现

1.初始化埋下地雷的数组

   在本次游戏中我们将会创建两个二维数组
一个用于记录地雷埋下的位置(该数组初始化为0),坐标上为1的表示有雷,为0的表示无雷,如图所示

    一个用于(该数组全部初始化为星号)展示给玩家让玩家举行选择要对哪个位置举行扫雷

  1. void Init_board(char board[ROWS][COLS], int row, int col, char a)
  2. {
  3.         for (int i = 0; i < row; i++)
  4.         {
  5.                 for (int j = 0; j < col; j++)
  6.                 {
  7.                         board[i][j] = a;
  8.                 }
  9.         }
  10. }
复制代码
2.打印地雷图

   该函数用于打印如下所示的地雷图,供用户选择扫雷的坐标

  1. void print_board(char board[ROWS][COLS], int row, int col)
  2. {
  3.         printf("*************扫雷*************\n");
  4.         for (int i = 0; i <= col; i++)
  5.         {
  6.                 printf("%d ", i);
  7.         }
  8.         printf("\n");
  9.         for (int i = 1; i <= row; i++)
  10.         {
  11.                 printf("%d ", i);
  12.                 for (int j = 1; j <= col; j++)
  13.                 {
  14.                         printf("%c ",board[i][j]);
  15.                 }
  16.                 printf("\n");
  17.         }
  18.         printf("*************扫雷*************\n");
  19. }
复制代码
3.放置地雷

   该函数在传入的Myboard二维数组中埋下地雷,也就是使部分字符0用1取代
  1. srand((unsigned int)time(NULL));//与下图的rand()函数一起生成随机数
复制代码
  1. void Set_mine(char Myboard[ROWS][COLS])
  2. {
  3.         int count = Number_mine;
  4.         while (count)
  5.         {
  6.                 int x = rand() % 9 + 1;
  7.                 int y = rand() % 9 + 1;
  8.                 if (Myboard[x][y] == '0')
  9.                 {
  10.                         Myboard[x][y] = '1';
  11.                         count--;
  12.                 }
  13.         }
  14. }
复制代码
4.查找地雷

   使用递归的方法查找地雷
  1. int Sround_mine(char Myboard[ROWS][COLS], int x, int y)
  2. {
  3.         return (Myboard[x - 1][y - 1] + Myboard[x - 1][y] + Myboard[x - 1][y + 1] + Myboard[x][y - 1]
  4.                 + Myboard[x][y + 1] + Myboard[x + 1][y - 1] + Myboard[x + 1][y] + Myboard[x + 1][y + 1] - 8 * '0');
  5. }
  6. void Find_mine(char Myboard[ROWS][COLS], char Showboard[ROWS][COLS], int x, int y,int row,int col)
  7. {
  8.         if (Showboard[x][y] != '*')
  9.                 return ;
  10.         int ret = Sround_mine(Myboard, x, y);
  11.         if (ret == 0)
  12.         {
  13.                 Showboard[x][y] = ret + '0';
  14.                 Sum++;
  15.                 for (int i = x - 1; i <= x + 1; i++)
  16.                 {
  17.                         if (i >= 1 && i <= 9)
  18.                         {
  19.                                 for (int j = y - 1; j <= y + 1; j++)
  20.                                 {
  21.                                         if (j >= 1 && j <= 9)
  22.                                         {
  23.                                                 if (i == x && j == y)
  24.                                                         continue;
  25.                                                 else
  26.                                                 {
  27.                                                         Find_mine(Myboard, Showboard, i, j, row, col);
  28.                                                 }
  29.                                         }
  30.                                 }
  31.                         }
  32.                 }
  33.         }
  34.         else
  35.         {
  36.                 Showboard[x][y] = ret + '0';
  37.                 Sum++;
  38.         }
  39. }
复制代码
游戏的工程文件

1.game.h

  1. #define _CRT_SECURE_NO_WARNINGS 1
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <time.h>
  5. #define ROW 9//定义该游戏为9*9的布局
  6. #define COL 9
  7. #define ROWS ROW+2//增加一层边界,便于游戏实现
  8. #define COLS COL+2
  9. #define Number_mine 9//埋下地雷的数目
  10. int Sum;//用于记录已经扫出来多少个没有雷的坐标,当Sum==ROW*COL-Number_mine时游戏结束
  11. void Init_board(char board[ROWS][COLS], int row, int col, char a);//初始化两个二维数组
  12. void print_board(char board[ROWS][COLS], int row, int col);//打印两个二维数组
  13. void Set_mine(char Myboard[ROWS][COLS]);//放置雷
  14. int Sround_mine(char Myboard[ROWS][COLS], int x, int y);//判断一个坐标周围的雷
  15. void Find_mine(char Myboard[ROWS][COLS],char Showboard[ROWS][COLS], int x, int y,int row,int col);//查找雷
复制代码
2.test.c

  1. #define _CRT_SECURE_NO_WARNINGS 1
  2. #include "game.h"
  3. void menu()
  4. {
  5.         printf("**************************\n");
  6.         printf("*********1.play***********\n");
  7.         printf("*********0.exit***********\n");
  8.         printf("**************************\n");
  9. }
  10. void play_game(char Myboard[ROWS][COLS],char Showboard[ROWS][COLS],int row,int col)
  11. {
  12.         while (1)
  13.         {
  14.                 printf("请输入您要选择的坐标:");
  15.                 int x = 0, y = 0;
  16.                 scanf("%d %d", &x, &y);
  17.                 if (x >= 1 && x <= row && y >= 1 && y <= col)
  18.                 {
  19.                         if (Myboard[x][y] == '1')
  20.                         {
  21.                                 printf("您踩到雷了,游戏失败\n");
  22.                                 print_board(Myboard, ROW, COL);
  23.                                 break;
  24.                         }
  25.                         if (Showboard[x][y] == '*')
  26.                         {
  27.                                 Find_mine(Myboard,Showboard, x, y,ROW,COL);
  28.                                 //int ret = Find_mine(Myboard, x, y);
  29.                                 //Showboard[x][y] = ret + '0';
  30.                                 print_board(Showboard, ROW, COL);
  31.                                 //print_board(Myboard, ROW, COL);
  32.                                 if (Sum >= row * col - Number_mine)
  33.                                 {
  34.                                         break;
  35.                                 }
  36.                         }
  37.                         else
  38.                         {
  39.                                 printf("该位置已经检查过,请重新输入\n");
  40.                                 continue;
  41.                         }
  42.                 }
  43.                 else
  44.                 {
  45.                         printf("输入不合法,请重新输入\n");
  46.                 }
  47.         }
  48.         if (Sum == row * col - Number_mine)
  49.         {
  50.                 printf("恭喜您游戏胜利\n");
  51.                 printf("地雷放置图如下:\n");
  52.                 print_board(Myboard, ROW, COL);
  53.         }
  54. }
  55. void game()
  56. {
  57.         printf("开始游戏\n");
  58.         char Myboard[ROWS][COLS] = { 0 };
  59.         Init_board(Myboard, ROWS, COLS, '0');
  60.         char Showboard[ROWS][COLS] = { 0 };
  61.         Init_board(Showboard, ROWS, COLS, '*');
  62.         //print_board(Myboard, ROW, COL);
  63.         print_board(Showboard, ROW, COL);
  64.         Set_mine(Myboard);
  65.         print_board(Myboard, ROW, COL);
  66.         //进入扫雷
  67.         play_game(Myboard,Showboard,ROW,COL);
  68. }
  69. void test()
  70. {
  71.         int n = 0;
  72.         srand((unsigned int)time(NULL));
  73.         do {
  74.                 menu();
  75.                 printf("请输入您选择的数字:");
  76.                 scanf("%d", &n);
  77.                 switch (n)
  78.                 {
  79.                 case 1:
  80.                         Sum = 0;
  81.                         game();
  82.                         break;
  83.                 case 0:
  84.                         printf("退出游戏\n");
  85.                         break;
  86.                 default:
  87.                         printf("输入错误,请重新输入\n");
  88.                         break;
  89.                 }
  90.         }while (n);
  91. }
  92. int main()
  93. {
  94.         test();
  95.         return 0;
  96. }
复制代码
3.game.c

  1. #define _CRT_SECURE_NO_WARNINGS 1#include "game.h"void Init_board(char board[ROWS][COLS], int row, int col, char a)
  2. {
  3.         for (int i = 0; i < row; i++)
  4.         {
  5.                 for (int j = 0; j < col; j++)
  6.                 {
  7.                         board[i][j] = a;
  8.                 }
  9.         }
  10. }
  11. void print_board(char board[ROWS][COLS], int row, int col)
  12. {
  13.         printf("*************扫雷*************\n");
  14.         for (int i = 0; i <= col; i++)
  15.         {
  16.                 printf("%d ", i);
  17.         }
  18.         printf("\n");
  19.         for (int i = 1; i <= row; i++)
  20.         {
  21.                 printf("%d ", i);
  22.                 for (int j = 1; j <= col; j++)
  23.                 {
  24.                         printf("%c ",board[i][j]);
  25.                 }
  26.                 printf("\n");
  27.         }
  28.         printf("*************扫雷*************\n");
  29. }
  30. void Set_mine(char Myboard[ROWS][COLS])
  31. {
  32.         int count = Number_mine;
  33.         while (count)
  34.         {
  35.                 int x = rand() % 9 + 1;
  36.                 int y = rand() % 9 + 1;
  37.                 if (Myboard[x][y] == '0')
  38.                 {
  39.                         Myboard[x][y] = '1';
  40.                         count--;
  41.                 }
  42.         }
  43. }
  44. int Sround_mine(char Myboard[ROWS][COLS], int x, int y)
  45. {
  46.         return (Myboard[x - 1][y - 1] + Myboard[x - 1][y] + Myboard[x - 1][y + 1] + Myboard[x][y - 1]
  47.                 + Myboard[x][y + 1] + Myboard[x + 1][y - 1] + Myboard[x + 1][y] + Myboard[x + 1][y + 1] - 8 * '0');
  48. }
  49. void Find_mine(char Myboard[ROWS][COLS], char Showboard[ROWS][COLS], int x, int y,int row,int col)
  50. {
  51.         if (Showboard[x][y] != '*')
  52.                 return ;
  53.         int ret = Sround_mine(Myboard, x, y);
  54.         if (ret == 0)
  55.         {
  56.                 Showboard[x][y] = ret + '0';
  57.                 Sum++;
  58.                 for (int i = x - 1; i <= x + 1; i++)
  59.                 {
  60.                         if (i >= 1 && i <= 9)
  61.                         {
  62.                                 for (int j = y - 1; j <= y + 1; j++)
  63.                                 {
  64.                                         if (j >= 1 && j <= 9)
  65.                                         {
  66.                                                 if (i == x && j == y)
  67.                                                         continue;
  68.                                                 else
  69.                                                 {
  70.                                                         Find_mine(Myboard, Showboard, i, j, row, col);
  71.                                                 }
  72.                                         }
  73.                                 }
  74.                         }
  75.                 }
  76.         }
  77.         else
  78.         {
  79.                 Showboard[x][y] = ret + '0';
  80.                 Sum++;
  81.         }
  82. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

快速回复 返回顶部 返回列表