C语言实现扫雷游戏详细代码

 更新时间:2020年11月30日 16:53:18   作者:CYQAQ  
这篇文章主要为大家详细介绍了C语言实现扫雷游戏的具体步骤和详细代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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

一、思想实现

本文的扫雷游戏主要实现以下的功能:

1.显示雷和其信息
2.输入一个坐标可观测其周围九格内的地雷数
3.点击到地雷则游戏结束

用到的IDE为VS2013

二、源代码

创建一个头文件saolei.h
存放关于所有自定义函数的声明

#define COL 9
char** creatMat(int row, int col);
void intMat(char** Mat, int row, int col, char ch);
void setMine(char** Mat, int row, int col);
void showMat(char** Mat, int row, int col);
int getMineNum(char** Mat, int row, int col, int x, int y);
void game(char** mineMat, char** mineInfo, int row, int col);

创建一个源文件SaoLei.c
来存放具体的游戏实现

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include "saolei.h"
#include <Windows.h>

char** creatMat(int row,int col)
{
 //创建一个指针数组
 char** Mat = (char**)malloc(sizeof(char *)*(row+2));//多创建2行2列方便计算边界角落的数值
 //开辟每一行元素的空间
 for (int i = 0; i < row+2; ++i)
 {
 Mat[i] = (char*)malloc(sizeof(char)*(col+2));
 }
 return Mat;
}

void intMat(char** Mat, int row, int col, char ch)
{
 for (int i = 0; i < row+2; ++i)
 {
 for (int j = 0; j < col+2; ++j)
 {
 Mat[i][j] = ch;
 }
 }
}

void setMine(char** Mat, int row, int col)//雷的位置
{
 int count = MINE_NUM;//布置雷的个数
 while (count)
 {
 //x:1`row,y:1~col
 int x = rand() % row + 1;
 int y = rand() % col + 1;
 if (Mat[x][y] != '*')
 {
 Mat[x][y] = '*';
 --count;
 }
 }
}

void showMat(char** Mat, int row, int col)
{
 printf("------------------------------\n");
 //显示列
 for (int i = 0; i <= col; ++i)
 {
 printf("%d ", i);
 }
 printf("\n");
 //显示行
 for (int i = 1; i <= row; ++i)
 {
 printf("%d ", i);
 for (int j = 1; j <= col; ++j)
 {
 printf("%c ", Mat[i][j]);
 }
 printf("\n");
 }
 printf("------------------------------\n");
}

int getMineNum(char** Mat, int row, int col, int x, int y)
{//旋转矩阵
 static int posOffset[8][2] = { { -1, -1 }, { -1, 0 }, { -1, 1 }, { 0, -1 }, { 0, 1 }, { 1, -1 }, { 1, 0 }, { 1, 1 } };
 int count = 0;
 for (int i = 0; i < 8; ++i)
 {
 int nx = x + posOffset[i][0];
 int ny = y + posOffset[i][1];
 if (Mat[nx][ny] == '*')
 {
 ++count;
 }
 }
 return 0;
}

void game(char** mineMat, char** mineInfo, int row, int col)
{
 int step = 0;
 while (step < row * col - MINE_NUM)
 {
 int x, y;
 printf("请输入一个坐标:\n");
 scanf("%d%d", &x, &y);
 if (mineMat[x][y] == '*')
 {
 printf("game over!\n");
 showMat(mineMat, row, col);
 break;
 }
 //获取x,y周围雷的个数
 int num = getMineNum(mineMat, row, col, x, y);
 mineInfo[x][y] = num + '0';
 showMat(mineInfo, row, col);
 ++step;//成功走了一步
 }
 if (step == row * col - MINE_NUM)
 {
 printf("win!\n");
 }
}

void test()
{
 char** mineMat = creatMat(ROW, COL);
 char** mineInfo = creatMat(ROW, COL);

 intMat(mineMat, ROW, COL, '0');
 intMat(mineInfo, ROW, COL, '*');
 setMine(mineMat, ROW, COL);
 printf("雷:");
 showMat(mineMat, ROW, COL);
 printf("雷的信息:");
 showMat(mineInfo, ROW, COL);

 game(mineMat, mineInfo, ROW, COL);
}

int main()
{
 test();
 system("pause");
 return 0;
}

三、游戏结果

END

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

相关文章

  • VS2019如何创建C++项目的实现示例

    VS2019如何创建C++项目的实现示例

    这篇文章主要介绍了VS2019如何创建C++项目的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • C语言详解Z字形变换排列的实现

    C语言详解Z字形变换排列的实现

    Z字形变换排列就是指将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列,下面让我们用C语言来实现
    2022-04-04
  • VC++实现模拟汉诺塔效果

    VC++实现模拟汉诺塔效果

    本文给大家分享的是一则使用vc++实现模拟汉诺塔效果的代码,代码实现起来很简单,主要是汉诺塔算法的思路要正确,正在练习汉诺塔的小伙伴也可以来看看,希望大家能够喜欢。
    2015-03-03
  • 史上最强C语言分支和循环教程详解

    史上最强C语言分支和循环教程详解

    这篇文章主要介绍了史上最强C语言分支和循环教程详解,本文通过代码演示给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-11-11
  • C语言 超详细介绍与实现线性表中的带头双向循环链表

    C语言 超详细介绍与实现线性表中的带头双向循环链表

    带头双向循环链表:结构最复杂,一般用在单独存储数据。实际中使用的链表数据结构,都是带头双向循环链表。另外这个结构虽然结构复杂,但是使用代码实现以后会发现结构会带来很多优势,实现反而简单
    2022-03-03
  • 利用OpenCV实现局部动态阈值分割

    利用OpenCV实现局部动态阈值分割

    这篇文章主要为大家详细介绍了利用OpenCV实现局部动态阈值分割,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • Linux/C++多线程实例学习十字路口车辆调度

    Linux/C++多线程实例学习十字路口车辆调度

    这篇文章主要为大家介绍了Linux/C++多线程实例学习十字路口车辆调度示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • 使用OpenGL创建窗口的示例详解

    使用OpenGL创建窗口的示例详解

    OpenGL,也就是Open Graphics Library。其主要就是用于我们去渲染2D、3D矢量图形的一种跨语言、跨平台的应用程序编程接口,这篇文章主要介绍了使用OpenGL创建窗口,需要的朋友可以参考下
    2022-04-04
  • C++中抽象类和接口的区别介绍

    C++中抽象类和接口的区别介绍

    抽象类(abstract class)和接口(interface)的概念是面向对象设计中常用的概念, 也是比较容易混淆的概念. 在这里, 我提出一种区分它们的思路
    2013-04-04
  • 利用C++实现最长公共子序列与最长公共子串

    利用C++实现最长公共子序列与最长公共子串

    这篇文章主要给大家介绍了如何利用C++实现最长公共子序列与最长公共子串,文章一开始就给大家简单的介绍了什么是子序列,子串应该比较好理解就不用多介绍了,人后通过算法及示例代码详细介绍了C++实现的方法,有需要的朋友们可以参考借鉴,下面来一起看看吧。
    2016-12-12

最新评论