当前位置: 首页 > 编程笔记 >

C语言 扫雷程序的实现

淳于恺
2023-03-14
本文向大家介绍C语言 扫雷程序的实现,包括了C语言 扫雷程序的实现的使用技巧和注意事项,需要的朋友参考一下

C语言 扫雷程序的实现

这个游戏可以实现根据选择坐标后所显示无雷区范围的不同分为简单 ,普通和困难

游戏程序中,实现了游戏的计时(分钟)功能,实现了扫雷游戏的最基础功能。

 定义了一个9*9的棋盘,玩家只要根据提示选择游戏,和难度;

 根据提示输入 合法的坐标,如输入不合法则会进行提示;

 扫雷结束则会提示;如触雷则游戏自动结束;

整个游戏设计中主要的函数为:

1、初始化地雷棋盘和显示棋盘

2、棋盘打印函数

3、扫雷函数的实现

4、游戏主函数

大家可以在宏定义中改变棋盘大小,雷的个数,以及显示的无雷区范围。

废话不说 直接上代码:(未优化,请多包涵 )

<pre name="code" class="objc">#ifndef __MINE_H__ 
#define __MINE_H__ 
 
#define LINES 11     // 棋盘的行 
#define ROWS 11     // 棋盘的列 
#define mine_MAX 10    // 雷的数目 
#define EAXY 3      // 简单显示的范围 
#define COMMON 2     // 普通显示的范围 
#define DIFFICULT 1     // 困难显示的范围 
 
enum op 
{ 
 EXIT, 
 PLAY 
}; 
void game(char mine[LINES][ROWS],char text[LINES][ROWS],int lines,int rows);  //游戏基本实现函数 
void init_mine(char mine[LINES][ROWS],char text[LINES][ROWS],int lines,int rows);// 初始化棋盘函数 
void play_EAXY_game(char mine[LINES][ROWS],char text[LINES][ROWS]);    // 简单游戏函数 
void play_COMMON_game(char mine[LINES][ROWS],char text[LINES][ROWS]) ;   //普通游戏函数 
void play_DIFFICULT_game(char mine[LINES][ROWS],char text[LINES][ROWS]) ;  //困难游戏函数 
void mine_EAXY_sweep(char mine[LINES][ROWS],char text[LINES][ROWS]);    //简单扫雷实现 
void mine_COMMON_sweep(char mine[LINES][ROWS],char text[LINES][ROWS]);   //普通扫雷实现 
void mine_DIFFICULT_sweep(char mine[LINES][ROWS],char text[LINES][ROWS]) ;  //困难扫雷实现 
void print(char tab[LINES][ROWS]); //打印棋盘 
 
