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

游戏设计:

在test.c里,完成了游戏的框架实现

首先,我们写一个test()函数测试我们写出的小游戏

void test()
{
int input = ;
do
{
menu();
srand((unsigned)time(NULL));
printf("请输入选项:");
scanf("%d",&input);
switch(input)
{
case :
game();
break;
case :
printf("退出游戏");
break;
default:
printf("输入错误,请重新输入:\n");
break;
}
}while(input);
}

接着就是菜单函数,辅助玩家选择

void menu()
{
printf("**********************\n");
printf("**** 1.play ********\n");
printf("**** 0.exit ********\n");
printf("**********************\n");
}

最后就是我们的游戏实现部分啦

void game()
{
int ret = ;
char mine[ROWS][COLS] = {};
char show[ROWS][COLS] = {};
InitBoard(mine,ROWS,COLS,'');
InitBoard(show,ROWS,COLS,'*');
DisplayBoard(show,ROWS,COLS);
printf("\n");
//DisplayBoard(mine,ROWS,COLS);
Setmine(mine,ROW,COL);
DisplayBoard(mine,ROWS,COLS);
while ()
{
int ret=FineMine(mine,show,ROW,COL);
if(ret==)
break;
else if(ret==)
{
printf("被雷炸死\n");
DisplayBoard(show,ROWS,COLS);
printf("\n");
DisplayBoard(mine,ROWS,COLS);
printf("\n");
break;
}
DisplayBoard(show,ROWS,COLS);
printf("\n");
}
}

接着我们就得实现游戏函数的主要细节实现:

1、函数声明部分

game.h

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h> #define ROWS 10
#define COLS 10
#define ROW 8
#define COL 8
#define COUNT 5 void InitBoard(char board[ROWS][COLS],int rows,int cols, char c);
void DisplayBoard(char board[ROWS][COLS],int row,int col);
void Setmine(char board[ROWS][COLS],int row,int col);
int FineMine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col);
int count_show(char board[ROWS][COLS],int row ,int col);

2、函数的细节实现

game.c

首先利用memset函数初始化棋盘

void InitBoard(char board[ROWS][COLS],int rows,int cols, char c)
{
memset(board,c,rows*cols*sizeof(char)); }

打印棋盘实现

