问题描述:相信大多数人都很熟悉扫雷游戏,在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. 《XX重大技术需求征集系统》的可用性和可修改性战术分析

    题目:阅读<大型网站技术架构:核心原理与案例分析>第五.六章,结合<某重大技术需求征集系统>,列举实例分析采用的可用性和可修改性战术,将上述内容撰写成一篇1500字左右的博客阐 ...

  2. BLE和2.4G实现通信

    1. 背景 客户的项目是无线控制灯具,目前采用2.4G芯片,一端是2.4G遥控器,一端是2.4G灯具.现在客户的需求是在不增加成本的条件下增加手机APP控制.因为BLE芯片一般会比纯2.4G芯片价格高 ...

  3. c#实现识别图片上的验证码数字

    这篇文章主要介绍了c#实现识别图片上的验证码数字的方法,本文给大家汇总了2种方法,有需要的小伙伴可以参考下. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1 ...

  4. [R] [Johns Hopkins] R Programming -- week 4

    #Generating normal distribution (Pseudo) random number x<-rnorm(10) x x2<-rnorm(10,2,1) x2 set ...

  5. dataframe基础

    1 df[i]   其中i是0,1,2,3,...  此时选中的是dataframe的第i列 2 dataframe查看每一列是否有缺失值 temp = data.isnull().any() #列中 ...

  6. tomcat使用自签名证书实现https加密访问

    部署好java环境和tomcat之后 执行以下语句 #生成证书,keytool是java工具命令,-genkey生成证书,-alias证书名称,-keyalg应该是指算法,-keystore是证书存储 ...

  7. MySQL Error--Got error 28 from storage engine

    问题描述执行查询或SHOW命令,返回错误信息:Got error 28 from storage engine 问题原因临时文件所在磁盘空间已满 解决办法1.使用df -lh查看磁盘空间使用情况;2. ...

  8. C语言volatile关键字-漫画(转)

    转载地址:https://zhuanlan.zhihu.com/p/56191979 ————— 第二天 ————— ———————————— Java内存模型简称JMM(Java Memory Mo ...

  9. Ubuntu16.04更新源

    首先说说为什么要更新源,我是在docker容器中修改配置文件时有所需要,要用到vim,但是会报错.找不到需要的包. 网上都会说要先更新:apt-get update 但是超级慢有没有,我更新了4小时, ...

  10. 报错:Failed on local exception: Host Details : local host is: "master/192.168.52.26"; dest

    报错现象 Failed on local exception: com.google.protobuf.InvalidProtocolBufferException: Protocol message ...