#endif 
#include<stdio.h> 
#include"mine.h" 
#include<stdlib.h> 
#include<time.h> 
void init_mine(char mine[LINES][ROWS],char text[LINES][ROWS],int lines,int rows)  //初始化显示棋盘和雷盘 
{ 
 int i; 
 int j; 
 int a; 
 int b; 
 int count=0; 
 for(i=1; i<LINES-1;i++)   //初始化显示棋盘 
 { 
  for(j=1; j<ROWS-1;j++) 
  { 
   text[i][j]='*'; 
  } 
 } 
 for(i=1; i<LINES-1;i++)   //初始化雷盘 
 { 
  for(j=1; j<ROWS-1;j++) 
  { 
   mine[i][j]='1'; 
  } 
 } 
 srand((unsigned)time(NULL)); //随机产生两个数 
 while(count<mine_MAX) 
 { 
  a = rand()%9 + 1; 
  b = rand()%9 + 1; 
  if(mine[a][b]!='0') 
  { 
   mine[a][b]='0';    //定义雷为字符 0 
   count++; 
  } 
 } 
} 
void print(char tab[LINES][ROWS])      //打印棋盘函数 
{ 
 int i;  //行 
 int j;  //列 
 
 for(i=0;i<LINES-1;i++)  //定义第一行的打印 
 { 
  printf("%d ",i); 
 } 
 printf("\n"); 
 for(i=1; i<LINES-1;i++)  //输出棋盘 
 { 
  printf("%d",i); 
  printf("%c",'|'); 
  for(j=1; j<ROWS;j++) 
  { 
   printf("%c ",tab[i][j]); 
  } 
  printf("\n"); 
 } 
 
} 
void mine_EAXY_sweep(char mine[LINES][ROWS],char text[LINES][ROWS])    //简单整个游戏进程 
{ 
 int a; 
 int b; 
 int count = 0;  // 雷的个数 
 do     //是否将雷全部扫完 
 { 
  int i; 
  int j; 
  int x; 
  int y; 
  print(text); 
  print(mine); 
flag:  printf("请输入坐标=》"); 
  scanf("%d %d",&a,&b); 
  if(a>(LINES-2) || a<0 || b<0 || b>(ROWS-2) || text[a][b]!='*') 
   { 
    printf("输入不合法!\n"); 
    goto flag; 
  } 
  else 
 if(mine[a][b]=='0')   //判断是否触雷 
 { 
  printf("您踩雷了!\n"); 
  break; 
 } 
 else 
 { 
  for(i=(a-EAXY);i<=(a+EAXY);i++) 
  { 
    for(j=(b-EAXY);j<=(b+EAXY);j++) 
    { 
     if(mine[i][j]=='1') 
     { 
      int x=0;         //周围雷的数量 
      if(mine[i-1][j-1]=='0') 
      { 
       x++; 
      } 
       if(mine[i-1][j]=='0') 
      { 
       x++; 
      }  
       if(mine[i-1][j+1]=='0') 
      { 
       x++; 
      }  
       if(mine[i][j-1]=='0') 
      { 
       x++; 
      }  
       if(mine[i][j+1]=='0') 
      { 
       x++; 
      }  
       if(mine[i+1][j-1]=='0') 
      { 
       x++; 
      }  
       if(mine[i+1][j]=='0') 
      { 
       x++; 
      }  
       if(mine[i+1][j+1]=='0') 
      { 
       x++; 
      }  
       text[i][j]=(x+'0'); 
     } 
 
    } 
  } 
 } 
  for(x=1;x<=(LINES-2);x++) 
  { 
   for(y=1;y<=(ROWS-2);y++) 
   { 
    if(text[x][y]=='*') 
     count++; 
   } 
  } 
  
 }while(count>mine_MAX); 
 if(count==mine_MAX) 
 { 
  printf("恭喜你 扫雷成功!\n"); 
 } 
} 
void mine_COMMON_sweep(char mine[LINES][ROWS],char text[LINES][ROWS])    //普通整个游戏进程 
{ 
 int a; 
 int b; 
 int count; 
 do     //是否将雷全部扫完 
 { 
  int i; 
  int j; 
  int x; 
  int y; 
   count = 0;  // 雷的个数 
  print(text); 
  print(mine); 
flag:  printf("请输入坐标=》"); 
  scanf("%d %d",&a,&b); 
  if(a>(LINES-2) || a<0 || b<0 || b>(ROWS-2) || text[a][b]!='*') 
   { 
    printf("输入不合法!\n"); 
    goto flag; 
  } 
  else 
 if(mine[a][b]=='0')   //判断是否触雷 
 { 
  printf("您踩雷了!\n"); 
  break; 
 } 
 else 
 { 
  for(i=(a-COMMON);i<=(a+COMMON);i++) 
  { 
    for(j=(b-COMMON);j<=(b+COMMON);j++) 
    { 
     if(mine[i][j]=='1') 
     { 
      int x=0;         //周围雷的数量 
      if(mine[i-1][j-1]=='0') 
      { 
       x++; 
      } 
       if(mine[i-1][j]=='0') 
      { 
       x++; 
      }  
       if(mine[i-1][j+1]=='0') 
      { 
       x++; 
      }  
       if(mine[i][j-1]=='0') 
      { 
       x++; 
      }  
       if(mine[i][j+1]=='0') 
      { 
       x++; 
      }  
       if(mine[i+1][j-1]=='0') 
      { 
       x++; 
      }  
       if(mine[i+1][j]=='0') 
      { 
       x++; 
      }  
       if(mine[i+1][j+1]=='0') 
      { 
       x++; 
      }  
       text[i][j]=(x+'0'); 
     } 
 
    } 
  } 
  print(text); 
 } 
  for(x=1;x<=(LINES-2);x++) 
  { 
   for(y=1;y<=(ROWS-2);y++) 
   { 
    if(text[x][y]=='*') 
     count++; 
   } 
  } 
  
 }while(count>mine_MAX); 
 if(count==mine_MAX) 
 { 
  printf("恭喜你 扫雷成功!\n"); 
 } 
} 
void mine_DIFFICULT_sweep(char mine[LINES][ROWS],char text[LINES][ROWS])    //困难整个游戏进程 
{ 
 int a; 
 int b; 
 int count ;  // 雷的个数 
 do     //是否将雷全部扫完 
 { 
  int i; 
  int j; 
  int x; 
  int y; 
  count = 0; 
  print(text); 
  print(mine); 
flag:  printf("请输入坐标=》"); 
  scanf("%d %d",&a,&b); 
  if(a>(LINES-2) || a<0 || b<0 || b>(ROWS-2) || text[a][b]!='*') 
   { 
    printf("输入不合法!\n"); 
    goto flag; 
  } 
  else 
 if(mine[a][b]=='0')   //判断是否触雷 
 { 
  printf("您踩雷了!\n"); 
  break; 
 } 
 else 
 { 
  for(i=(a-DIFFICULT);i<=(a+DIFFICULT);i++) 
  { 
    for(j=(b-DIFFICULT);j<=(b+DIFFICULT);j++) 
    { 
     if(mine[i][j]=='1') 
     { 
      int x=0;         //周围雷的数量 
      if(mine[i-1][j-1]=='0') 
      { 
       x++; 
      } 
       if(mine[i-1][j]=='0') 
      { 
       x++; 
      }  
       if(mine[i-1][j+1]=='0') 
      { 
       x++; 
      }  
       if(mine[i][j-1]=='0') 
      { 
       x++; 
      }  
       if(mine[i][j+1]=='0') 
      { 
       x++; 
      }  
       if(mine[i+1][j-1]=='0') 
      { 
       x++; 
      }  
       if(mine[i+1][j]=='0') 
      { 
       x++; 
      }  
       if(mine[i+1][j+1]=='0') 
      { 
       x++; 
      }  
       text[i][j]=(x+'0'); 
     } 
 
    } 
  } 
  print(text); 
 } 
  for(x=1;x<=(LINES-2);x++) 
  { 
   for(y=1;y<=(ROWS-2);y++) 
   { 
    if(text[x][y]=='*') 
     count++; 
   } 
  } 
  
 }while(count>mine_MAX); 
 if(count==mine_MAX) 
 { 
  printf("恭喜你 扫雷成功!\n"); 
 } 
} 







