C语言版扫雷游戏

本文实例为大家分享了C语言版扫雷游戏的具体代码,供大家参考,具体内容如下

1、思路

一、创建二维数组,来表示地图

每一个格子要表示的信息:

1、未翻开状态(草地)和已翻开状态(数字)
2、该格子是地雷或者不是地雷(1表示是地雷,0表示不是)

二、使用两个二维数组来分别表示以上的两种状态

第一个二维数组
char showMap[9][9];表示每个格子的翻开和未翻开状态
表示未翻开,字符'0'-'8'表示已翻开的数字
第二个二维数组
char mineMap[9][9];表示每个格子是否是地雷
'1'表示是地雷,'0'表是不是地雷

三、扫雷游戏流程

1、创建地图并初始化
针对showMap来说,初始化全是
针对mineMap来说,先把整个数组都初始化成'0',随机生成10个位置,作为地雷,设为'1',
2、打印地图showMap
3、让玩家输入坐标,表示要翻开的位置
4、判定是否踩雷
5、更新showMap,再翻开位置显示周围有多少个地雷
6、判定玩家是否翻开了所有的位置
如果为否则返回第二步

2、源代码:

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>

#define MAX_ROW 9
#define MAX_COL 9
#define MINE_COUNT 10

void init(char showMap[MAX_ROW][MAX_COL], char mineMap[MAX_ROW][MAX_COL])
{
 //初始化第一张地图
 /*for (int row = 0; row < MAX_ROW; row++)
  for (int col = 0; col < MAX_COL; col++)
   showMap[row][col] = '*';*/
 //mem=>memory 内存
 //set:设置,集合
 //memset的功能就是把一段内存上的每一个字节都设置成一个具体的值
 //二维数组的每个元素都是在一个连续的内存空间上布局的
 memset(showMap,'*',MAX_ROW*MAX_COL);
 //第一个参数表示起始位置,第二个参数表示把这段内存的值设为啥,第三个参数表示这段内存多少字节
 memset(mineMap, '0', MAX_ROW * MAX_COL);
 //随机产生十个位置作为地雷
 //先设置随机种子
 srand((unsigned int)time(0));
 int mineCount = 0;
 while (mineCount< MINE_COUNT) {
  int row = rand() % MAX_ROW;
  int col = rand() % MAX_COL;
  if (mineMap[row][col] == '1') {
   continue;
  }
  mineMap[row][col] = '1';
  mineCount++;
 }

}
//打印地图,希望这一个函数同时具备打印两种地图的功能
//取决于实参填啥
//形参名字叫做"map"不太合适,C++标准库里有一个std::map
void print(char theMap[MAX_ROW][MAX_COL]) {
 for (int row = 0; row < MAX_ROW; row++) {
  for (int col = 0; col < MAX_COL; col++) {
   printf("%c",theMap[row][col]);
  }
  printf("\n");
 }
}

void update(char showMap[MAX_ROW][MAX_COL],
    char mineMap[MAX_ROW][MAX_COL],int row,int col){
 //count表示周围的地雷个数
 int count = 0;
 for (int r = row - 1; r <= row + 1; r++) {
  for (int c = col - 1; c <= col + 1; c++) {
   if (r < 0 || r >= MAX_ROW || c < 0 || c >= MAX_COL) {
    //此时r,c坐标超出棋盘的范围,直接跳出
    continue;
   }
   if (r == row && c == col) {
    //如果为这个点本身,不需要循环,直接下次循环
    continue;
   }
   if (mineMap[r][c] == '1') {
    count++;
   }
  }
 }
 //如果直接赋值,此时假设count是2,
 //当前row,col位置的元素就被设置成了ASCLL值为
 //2的字符而不是'2'
 showMap[row][col] ='0'+ count;
}
int main() {
 //1、创建地图并初始化
 char showMap[MAX_ROW][MAX_COL] = { 0 };
 char mineMap[MAX_ROW][MAX_COL] = { 0 };
 init(showMap, mineMap);
 int openedCount = 0;//用来表示翻开的个数
 while (1) {
  //清屏
  system("cls");
  //2、打印地图
  print(showMap);
  //为了验证update函数的正确性,先把地雷的布局也打印出来
  //printf("============================\n");
  //print(mineMap);
  //3、玩家输入坐标
  int row = 0;
  int col = 0;
  printf("请输入坐标(row,col):");
  scanf("%d %d", &row, &col);
  //进行合法性判定
  if (row < 0 || row >= MAX_ROW || col < 0 || col >= MAX_COL) {
   printf("你输入的坐标有误!请重新输入!\n");
   continue;
  }
  //判断玩家输入的位置是否已经翻开
  if (showMap[row][col] != '*') {
   printf("您输入的位置已经翻开了!请重新输入!\n");
   continue;
  }
  //4、判定是否踩雷
  if (mineMap[row][col] == '1') {
   printf("您踩雷了!!!游戏结束!\n");
   break;
  }
  //5、更新showMap,显示当前位置周围有多少个雷
  update(showMap, mineMap, row, col);
  //6、进行游戏胜利的判定,统计当前一共翻开了多少个格子
  openedCount++;
  if (openedCount == MAX_ROW * MAX_COL - MINE_COUNT) {
   printf("恭喜你,获胜了!\n");
   break;
  }
 }
 system("pause");
 return 0;
}

