首先,写代码之前要将整体思路写出来:

扫雷游戏:1.需要两个二维数组,一个用来展示,一个用来放雷;

2.整体骨架在代码中都有注释说明;

3.游戏难度比较简单,适合初学者观看,如果有大佬看明白,可以指点一二.


//使用二维数组来表示地图,此处需要2个二维数组,第一个二维数组表示地雷的雷阵,第二个二维数组表示用户看到的地图
//扫雷地图大小9*9;但是二维数组11*11
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#define MINE_COUNT 10
#define ROW 9
#define COL 9
char show_map[ROW + 2][COL + 2];
char mine_map[ROW + 2][COL + 2];
int Menu(){
 int choice = -1;
 printf("************************\n");
 printf("*   欢迎来到扫雷游戏   *\n");
 printf("*       请您选择       *\n");
 printf("*      1.开始游戏      *\n");
 printf("*      2.离开游戏      *\n");
 printf("************************\n");
 while (1){
  scanf("%d", &choice);
  if (choice == 1)
  {
   return 1;
   break;
  }
  else if (choice == 2)
  {
   exit(2);
  }
  else
  {
   printf("输入非法,请重新输入!\n");
   continue;
  }
 }
}
void Init(){     //初始化 布雷       
 srand(time(0));
 memset(mine_map, '0', (ROW + 2)*(COL + 2));
 memset(show_map, '*', (ROW + 2)*(COL + 2));
 int count = MINE_COUNT;
 int row = -1;
 int col = -1;
 while (count>=0){
  row = rand() % ROW + 1;
  col = rand() % COL + 1;
  if (show_map[row][col] == '*')
  {
   mine_map[row][col] = '1';
   count--;
   continue;
  }
 }
}
void Print(){                     //    1 2 3 4 5 6 7 8 9
 printf("    ");                    //    -----------------
 for (int col = 1; col <= COL; col++)              // 01 | | | | | | | | |
 {                       //   ----------------- 
  printf(" %d ", col);
 }
 printf("\n    ---------------------------\n");
 for (int row = 1; row <= ROW; row++)
 {
  printf("%02d ", row);
  printf(" |%c |%c |%c |%c |%c |%c |%c |%c |%c |\n", show_map[row][1], show_map[row][2], show_map[row][3], show_map[row][4], show_map[row][5],
   show_map[row][6], show_map[row][7], show_map[row][8], show_map[row][9]);
  printf("    ---------------------------\n");
 }
}
char MineBoom(){
 printf("    ");
 for (int col = 1; col <= COL; col++)
 {
  printf(" %d ", col);
 }
 printf("\n    ---------------------------\n");
 for (int row = 1; row <= ROW; row++)
 {
  printf("%02d ", row);
  printf(" |%c |%c |%c |%c |%c |%c |%c |%c |%c |\n", mine_map[row][1], mine_map[row][2], mine_map[row][3], mine_map[row][4], mine_map[row][5],
   mine_map[row][6], mine_map[row][7], mine_map[row][8], mine_map[row][9]);
  printf("    ---------------------------\n");
 }
}
char IsFull(){
 int ful = COL*ROW - MINE_COUNT;
 for (int row = 1; row <= ROW; row++){
  for (int col = 1; col <= COL; col++){
   {
    if (show_map[row][col] == '1' || show_map[row][col] == '0')
    {
     ful--;
    }
   }
  }
 }
 if (ful == 0)
 {
  return 'p';
 }
}
char PlayerMove(char mine_map[ROW + 2][COL + 2], char show_map[ROW + 2][COL + 2]){
 int row = -1;
 int col = -1;
 while (1)
 {
  printf("请玩家选的位置(输入格式:坐标 坐标):");
  scanf("%d %d", &row, &col);
  if (row < 1 || row>ROW || col>COL || col < 1)
  {
   printf("输入越界,请重新输入!\n");
   continue;
  }
  if (row > 0 && row<10 && col>0 && col < 10)
  {
   if (show_map[row][col] == '*')
   {
    //1.有雷 显示雷区,结束游戏
    if (mine_map[row][col] == '1')
    {
     MineBoom();
     return 'n';
     break;
    }
    //3.显示此位的周围一圈 是否有雷
    else if (mine_map[row][col] == '0')
    {
     int count = '0';
     if (mine_map[row - 1][col - 1] == '1')
     {
      count++;
     }
     if (mine_map[row - 1][col ] == '1')
     {
      count++;
     }
     if (mine_map[row - 1][col + 1] == '1')
     {
      count++;
     }
     if (mine_map[row ][col - 1] == '1')
     {
      count++;
     }
     if (mine_map[row][col + 1] == '1')
     {
      count++;
     }
     if (mine_map[row + 1][col - 1] == '1')
     {
      count++;
     }
     if (mine_map[row + 1][col ] == '1')
     {
      count++;
     }
     if (mine_map[row + 1][col + 1] == '1')
     {
      count++;
     }
     {
      show_map[row][col] = count;
      Print();
      return 'k';
     }
     
    }
    else{
     printf("已经选过,请重新输入!\n");
     continue;
    }
   }
   else{
    printf("输入非法,请重新输入!\n");
    continue;
   }
  }
 }
}
void Game(){
 if (Menu() == 1)//1.选择菜单
 {
  Init();//2.初始化,布雷
  Print(); //3.打印棋盘
  while (1){
   if (PlayerMove(mine_map,show_map) == 'n'){
    printf("踩到雷啦,游戏结束!\n");
    break;
   }
   else if (IsFull() == 'p'){
    printf("恭喜玩家胜利!\n");
    break;
   }
   else {
    continue;
   }
  }
 }
 system("pause");
}
int main(){
 Game();
 
 return 0;
}

