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;
}

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

(0)

相关推荐

  • 基于C语言实现的扫雷游戏代码

    本文详细讲述了基于C语言实现的扫雷游戏代码,代码中备有比较详细的注释,便于读者阅读和理解.希望对学习游戏开发的朋友能有一点借鉴价值. 完整的实例代码如下: /* 模拟扫雷游戏 */ #include <graphics.h> #include <math.h> #include <stdio.h> #include <dos.h> #include <stdlib.h> #include <conio.h> #include <

  • C语言开发简易版扫雷小游戏

    前言: 想起来做这个是因为那时候某天知道了原来黑框框里面的光标是可以控制的,而且又经常听人说起这个,就锻炼一下好了. 之前就完成了那1.0的版本,现在想放上来分享却发现有蛮多问题的,而且最重要的是没什么注释[果然那时候太年轻]!现在看了也是被那时候的自己逗笑了,就修改了一些小bug,增加了算是详尽而清楚的注释,嗯,MSDN上面对各种函数的解释很详细的[又锻炼一下英语],顺便让开头和结尾的展示"动"了起来,就当作1.5的版本好了. 这个只是给出了一个实现的思路,其中肯定也有很多不合理的地

  • C语言 扫雷程序的实现

    C语言 扫雷程序的实现 这个游戏可以实现根据选择坐标后所显示无雷区范围的不同分为简单 ,普通和困难 游戏程序中,实现了游戏的计时(分钟)功能,实现了扫雷游戏的最基础功能. 定义了一个9*9的棋盘,玩家只要根据提示选择游戏,和难度: 根据提示输入 合法的坐标,如输入不合法则会进行提示: 扫雷结束则会提示:如触雷则游戏自动结束: 整个游戏设计中主要的函数为: 1.初始化地雷棋盘和显示棋盘 2.棋盘打印函数 3.扫雷函数的实现 4.游戏主函数 大家可以在宏定义中改变棋盘大小,雷的个数,以及显示的无雷区

  • C语言实现扫雷程序

    使用C语言实现简单的扫雷程序,主要是对二维数组的运用,我们需要一个头文件,两个源文件来实现. game.h //包含函数的声明,宏定义 test.c //包含主函数,函数调用 game.c //包含函数的定义 整体思路 1.要完成一个简单的扫雷程序,我们需要创建两个二维数组,一个保存我们随机生成的雷,另外一个向外界展示. //使用宏定义定义常量,方便之后对数组的使用 #define ROW 11 //雷 #define COL 11 #define ROWS 9 //棋盘 #define COL

  • 基于C语言扫雷游戏的设计与实现

    目录 1 引言 2 相关工作 3 本文方法 4 结果与分析 5 总结 整体代码 1 引言 伴随着信息技术的快速发展,近年来,人们的生活已经离不开计算机.生活娱乐几乎都是在计算机上进行的.其中的扫雷游戏就是之一.扫雷游戏是微软公司在1992年在windows系统上发布的一款益智类小游戏,直到今天这款小游戏依然存在,可见此款游戏的成功.本文将用Visual Studio 2019作为开发工具来模拟实现扫雷游戏.经过大一第一学期的学习,我们对C语言的理论及其相关知识有了一定的认识和了解.本文可以把我们

  • javascript实现C语言经典程序题

    最近在学习Javascript语言,看到网上很多都是在介绍Javascript如何解决网页上问题的代码,所以想另辟蹊径,用Javascript代码来实现C语言经典程序题.当然,这些C语言程序题也是比较简单,主要想通过Javascript语言实现,起到语法练习作用,也想来对比一下C语言和Javascript语言实现的相同点和不同点,从而巩固记忆,加强学习效果!!! 一.C语言经典程序题1 1. 题目描述: 马克思的手稿中有这样一道有趣的数学题:有30个人,其中有男人,女人,小孩.他们在一家饭馆中吃

  • 易语言倒计时程序制作

    这里教大家怎么制作易语言倒计时程序,接下来大家看步骤就会明白了. 1.第一步添加按钮组件两个,编辑框一个,标签一个.透明标签两个.时钟一个. 再新建一个窗口程序集. 2.这里是新建的窗口程序集.有一个标签和透明标签.属性那里可以设置窗口无边框,然后标签把窗口覆盖,接着放入透明标签,什么字自己可以设置. 3.接下来就是敲代码了,下图是上图步奏的代码.这也是很简单的,也就看下图,这边我有标记的红色长方形的线的这里点击然后可以插入鼠标左键被按下的这个子程序,然后写入代码看下图就可以了. 4.这里是主程

  • 详解易语言的程序的输入方法概念

    为了便于输入程序,易语言内置四种名称输入法:首拼.全拼.双拼.英文.三种拼音输入法均支持南方音及多音字.首拼输入法及全拼输入法在系统中被合并为"首拼及全拼输入法",系统自动判别所输入的拼音是首拼方式还是全拼方式.双拼输入法的编码规则与 Windows 系统所提供的双拼输入法一致.例如:欲输入"取整 (1.23)"语句,各种输入法的输入文本为: ・ 首拼及全拼输入法: qz(1.23) 或者 quzheng(1.23) ・ 双拼输入法: quvg(1.23) ・ 英文

  • C语言中程序如何调用Python脚本

    有时候在写C语言程序的时候又想利用一下python强大的模块,于是C与python的混合编程便应运而生. 下面简单说说在C语言编译环境中调用python脚本文件的基础应用. 一.环境配置 以vs2017为例. 0x00 平台 首先你要知道你电脑上安装的python环境是64位还是32位,vs的编译平台需要与python环境一致. 比如我的python环境是64位,vs工程就要配置成x64. 右键点击你的解决方案,点击属性, 0x01 添加 包含目录 和 库目录 在属性窗口双击"VC++ Dire

  • C语言扫雷游戏的实现方法

    本文实例为大家分享了C语言扫雷游戏的实现代码,供大家参考,具体内容如下 实现扫雷 1.创建俩12*12的字符数组,一个用作放雷,一个呈现给用户 2.利用随机数往防雷数组中产生雷 3.设计呈现给用户的数组 4.利用输入坐标判断--如果有雷,游戏结束并呈现放雷数组:如果无雷,计算周围一圈雷的数量并显示 代码如下 头文件 #define _CRT_SECURE_NO_WARNINGS #pragma once #include<stdio.h> #include<windows.h> #

  • c语言的程序环境与预处理详解

    目录 1.翻译环境 2.运行环境 3.预处理详解 3.1#define定义的符号 3.2#define定义的宏 3.3#define的替换规则 3.4#与## 4.宏与函数对比 5.#undef 6.条件编译 7.文件包含 总结 c语言代码的实现包含两种环境 1.翻译环境,将源代码转化成可执行的机器指令 2.执行环境,执行代码 1.翻译环境 包括两个过程,编译与链接·程序中每一个源文件通过编译器转化成目标文件(obj)·这些目标文件又通过链接器捆绑在一起·链接器同时会链接标准库中的函数以及程序员

  • C语言扫雷详细代码分步实现流程

    目录 一,创建菜单 二,创建游戏内容 1.场景创建和初始化 2.场景打印 3.埋雷 4.排雷 完整代码 1.game.h 2.game.c 3.test.c 还是说一下:发的这些小游戏都是第一个版本,之后改进的话都会在标题中声明. 上一个游戏三子棋:             >> C语言三子棋一步步实现详程<< 来看这次扫雷游戏的思路:                  1.创建游戏界面菜单                   2.创建游戏内容:             初始化场景

随机推荐