目录

一. 游戏所需的功能设计
二.步骤和代码
三.效果展示

一. 游戏所需的功能设计

1.    设计棋盘的大小范围,可以设计为10@10,也可以设计为16@16,需要用二维数组来打印棋盘;
2.    设计玩家棋盘,和设计者棋盘;
3.    设计避免刚开局就扫到雷的机会;
4.    设计输入坐标之后,展开周围的功能;
5.    设计统计坐标周围8个方位雷的个数;
6.    计算剩余总雷数,判断胜利与否;
7.    计算游戏从开始到结束的时间。

二. 步骤和代码

该程序需要三个文件,分别为创建主题文件的test.c, 存放头文件的game.h, 和游戏的实现文件game.c。

2.1 test.c文件(创建主题文件)

#include"game.h"
double start, finish;void menu()
{printf("****************************************\n");printf("**************    1.Play    ************\n");printf("**************    0.Exit    ************\n");printf("****************************************\n");
}
void game()
{int ret = 0;init_mine();//初始化棋盘set_mine();//布雷print_mine();//打印设计者棋盘printf("\n");print_player();//打印玩家棋盘start = clock();//游戏开始时间safe_mine();//避免首开炸雷if (count_show_mine() == COUNT)//如果开局就赢{print_mine();printf("玩家赢了!\n");return;}print_player();//打印玩家棋盘while (1)//循环扫雷{int ret = sweep_mine();//扫到雷返回1,没扫到返回0if(count_show_mine()==COUNT)//如果玩家获胜{print_mine();printf("玩家赢了!\n");finish = clock();//游戏结束时间printf("用时%d秒\n", (int)(finish - start) / CLOCKS_PER_SEC);break;}if (ret)//判断是否扫到雷了{printf("扫到雷了!\t");finish = clock();//游戏结束时间printf("用时%d秒\n", (int)(finish - start) / CLOCKS_PER_SEC);print_mine();//打印设计者棋盘查看雷的分布break;}print_player();//打印玩家棋盘}
}int main()
{srand((unsigned int)time(NULL));//产生随机种子值int input = 0;menu();do {scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏\n");break;default:printf("输入错误,请重新输入:>\n");break;}} while (input);return 0;
}

在该文件中设计了游戏从开始到结束的时间,以及一开局就胜利的机会。用safe_mine函数设置了避免开局就扫到雷的机会。

2.2 game.h (配置环境存放头文件)

在头文件中声明用到的函数。

#pragma once#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>#define row 11
#define col 11
#define COUNT 10//雷的总数
char show_mine[row][col];//棋盘展示
char real_mine[row][col];//棋盘部署
void menu();//菜单
void init_mine();//初始化棋盘
void set_mine();//部署雷
int count_mine();//计算周围雷的个数
void print_player();//玩家棋盘
void print_mine();//设计者棋盘
int sweep_mine();//扫雷
void safe_mine();//避免开盘炸雷
void open_mine(int x, int y);//棋盘展开
int count_show_mine();//判断玩家棋盘剩余未知区域的个数

2.3 game.c (存放游戏的实现逻辑)

该游戏需要初始化两个棋盘:设计者棋盘,和玩家棋盘。在设计者棋盘中,字符0代表“非雷”,字符1代表“雷”。

#include"game.h"void init_mine()//初始化设计者和玩家的棋盘
{int i = 0;int j = 0;for (int i = 0; i < row; i++){for (j = 0; j < col; j++){show_mine[i][j] = '*';real_mine[i][j] = '0';}}
}

打印两个棋盘的时候,需要打印横坐标和纵坐标的序号(0-9),如下图:

void print_player()//打印玩家棋盘
{int i = 0;int j = 0;printf("0 ");for (i = 1; i < row - 1; i++)//打印横坐标0-9{printf("%d ", i);}printf("\n");for (i = 1; i < row - 2; i++)//打印纵坐标0-9{printf("%d ", i);for(j = 1; j < col - 1;j++){printf("%c ", show_mine[i][j]);}printf("\n");}printf("9 ");//打印最后一行for (i = 1; i < row - 1; i++){printf("%c ", show_mine[9][i]);}printf("\n");
}
void print_mine()//打印设计者棋盘
{int i = 0;int j = 0;printf("0 ");for (i = 1; i < row - 1; i++)//打印横坐标0-9{printf("%d ", i);}
printf("\n");
for (i = 1; i < row - 2; i++)//打印纵坐标0-9
{printf("%d ", i);for (j = 1; j < col - 1; j++){printf("%c ", real_mine[i][j]);}printf("\n");
}
printf("9 ");//打印最后一行
for (i = 1; i < row - 1; i++)
{printf("%c ", real_mine[9][i]);
}
printf("\n");
}