3、总结

a.memset函数的使用
b.使用数组时应时刻注意越界问题
c.在update函数中数坐标周围地雷个数时注意不要直接赋值,而应该加字符0,因为地图元素为char型。

showMap[row][col] ='0'+ count;

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

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

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

  • c语言简单实现文件 r/w 操作方法

    数据的输入和输出几乎伴随着每个 C 语言程序,所谓输入就是从"源端"获取数据,所谓输出可以理解为向"终端"写入数据.这里的源端可以是键盘.鼠标.硬盘.光盘.扫描仪等输入设备,终端可以是显示器.硬盘.打印机等输出设备.在 C 语言中,把这些输入和输出设备也看作"文件". 文件及其分类 计算机上的各种资源都是由操作系统管理和控制的,操作系统中的文件系统,是专门负责将外部存储设备中的信息组织方式进行统一管理规划,以便为程序访问数据提供统一的方式. 文件

  • C语言实现链栈的步骤

    链栈图解 链栈的常规操作 /********************* 链栈的常规操作 ****************************/ LinkStack InitLinkStack(); // 初始化链栈 int StackEmpty(); // 判断链栈空 int StackLength(); // 求链栈长(链栈元素个数) int Push(); // 入栈 压栈 ElemType Pop(); // 出栈 弹栈 void DestroyStack(); // 销毁链栈 /**

  • 详解C语言实现空间索引四叉树

    前言 作为程序员,应该都对二叉树都不陌生,我们都知道二叉树的变体二叉查找树,非常适合用来进行对一维数列的存储和查找,可以达到 O(logn) 的效率:我们在用二叉查找树进行插入数据时,根据一个数据的值和树结点值的对比,选择二叉树的两个叉之一向下,直到叶子结点,查找时使用二分法也可以迅速找到需要的数据. 但二叉树只支持一维数据,如一个标量数值,对地图上的位置点这种有xy两个方向上的信息却无能为力,那么是否有一种树能够支持二维数据的快速查询呢? 四叉树 介绍 四元树又称四叉树是一种树状数据结构,在每

  • C语言链表实现贪吃蛇小游戏

    本文实例为大家分享了C语言链表实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下 项目名称: 贪吃蛇小游戏 运行环境: Linux 编程语言: C语言 主要语法: 链表,指针,函数 备注: 游戏中可选不同难度模式, 1.简易--Easy--速度慢,可穿墙,可触碰自己 2.困难--Hard--速度快,不可穿墙,不可触碰自己 3.自动--Auto--外挂模式,自动吃食,直到胜利 代码 贪吃蛇小游戏代码: #include <curses.h> #include <stdlib.h> #

  • C语言异常处理机制案例讲解

    异常处理机制:setjmp()函数与longjmp()函数 C标准库提供两个特殊的函数:setjmp() 及 longjmp(),这两个函数是结构化异常的基础,正是利用这两个函数的特性来实现异常. 所以,异常的处理过程可以描述为这样: 首先设置一个跳转点(setjmp() 函数可以实现这一功能),然后在其后的代码中任意地方调用 longjmp() 跳转回这个跳转点上,以此来实现当发生异常时,转到处理异常的程序上,在其后的介绍中将介绍如何实现. setjmp() 为跳转返回保存现场并为异常提供处理

  • C语言版扫雷游戏

    本文实例为大家分享了C语言版扫雷游戏的具体代码,供大家参考,具体内容如下 1.思路 一.创建二维数组,来表示地图 每一个格子要表示的信息: 1.未翻开状态(草地)和已翻开状态(数字) 2.该格子是地雷或者不是地雷(1表示是地雷,0表示不是) 二.使用两个二维数组来分别表示以上的两种状态 第一个二维数组 char showMap[9][9];表示每个格子的翻开和未翻开状态 表示未翻开,字符'0'-'8'表示已翻开的数字 第二个二维数组 char mineMap[9][9];表示每个格子是否是地雷

  • C语言实现扫雷游戏简易版

    本文实例为大家分享了C语言实现扫雷游戏的简易版,供大家参考,具体内容如下 game.h #pragma once #include <stdio.h> #include <string.h> #include <time.h> #include <windows.h> #define ROW 12 #define COL 12 #define NUMS 20 #pragma warning(disable:4996) void Menu(); void Ga

  • C语言版扫雷小游戏

    本文实例为大家分享了C语言版扫雷小游戏的具体代码,供大家参考,具体内容如下 一.游戏功能 1.显示该点周围雷的个数 2.第一次下子,不炸死 3.坐标周围没雷,可以实现展开 二.效果展示 三.设计思路 这里由于博主目前能力有限,所以这里就用输入坐标的形式来进行排雷. 要想实现上方游戏功能其实也不难,总体思路就是:我们用几个算法模块来模拟游戏规则,实现上方的功能,然后用函数来调用各个模块使游戏跑起来. 接下来我们就来看看如何用C语言代码来实现游戏吧! 四.游戏实现步骤 1.游戏菜单 首先我们需要打印

  • c语言实现含递归清场版扫雷游戏

    目录 一,设计思路 二.实现方式 1.菜单的打印 2.game函数 3.棋盘的初始化与打印  4.雷的放置,雷的个数 5.递归实现一片效果  6.排查雷  三.完整代码 总结 一,设计思路 想必大家都玩过扫雷  这便是一个标准的扫雷,换做代码实现,我们需要考虑以下几点: 1.棋盘的设计与初始化 2.在棋盘中放入雷 3.统计雷数 4.如何实现"一片"的效果 5.输赢的判断 接下来我们进行具体操作. 二.实现方式 1.菜单的打印 对任意一个游戏,菜单是必不可少的,也是最简单的部分,直接上代

  • C语言实现第一次防死版扫雷游戏

    目录 前言 一.功能描述 二.实现的步骤 1.菜单的打印函数: 2.初始化雷盘函数: 3.打印雷盘函数: 4.埋雷函数: 5.排雷函数: 6.防止第一次死的函数: 7.展开函数: 总结 前言 扫雷这款经典的游戏想必大多数人都玩过了,今天用C语言实现了扫雷小游戏,小伙伴们快来看看吧. 一.功能描述 扫雷代码有以下功能: 1.若输入的坐标周围没雷,可以直接展开 2.防止第一次玩就直接踩雷,被炸死 3.若输入的坐标周围有雷,会显示周围雷的个数 4.若排雷失败,会展示出雷图的雷分布是怎样的 二.实现的步

  • C语言实现递归版扫雷游戏实例

    目录 思路 清晰的逻辑 菜单 棋盘 布置雷 排雷 判断输赢 text.c实现 game.c实现 game.h实现 递归部分详解 总结 思路 清晰的逻辑 为方便将其分为三个文件:text.c(测试) game.c(函数实现) game.h(头文件声明) 在排雷的时候为了方便,我们需要将每一行每一列对应的行数,列数打印出来. #define LEI 10 #define ROW 10 #define LOW 10 #define ROWS ROW+2 #define LOWS LOW+2 //在定义

  • C语言实现扫雷游戏(初级版)

    本文实例为大家分享了C语言实现扫雷游戏的具体代码,供大家参考,具体内容如下 game.h #include<stdio.h> #include<stdlib.h> #include<time.h> #define ROW 9 #define COL 9 #define ROWS ROW+2 #define COLS COL+2 #define EASY 10 //初始化棋盘 void InitBoard(char board[ROWS][COLS], int rows,

  • C语言实现简易版扫雷游戏

    本文实例为大家分享了C语言实现扫雷游戏的具体代码,供大家参考,具体内容如下 这个小项目源自两个月前学数组的时候,由于觉得比较重要,想记录一下. 首先,大概的思路是要做出两个二维数组充当棋盘,一个用于后台储存雷的情况,一个用于打印给玩家玩游戏 那么第一步我们知道,需要声明两个二维数组,一个打印出来给用户看,一个自己深埋在心里. 第二步应该是要埋雷,这里我们可以定义几个数值去让玩家选择埋雷的数量. 第三步也就是最难的扫雷部分了,我的思路是,首先玩家先输入一个坐标,我们再对玩家输入的坐标找到对应藏雷的

  • C语言实现扫雷游戏(含注释详解)

    本文实例为大家分享了C语言实现扫雷游戏的具体代码,供大家参考,具体内容如下 前言 一.游戏规则介绍 扫雷是一个十分经典的游戏,一张棋盘中有很多个不确定是雷还是安全区域的格子,当点击之后若没有雷则会在该区域显示周围八个格子雷的数目,若有雷则游戏结束.今天我就跟大家分享一下如何用c语言实现初阶版扫雷. 二.基本思路流程介绍 1.创建一个用户交互菜单 2.创建一个Show_Mines棋盘用来埋雷并初始化 3.创建一个Show_Table 棋盘用来和用户交互并初始化 4.玩家选择想要扫描的坐标 5.判定

  • C语言实现扫雷游戏(含注释详解)

    本文实例为大家分享了C语言实现扫雷游戏的具体代码,供大家参考,具体内容如下 前言 一.游戏规则介绍 扫雷是一个十分经典的游戏,一张棋盘中有很多个不确定是雷还是安全区域的格子,当点击之后若没有雷则会在该区域显示周围八个格子雷的数目,若有雷则游戏结束.今天我就跟大家分享一下如何用c语言实现初阶版扫雷. 二.基本思路流程介绍 1.创建一个用户交互菜单 2.创建一个Show_Mines棋盘用来埋雷并初始化 3.创建一个Show_Table 棋盘用来和用户交互并初始化 4.玩家选择想要扫描的坐标 5.判定

随机推荐