问题描述:相信大多数人都很熟悉扫雷游戏,在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. MySQL Workbench 创建数据库,添加新表,添加字段

    建立数据库 第一步: 第二步: 第三步: 如图弹出弹框,继续点击Apply按钮,最后点击Finish按钮完成数据库的建立 创建表与添加字段 双击!!!  一下刚刚建立好的数据库,然后再创建表,不然会出 ...

  2. mysql 两张表的数据设置主外健关联删除

    image_group 主表 image 副表 alter table image add constraint fk_group_idforeign key (group_id)references ...

  3. vue--模板语法

    <!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name=& ...

  4. streamreader 和 streamwriter 以及 string 与 memorystream 使用示例

    经常用到,但老记不住,备忘一下 using (var ms = new MemoryStream()) { var sw = new StreamWriter(ms); sw.WriteLine(&q ...

  5. Android与Linux内核的对应关系

    1. Android各版本和Linux版本对应关系 Android Version |API Level |Linux Kernel in AOSP ------------------------- ...

  6. 18.21 关键字extern

    用#include可以包含其他头文件中变量.函数的声明,为什么还要extern关键字? 1.头文件 其实头文件对计算机而言没什么作用,只是在预编译时在#include的地方展开一下,没别的意义了.将头 ...

  7. update20181214 - uGetHttpData.pas

    function DecodePJItem(sText: string): TList<TDataItem>; var reg: TRegEx; mc: TMatchCollection; ...

  8. flutter mac 下安装

  9. Sql Server查看死锁及堵塞脚本

    --每秒死锁数量 SELECT * FROM sys.dm_os_performance_counters WHERE counter_name LIKE 'Number of Deadlocksc% ...

  10. [蓝桥杯]PREV-12.历届试题_危险系数

    问题描述 抗日战争时期,冀中平原的地道战曾发挥重要作用. 地道的多个站点间有通道连接,形成了庞大的网络.但也有隐患,当敌人发现了某个站点后,其它站点间可能因此会失去联系. 我们来定义一个危险系数DF( ...