#include<stdio.h> 
#include"mine.h" 
#include<time.h> 
void emun() 
{ 
 printf("***********************\n"); 
 printf("******* 1.play ******\n"); 
 printf("******** 0.exit ******\n"); 
 printf("***********************\n"); 
} 
void emun_dift()         //选择难度菜单 
{ 
 printf("*********************\n"); 
 printf("****** 1.简单 *******\n"); 
 printf("****** 2.普通 *******\n"); 
 printf("****** 3.困难 *******\n"); 
 printf("*********************\n"); 
} 
void play_EAXY_game(char mine[LINES][ROWS],char text[LINES][ROWS]) //玩简单游戏 
{ 
  time_t t_start,t_end; 
 printf("计时开始!!\n"); 
 t_start = time(NULL);  //开始计时 
 mine_EAXY_sweep(mine,text); 
 t_end = time(NULL);  //计时结束 
 printf("您所用时间为:%.0f \n",difftime(t_end,t_start)); 
} 
void play_COMMON_game(char mine[LINES][ROWS],char text[LINES][ROWS]) //玩普通游戏 
{ 
  time_t t_start,t_end; 
 printf("计时开始!!\n"); 
 t_start = time(NULL);  //开始计时 
 mine_COMMON_sweep(mine,text); 
 t_end = time(NULL);  //计时结束 
 printf("您所用时间为:%.0f \n",difftime(t_end,t_start)); 
} 
void play_DIFFICULT_game(char mine[LINES][ROWS],char text[LINES][ROWS]) //玩困难游戏 
{ 
  time_t t_start,t_end; 
 printf("计时开始!!\n"); 
 t_start = time(NULL);  //开始计时 
 mine_DIFFICULT_sweep(mine,text); 
 t_end = time(NULL);  //计时结束 
 printf("您所用时间为:%.0f \n",difftime(t_end,t_start)); 
} 
void game() 
{ 
 int input = 0; 
 int flout = 0; 
 char mine[LINES][ROWS]={0};   //定义雷盘 
 char text[LINES][ROWS]={0};   //定义显示盘 
 
 init_mine(mine,text,LINES,ROWS);      //初始化雷盘 
 
 do 
 { 
  emun(); 
  init_mine(mine,text,LINES,ROWS);      //初始化雷盘 
  printf("请选择=》"); 
   scanf("%d",&input); 
  switch(input) 
  { 
  case PLAY: 
   { 
    emun_dift(); 
   printf("请选择=》"); 
   scanf("%d",&flout); 
   switch(flout) 
   { 
   case 1: 
    play_EAXY_game(mine,text); 
    break; 
   case 2: 
    play_COMMON_game(mine,text); 
    break; 
   case 3: 
    play_DIFFICULT_game(mine,text); 
    break; 
   } 
   } 
   break; 
  case EXIT: 
   break; 
  } 
 }while(input); 
 
} 
int main() 
{ 
 game(); 
 return 0; 
} 

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

 类似资料:
  • 本文向大家介绍C语言实现扫雷程序,包括了C语言实现扫雷程序的使用技巧和注意事项,需要的朋友参考一下 使用C语言实现简单的扫雷程序,主要是对二维数组的运用,我们需要一个头文件,两个源文件来实现。 game.h //包含函数的声明,宏定义 test.c //包含主函数,函数调用 game.c //包含函数的定义 整体思路 1.要完成一个简单的扫雷程序,我们需要创建两个二维数组,一个保存我们随机生成的雷

  • 本文向大家介绍C语言实现简单扫雷小程序,包括了C语言实现简单扫雷小程序的使用技巧和注意事项,需要的朋友参考一下 扫雷是一款大众类的益智小游戏。游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输。 首先带大家简单来了解一下扫雷的游戏机制: 随便点一个格子,会有一块,上面的数字就代表数字周围八个格子会有几个雷,是1他周围就只有1个雷,2就有两个雷,以此类

  • 本文向大家介绍C语言实现扫雷游戏,包括了C语言实现扫雷游戏的使用技巧和注意事项,需要的朋友参考一下 本文将介绍如何用C语言多文件编程实现扫雷 该示例扫雷程序可实现以下几个功能: 自定义雷数 踩雷后会将所有雷显示出来 地图大小易修改 Mine_clearance.h Mine_clearance.c main.c 显示效果: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教

  • 本文向大家介绍C语言实现扫雷小游戏,包括了C语言实现扫雷小游戏的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了C语言实现扫雷游戏的具体代码,供大家参考,具体内容如下 主函数:main.c 子函数:game.c 函数声明:game.h 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 本文向大家介绍C语言扫雷游戏的实现代码,包括了C语言扫雷游戏的实现代码的使用技巧和注意事项,需要的朋友参考一下 这是一个用C语言实现的控制台扫雷小游戏,实现了随机布置炸弹、扫描炸弹、标记炸弹、百分百第一次不被炸死等功能。 编译器:vs2015 功能模块图 源代码 Tips:在扫描到周围无炸弹的格子时,要将此格子周围的部分依次打开,直到上下左右都出现炸弹数字为止,这里要用到递归的方法,我的顺序为依次

  • 本文向大家介绍C语言实现简单扫雷游戏,包括了C语言实现简单扫雷游戏的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了C语言实现简单扫雷游戏的具体代码,供大家参考,具体内容如下 步骤 1.首先打印游戏选择菜单 2.地图及初始化 1)、展示给玩家的地图(show_map) 2)、地雷的图(mine_map可知地雷的位置) 3.打印地图 4.用户输入坐标,并检查坐标的合理性 5.判断当前位置