打印完两个棋盘和序号之后,开始布雷,用count 函数布置了10个雷,用rand函数让每一次的棋盘中的雷的分布都不同。

void set_mine()//设计者棋盘布雷
{int x = 0;int y = 0;int count = COUNT;//雷的总数while (count){int x = rand() % 10 + 1;//随机横坐标0-9int y = rand() % 10 + 1;//随机纵坐标0-9if (real_mine[x][y] == '0'){real_mine[x][y] = '1';count--;}//所有雷布置完后跳出循环}
}
int count_mine(int x, int y)//统计周围8个区域的雷的个数
{int count = 0;if (real_mine[x - 1][y - 1] == '1')count++;if (real_mine[x - 1][y] == '1')count++;if (real_mine[x - 1][y + 1] == '1')count++;if (real_mine[x][y - 1] == '1')count++;if (real_mine[x + 1][y - 1] == '1')count++;if (real_mine[x + 1][y] == '1')count++;if (real_mine[x + 1][y + 1] == '1')count++;return count;
}

为了避免一开局就点到雷,用safe_mine避免该情况的发生。

void safe_mine()//避免首开被炸
{int x = 0;int y = 0;char ch = 0;int count = 0;int ret = 1;printf("请输入坐标:>");while (1){scanf("%d %d", &x, &y);if ((x >= 1 && x <= 10) && (y >= 1 && y <= 10)){if (real_mine[x][y] == '1')//如果首开扫到雷{real_mine[x][y] = '0';char ch = count_mine(x, y);show_mine[x][y] = ch + '0';open_mine(x, y);while (ret)//在周围设置雷{int x = rand() % 10 + 1;int y = rand() % 10 + 1;if (real_mine[x][y] == '0')//在没有雷的地方布雷{real_mine[x][y] = '1';ret--;break;}}break;}if (real_mine[x][y] == '0'){char ch = count_mine(x, y);show_mine[x][y] = ch + '0';open_mine(x, y);break;}}else{printf("输入错误,请重新输入:>");}}
}

如文章开头的图片那样,想要实现展开功能,使得展开的坐标显示其周围的雷的数量.

void open_mine(int x, int y)//展开坐标周围区域
{if(real_mine[x - 1][y - 1] == '0'){show_mine[x - 1][y - 1] = count_mine(x - 1, y - 1) + '0';}if(real_mine[x - 1][y] == '0'){show_mine[x - 1][y] = count_mine(x - 1, y) + '0';}if(real_mine[x - 1][y + 1] == '0'){show_mine[x - 1][y + 1] = count_mine(x - 1, y + 1) + '0';}if(real_mine[x][y - 1] == '0'){show_mine[x][y - 1] = count_mine(x, y - 1) + '0';}if(real_mine[x][y + 1] == '0'){show_mine[x][y + 1] = count_mine(x, y + 1) + '0';}if(real_mine[x+1][y - 1] == '0'){show_mine[x + 1][y - 1] = count_mine(x + 1, y - 1) + '0';}if(real_mine[x + 1][y] == '0'){show_mine[x + 1][y] = count_mine(x + 1, y) + '0';}if(real_mine[x + 1][y + 1] == '0'){show_mine[x + 1][y + 1] = count_mine(x + 1, y + 1) + '0';}
}

接下来,是扫雷函数的实现。

int sweep_mine()//扫雷函数
{int x = 0;int y = 0;int count = 0;printf("请输入坐标:>\n");scanf("%d %d", &x, &y);//1-9if ((x >= 1 && x <= 10) && (y >= 1 && y <= 10)){if (real_mine[x][y] == '0')//如果没有扫到雷{char ch = count_mine(x, y);show_mine[x][y] = ch + '0';open_mine(x, y);if (count_show_mine() == COUNT)//判断未知区域坐标的个数{print_mine();printf("玩家赢了!\n");return 0;}}else if (real_mine[x][y] == '1')//如果扫到雷了{return 1;}}else{printf("输入错误,请重新输入:>");}return 0;
}

最后,是实现游戏胜利的函数,通过统计玩家棋盘中剩余坐标的个数和雷的总数来判断,如果剩余坐标的个数和雷的总数一致,则游戏胜利。

int count_show_mine()//判断未知区域坐标雷的个数
{int count = 0;int i = 0;int j = 0;for (i = 1; i <= row - 2; i++){for (j = 1; j <= row - 2; j++){if (show_mine[i][j] == '*'){count++;}}}return count;
}

三.效果展示

扫雷游戏的实现步骤和代码相关推荐

  1. 扫雷游戏分析实现(完整代码)

    一.三个部分 saolei.c 存放扫雷游戏的测试逻辑 game.c 游戏函数的实现 game.h 游戏函数的声明 二.棋盘设置 问题一: 设计(9×9)的棋盘,使用二维数组. 但是扫雷过程中是要判断 ...

  2. c++扫雷游戏代码_C语言学习教程,用C语言编写扫雷游戏

    本文实例为大家分享了C语言实现扫雷游戏及其优化的具体代码,供大家参考,具体内容如下 关于扫雷优化 1.核心思想:使用两个二维数组进行设计,一个用于显示,一个用于后台雷的布置. 2.使用宏常量,后期可以 ...

  3. 用c语言编写最大最小值_C语言学习教程,用C语言编写扫雷游戏

    本文实例为大家分享了C语言实现扫雷游戏及其优化的具体代码,供大家参考,具体内容如下 关于扫雷优化 1.核心思想:使用两个二维数组进行设计,一个用于显示,一个用于后台雷的布置. 2.使用宏常量,后期可以 ...

  4. c语言扫雷游戏计时功能_做游戏,学编程(C语言) 20 扫雷

    应 @姑娘的衣扣 同学的要求,分享16级同学大一上学期实现的扫雷游戏.分步骤代码.可执行程序.录屏效果可以从百度网盘下载:http://pan.baidu.com/s/1gf6AHKv 开局画面: 胜 ...

  5. python 扫雷游戏

    python 扫雷游戏 前言 开始 献上代码 代码剖析 项目github 作者 前言 又不知道该干啥了...... 开始 献上代码 from tkinter.messagebox import sho ...

  6. LeetCode 力扣 529. 扫雷游戏 minesweeper DFS

    大家觉得写还可以,可以点赞.收藏.关注一下吧! 也可以到我的个人博客参观一下,估计近几年都会一直更新!和我做个朋友吧!https://motongxue.cn 文章目录 529. 扫雷游戏 题目描述 ...

  7. 【C语言实现】全面的扫雷小游戏(包括空白展开、标记等)具体步骤加代码分析

    文章目录 前言 一.问题描述 二.基本框架构思 三.具体实现 1.扫雷接口实现 2.地图初始化 3.设置雷 4.显示界面 5.开始扫雷 6.计算周围雷的数量 7.排查雷 8.空白展开 9.标记雷 10 ...

  8. C语言实现扫雷小游戏(具体步骤+具体说明)

    C语言实现扫雷目录 一.游戏介绍 三.具体步骤 1.菜单页面 2.初始化雷盘 3.打印雷盘 4.布置雷 5.排查雷 7.统计所选位置周围八个位置中雷的个数 四.完整代码 1.test.c-扫雷游戏的测 ...

  9. python扫雷 高级算法_扫雷游戏的布雷算法、策略与优化(附Python代码)

    1 布雷算法的应用 在扫雷游戏中,将雷均匀地分布在局面中依靠一种布雷算法.众所周知,在原始版本的Windows扫雷中,由于布雷算法的缺陷,使得其存在Board Cycle(局面循环).而标准扫雷游戏中 ...

最新文章

  1. 对抗样本无法被重建!CMU提出通用的无监督对抗攻击检测方法
  2. Javascript学习--------详解window窗口对象
  3. ORACLE 数据迁移
  4. ALE IDoc RFC of SAP
  5. adb architecture
  6. nginx教程全集汇总(ttlsa出品)
  7. Go map[int64]int64 写入 redis 占用多少内存
  8. Form提交前,ajax校验,并阻止提交
  9. cannot resolve symbol ‘springframework‘
  10. java Integer 源码学习
  11. 爬虫插件-XPath Helper下载与安装
  12. P4行为模型BMV2依赖关系安装:thrift nanomsg nnpy安装
  13. 大数据面试-01-大数据工程师面试题
  14. 13、字符设备驱动的使用
  15. EasyIPCamera高性能摄像机RTSP服务器RTSPServer解决方案
  16. 超实用的8个Linux命令行性能监测工具
  17. 计算机网络机房巡视表,机房巡查记录表.doc
  18. iview表格序号1,2,3,4,5
  19. 年全国高校计算机能力挑战赛,初赛公示_2020年全国高校计算机能力挑战赛
  20. 手机屏幕常见故障_iPhone手机一些比较常见的维修故障分析

热门文章

  1. conductor event 和wait 分析及测试记录
  2. luci linux系统的用户名,openwrt配置 -- 修改用户名、密码以及网页用户名的修改
  3. 记Java如何获取MAC地址
  4. 华大计算机面试题,华大基因java初级笔试题.docx
  5. 【翻译】Go语言标准库学习中的encoding/gob——Go语言Gob流的管理
  6. 影枪DeadZone游戏大师工具包
  7. 银河麒麟服务器操作系统V10SP3安装部署File Browser简易网盘
  8. 真相只有一个 !God.Game 代币被盗事件原理分析
  9. Springboot项目多模块打包jar移动到指定目录,docker打jar包构建镜像部署并运行
  10. 五年连续亏损42亿,蘑菇如何渡劫?