void DisplayBoard(char board[ROWS][COLS],int rows,int cols)
{
int i = ;
int j = ;
for (i = ; i <rows - ; i++)
{
printf("%d ", i);
}
printf("\n");
for (i = ; i <rows - ; i++)
{
printf("%d ", i);
for (j = ; j < cols - ; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
printf("%d ",rows-);
for (i = ; i < rows - ; i++)
{
printf("%c ", board[rows-][i]);
}
printf("\n");
}

利用rand()函数随机埋雷

void Setmine(char board[ROWS][COLS],int row,int col)
{
int x = ;
int y = ;
int count = COUNT;
while (count)
{
int x = rand() % row + ;
int y = rand() % row + ;
if (board[x][y] == '')
{
board[x][y] = '';
count--;
}
}
}

扫雷过程(判断输赢):

int FineMine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col)
{
int x = ;
int y = ;
int count = ;
printf("输入坐标扫雷\n");
scanf("%d %d", &x, &y);
if ((x >= && x <= row) && (y >= && y <= row))
{
if (mine[x][y] == '')
{
char ch = count_mine(mine,x,y);
show[x][y] = ch+'';
open_mine(mine,show,x, y);
if (count_show(show,row,col) == COUNT)
{
DisplayBoard(show,ROWS,COLS);
printf("玩家赢!\n\n");
DisplayBoard(mine,ROWS,COLS);
printf("\n");
return ;
}
}
else if (mine[x][y]=='')
{
return ;
} }
else
{
printf("输入错误重新输入\n");
}
}

在扫雷函数中我们需要一些功能函数地辅助。

判断周围雷的个数

static char count_mine(char board[ROWS][COLS],int x, int y)
{
int count = ;
if (board[x - ][y - ] == '')
count++;
if (board[x - ][y] == '')
count++;
if (board[x - ][y + ] == '')
count++;
if (board[x][y - ] == '')
count++;
if (board[x][y + ] == '')
count++;
if (board[x + ][y - ] == '')
count++;
if (board[x + ][y] == '')
count++;
if (board[x + ][y + ] == '')
count++;
return count;
}

展开扫雷

static void open_mine(char mine[ROWS][COLS],char show[ROWS][COLS],int x, int y)
{
if (mine[x - ][y - ]== '')
{
show[x - ][y - ] = count_mine(mine,x - , y - ) + '';
}
if (mine[x - ][y] == '')
{
show[x - ][y] = count_mine(mine,x - , y) + '';
}
if (mine[x - ][y + ] == '')
{
show[x - ][y + ] = count_mine(mine,x - , y + ) + '';
}
if (mine[x][y - ] == '')
{
show[x][y - ] = count_mine(mine,x, y - ) + '';
}
if (mine[x][y + ] == '')
{
show[x][y + ] = count_mine(mine,x, y + ) + '';
}
if (mine[x + ][y - ] == '')
{
show[x + ][y - ] = count_mine(mine,x + , y - ) + '';
}
if (mine[x + ][y] == '')
{
show[x + ][y] = count_mine(mine,x + , y) + '';
}
if (mine[x + ][y + ] == '')
{
show[x + ][y + ] = count_mine(mine,x + , y + ) + '';
}
}

最后统计是否扫除雷外所有非雷格

int count_show(char board[ROWS][COLS],int row ,int col)
{
int count = ;
int i = ;
int j = ;
for (i = ; i <= row; i++)
{
for (j = ; j <= col; j++)
{
if (board[i][j] == '*')
{
count++;
}
} }
return count;
}

以上就是我关于扫雷写的一个简单的小程序,还很稚嫩,会持续更新改进的。

c语言实现:扫雷的更多相关文章

  1. C语言_扫雷代码

    本文详细讲述了基于C语言实现的扫雷游戏代码,代码中备有比较详细的注释,便于读者阅读和理解.希望对学习游戏开发的朋友能有一点借鉴价值. 完整的实例代码如下: ? 1 2 3 4 5 6 7 8 9 10 ...

  2. C语言实现扫雷游戏(完整版)

    头文件定义.函数声明 下面就是扫雷中使用到的所有函数,为了省事我把所有的代码都放在一个C文件中实现 宏定义中设置了游戏的界面布局,以及设置地雷的个数(这里默认的是10个地雷),界面是一个9*9的方格布 ...

  3. C语言可以开发哪些项目?

    C语言是我们大多数人的编程入门语言,对其也再熟悉不过了,不过很多初学者在学习的过程中难免会出现迷茫,比如:不知道C语言可以开发哪些项目,可以应用在哪些实际的开发中--,这些迷茫也导致了我们在学习的过程 ...

  4. C语言可以开发哪些项目?(转)

    原文地址:https://www.cnblogs.com/shiyanlou/p/6098661.html 知乎:https://www.zhihu.com/question/20564904 C语言 ...

  5. 17个C语言可以做的小案例项目

    C语言是我们大多数人的编程入门语言,对其也再熟悉不过了,不过很多初学者在学习的过程中难免会出现迷茫,比如:不知道C语言可以开发哪些项目,可以应用在哪些实际的开发中……,这些迷茫也导致了我们在学习的过程 ...

  6. C 碎片十一 扫雷源码

    // C语言版本扫雷 #include <stdio.h> #include <stdlib.h> /* 1(0,0) 1(0,1) 0(0,2) 1(0,3) 1(0,4) ...

  7. 用C语言开发的19个经典项目,你会第几个?

    前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:实验楼 C语言是我们大多数人的编程入门语言,对其也再熟悉不过了,不过很多 ...

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

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

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

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

  10. 用算法去扫雷(go语言)

    最初的准备 首先得完成数据的录入,及从扫雷的程序读取界面数据成为我的算法可识别的数据 其次是设计扫雷的算法,及如何才能判断格子是雷或者可以点击鼠标左键和中键. 然后将步骤2的到的结果通过我的程序实现鼠 ...

随机推荐

  1. [cf1025D][区间dp]

    http://codeforces.com/contest/1025/problem/D D. Recovering BST time limit per test 1 second memory l ...

  2. redhat6.5 redis单节点多实例3A集群搭建

    在进行搭建redis3M 集群之前,首先要明白如何在单节点上完成redis的搭建. 单节点单实例搭建可以参看这个网:https://www.cnblogs.com/butterflies/p/9628 ...

  3. digital envelope routines:EVP_DecryptFinal_ex:wrong final block length问题原因分析

    最近在做一个项目时,使用openssl中的aes进行加密和解密,使用相同的密钥但是出现下面的错误日志: 139868329146176:error:0606506D:digital envelope ...

  4. zabbix和iptables的nat表结合使用

    A 机器要去访问C机器,但是无法直接访问到A可以访问到B机器,B机器可以访问到C机器这时候就可以再B机器设置nat,让A机器访问C机器 正好工作中zabbix server要监控2个http地址,缺无 ...

  5. 剑指offer 4.树 重建二叉树

    题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...

  6. linux系统服务详解

    下面现介绍一下运行次序和运行级别: 一个 Linux 系统的引导过程可以分为几个阶段.我们主要看看当内核加载后的那一个阶段.你可以运行runlevel 命令来确定您的系统当前的运行级,当内核被加载并开 ...

  7. python爬虫---selenium库的用法

    python爬虫---selenium库的用法 selenium是一个自动化测试工具,支持Firefox,Chrome等众多浏览器 在爬虫中的应用主要是用来解决JS渲染的问题. 1.使用前需要安装这个 ...

  8. 针对不同.NET版本的条件编译

    原理:查找项目目录下的 csproj 文件,解析它,找到节点TargetFrameworkVersion,判断.net版本

  9. 创建maven工程的时候卡死的解决办法

    在idea的maven,runner,properties里面添加 archetypeCatalog=internal

  10. 编辑器-vim

    编辑器之神-vim vi简介 vi是“Visual interface”的简称,它在Linux上的地位就仿佛Edit程序在DOS上一样.它可以执行输出.删除.查找.替换.块操作等众多文本操作,而且用户 ...