C语言实现简易扫雷的更多相关文章

  1. C语言之简易了解程序环境

    C语言之简易了解程序环境 大纲: 程序的翻译环境 预编译 编译 汇编 链接 程序的运行环境 在ANSI C的任何一种实现中,存在两个不同的环境. 第1种是翻译环境,在这个环境中源代码被转换为可执行的机 ...

  2. C语言实现简易计算器(可作加减乘除)

    C语言实现简易计算器(加减乘除) 计算器作为课设项目,已完成答辩,先将代码和思路(注释中)上传一篇博客 已增添.修改.整理至无错且可正常运行 虽使用了栈,但初学者可在初步了解栈和结构语法后理解代码 # ...

  3. c语言的简易日历

    用c语言编写的简易日历,代码如下: #include <stdio.h> int main(int argc, const char * argv[]) { // insert code ...

  4. C语言新手写扫雷攻略1

    工欲善其事,必先利其器,首先要准备好开发环境,既然是C语言,那就不是WinAPI的扫雷,就是纯的C语言开发,但是以前的C都是TC开发的,现在用肯定是过时很久了,但是也是有解决办法的,某些大神开发出Ea ...

  5. c语言小游戏-扫雷的完成

    C语言-扫雷游戏 本文将对此游戏做一个大致的概述,此代码适合初学者,编写软件使用了vs2017. 该代码可以实现如下功能: 1.用户可以选择3个难度,分别布置不同个数的雷. 2.随机数设置雷的位置. ...

  6. Java 语言实现简易版扫码登录

    基本介绍 相信大家对二维码都不陌生,生活中到处充斥着扫码登录的场景,如登录网页版微信.支付宝等.最近学习了一下扫码登录的原理,感觉蛮有趣的,于是自己实现了一个简易版扫码登录的 Demo,以此记录一下学 ...

  7. 网络编程:基于C语言的简易代理服务器实现(proxylab)

    本文记录了一个基于c socket的简易代理服务器的实现.(CS:APP lab 10 proxy lab) 本代理服务器支持keep-alive连接,将访问记录保存在log文件. Github: h ...

  8. C语言实现简易2048小游戏

    一直很喜欢玩这个小游戏,简单的游戏中包含运气与思考与策略,喜欢这种简约又不失内涵的游戏风格.于是萌生了用C语言实现一下的想法. 具体代码是模仿这个:https://www.cnblogs.com/ju ...

  9. c语言实现:扫雷

    问题描述:相信大多数人都很熟悉扫雷游戏,在n*n的雷盘上随机埋上一些雷,玩家翻开一个非地雷格时,该格将会出现一个数字——提示周围格子中有多少个是地雷格.游戏的目标是在不翻出任何地雷格的条件下,找出所有 ...

随机推荐

  1. 新发布 | 微软开源之路最新进展:FreeBSD落地由世纪互联营运的Microsoft Azure

    微软和开源,是近几年业界孜孜不倦的讨论话题,微软也在开源之路越走越宽.最近与 FreeBSD 基金更紧密的合作踏出了微软在开源之路上的又一大步. 自2012年开始,微软在 FreeBSD 与其虚拟化平 ...

  2. 设计模式之适配器模式(Adapter)

    1. 概述 将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作. 2. 解决的问题 即Adapter模式使得原本由于接口不兼容而不 ...

  3. Dll注入:修改PE文件 IAT注入

    PE原理就不阐述了, 这个注入是PE感染的一种,通过添加一个新节注入,会改变PE文件的大小,将原有的导入表复制到新节中,并添加自己的导入表描述符,最后将数据目录项中指向的导入表的入口指向新节. 步骤: ...

  4. ccsu小助手

    CCSU小助手 队名:瓜队 组员:钟文兴.周畅.吉刘磊.唐仲勋 宣言:We are a team at any time! 团队项目描述: 内容:“生活在长大”: 目标:为了方便对学校不了解的学生能够 ...

  5. 第二次scrum冲击

    1.小组第二次冲刺任务及其完成情况描述. 本次冲刺我们小组经过讨论,实现的使我们爱上长大系统中的失物招领功能,由于在实际的实现中,对于本功能的逐渐深入和了解,渐渐发现这个功能实现起来需要由很多部分组成 ...

  6. C++11之std::future和std::promise和std::std::packaged_task

    为什么C++11引入std::future和std::promise?C++11创建了线程以后,我们不能直接从thread.join()得到结果,必须定义一个变量,在线程执行时,对这个变量赋值,然后执 ...

  7. (第五场)J plan 【贪心】

    题目链接:https://www.nowcoder.com/acm/contest/143/J 题目描述 There are n students going to travel. And hotel ...

  8. D - Going Home POJ - 2195 网络流

    On a grid map there are n little men and n houses. In each unit time, every little man can move one ...

  9. Docker 安装mysql8.0

    1. 下载Mysql的Docker镜像: $ docker search mysql (搜索mysql镜像) $ docker pull mysql (下载mysql镜像,默认最新版本) 2. 运行镜 ...

  10. log4j+AOP 记录错误日志信息到文件中

    AOP 采用异常通知切入,把指定包的异常记录到日志文件. 先看log4j.properties ,控制台输出的是普通信息, 文件输出的是异常信息. log4j.rootLogger=DEBUG, Co ...