C语言—实现扫雷游戏(注释详解)
文章目录
- 前言
- 一、游戏规则介绍
- 二、基本思路流程介绍
- 三、代码实现
- 1.用户交互菜单(Menu函数)
- 2. Game函数
- 3.放雷函数(SetMines函数)
- 4.扫雷展示面板(ShowBoard函数和ShowLine函数)
- 5.统计周围雷的个数(CountMines函数)
- 6.mine函数
- 四、总代码
前言
一、游戏规则介绍
扫雷是一个十分经典的游戏,一张棋盘中有很多个不确定是雷还是安全区域的格子,当点击之后若没有雷则会在该区域显示周围八个格子雷的数目,若有雷则游戏结束。今天我就跟大家分享一下如何用c语言实现初阶版扫雷。
二、基本思路流程介绍
1.创建一个用户交互菜单
2.创建一个Show_Mines棋盘用来埋雷并初始化
3.创建一个Show_Table 棋盘用来和用户交互并初始化
4.玩家选择想要扫描的坐标
5.判定游戏是否结束
6.若没有踩雷则在刚扫描的区域上显示周围八个区域的地雷数目并继续游戏
7.继续扫雷
8.判定游戏是否结束
…
9.若全部扫描完非雷区域则游戏结束
效果展示
三、代码实现
1.用户交互菜单(Menu函数)
Menu(){printf("########################\n");printf("# 1. Play 0.Exit #\n");printf("########################\n");
}
2. Game函数
void Game()
{srand((unsigned long)time(NULL)); //生成随机数种子char show_board[ROW][COL]; char mines_board[ROW][COL];memset(show_board, WHAT, sizeof(show_board));//生成并且初始化用户显示棋盘memset(mines_board, '0', sizeof(mines_board));//生成并且初始化扫雷棋盘SetMines(mines_board, ROW, COL);//放雷int count = (ROW - 2)*(COL - 2) - NUM; //若扫完这些次 不触雷则胜利while (count){system("cls");ShowBoard(show_board, ROW, COL);printf("请选择你要扫描的区域坐标 ");int x = 0;int y = 0;scanf("%d %d", &x, &y);if (x < 1 || x > ROW-2 || y < 1 || y > COL-2){ //非法性输入判断printf("输入错误!\n");continue;}if (show_board[x][y] != WHAT){ printf("此处已经被扫过了,请从新输出\n");continue;}if (mines_board[x][y] == '1'){system("cls");ShowBoard(mines_board, ROW, COL);printf("踩雷了!游戏结束!\n");break;}show_board[x][y] = CountMines(mines_board, x, y);count--;}}
1.memset函数直接定义show_board函数并且初始化二维数组为全WHAT宏定义的*。
2.先向用户展示用户展示棋盘,用户输入一个坐标进行非法性判断。
3.把用户输入的坐标拿给放置雷的棋盘中,若该区域有雷则游戏结束,反之则继续
4.游戏胜利条件为扫描完所有非雷区域
3.放雷函数(SetMines函数)
void SetMines(char board[][COL], int row, int col){ //放雷函数int count = NUM;while (count){int x = rand() % (row - 2) + 1;int y = rand() % (col - 2) + 1;if (board[x][y] == '0'){board[x][y] = '1';count--;}}
}
使用随机数种子生成1到 棋盘大小长宽-2的随机数,这些随机数组成的坐标放雷,循环次数就是雷的数目。因为随机数可能生成一样的,所以要进行一次非法性判断,当棋盘这个位置没有雷的情况下才能往里面放雷。
4.扫雷展示面板(ShowBoard函数和ShowLine函数)
void ShowBoard(char board[][COL], int row, int col){//扫雷展示面板printf(" ");for (int i = 1; i <= (col - 2); i++){ //打印表头数字printf("%d ", i);}printf("\n");ShowLine(col);//显示行线for (int i = 1; i <= (row - 2); i++){printf("%-3d|", i);for (int j = 1; j <= (col - 2); j++){printf(" %c |", board[i][j]); }printf("\n");ShowLine(col);}
}void ShowLine(int col){ //显示横着的虚线,作为行间隔for (int i = 0; i <= (col - 2); i++){printf("----");}printf("\n");
}
5.统计周围雷的个数(CountMines函数)
CountMines(char board[][COL], int x, int y){ //统计周围雷的个数return board[x - 1][y - 1] + board[x - 1][y] + board[x - 1][y + 1] + \board[x][y + 1] + board[x + 1][y + 1] + board[x + 1][y] + \board[x + 1][y - 1] + board[x][y - 1] - 7 * '0';//本来减八个零,但是整形转字符加一个‘0’
}
由于数组中存放的是字符’0’,周围是8个数字,所以-8*'0’才能返回雷数的int值,为了把数字也能打印出来,所以+‘0’,否则打印的是数字作为的ASCLL码的值,最终的结果为-7*‘0’.
6.mine函数
int main()
{int quit = 0;int select = 0;while (!quit){Menu();printf("请输入 ");scanf("%d", &select);switch (select){case 1:Game();break;case 0:quit = 1;break;default:printf("输入错误,请重试!\n");break;}}printf("byebye!\n");system("pause");return 0;
}
四、总代码
#ifndef __Test_H__
#define __Test_H__#include<stdio.h>
#include<Windows.h>
#include <stdlib.h>
#include <time.h>
#define WHAT '*'
#define NUM 20
#define COL 10
#define ROW 10
void Game();
#pragma warning(disable:4996)
#endif //以上都是头文件int main()
{int quit = 0;int select = 0;while (!quit){Menu();printf("请输入 ");scanf("%d", &select);switch (select){case 1:Game();break;case 0:quit = 1;break;default:printf("输入错误,请重试!\n");break;}}printf("byebye!\n");system("pause");return 0;
}void Game()
{srand((unsigned long)time(NULL)); //生成随机数种子char show_board[ROW][COL]; char mines_board[ROW][COL];memset(show_board, WHAT, sizeof(show_board));memset(mines_board, '0', sizeof(mines_board));SetMines(mines_board, ROW, COL);int count = (ROW - 2)*(COL - 2) - NUM; //若扫完这些次 不触雷则胜利while (count){system("cls");ShowBoard(show_board, ROW, COL);printf("请选择你要扫描的区域坐标 ");int x = 0;int y = 0;scanf("%d %d", &x, &y);if (x < 1 || x > ROW-2 || y < 1 || y > COL-2){ //非法性输入判断printf("输入错误!\n");continue;}if (show_board[x][y] != WHAT){ printf("此处已经被扫过了,请从新输出\n");continue;}if (mines_board[x][y] == '1'){system("cls");ShowBoard(mines_board, ROW, COL);printf("踩雷了!游戏结束!\n");break;}show_board[x][y] = CountMines(mines_board, x, y);count--;}
}CountMines(char board[][COL], int x, int y){ //统计周围雷的个数return board[x - 1][y - 1] + board[x - 1][y] + board[x - 1][y + 1] + \board[x][y + 1] + board[x + 1][y + 1] + board[x + 1][y] + \board[x + 1][y - 1] + board[x][y - 1] - 7 * '0';//本来减八个零,但是整形转字符加一个‘0’
}void ShowBoard(char board[][COL], int row, int col){//扫雷展示面板printf(" ");for (int i = 1; i <= (col - 2); i++){printf("%d ", i);}printf("\n");ShowLine(col);//显示行线for (int i = 1; i <= (row - 2); i++){printf("%-3d|", i);for (int j = 1; j <= (col - 2); j++){printf(" %c |", board[i][j]); }printf("\n");ShowLine(col);}
}oid SetMines(char board[][COL], int row, int col){ //放雷函数int count = NUM;while (count){int x = rand() % (row - 2) + 1;int y = rand() % (col - 2) + 1;if (board[x][y] == '0'){board[x][y] = '1';count--;}}
}
void ShowLine(int col){for (int i = 0; i <= (col - 2); i++){printf("----");}printf("\n");
}Menu(){ //用户交互函数printf("########################\n");printf("# 1. Play 0.Exit #\n");printf("########################\n");
}
C语言—实现扫雷游戏(注释详解)相关推荐
- 超详细分解c 语言——实现扫雷游戏(详解)
之前利用三子棋程序,介绍探讨了 c语言简单游戏编写主要模块及使用方法. 今天,我们就利用这个经典扫雷游戏,来加强对于程序思路的编写及思路. 目录 前引 游戏规则介绍 一.基本游戏思路(游戏实现方法) ...
- 用C语言实现扫雷游戏(详解)
目录
- 【C语言】实现扫雷游戏(详解篇)
大家好,我是Abert. 这篇文章将分享利用C语言实现扫雷的全过程及其讲解. 文章目录 1.进行程序环境的配置 2.各种功能的实现及逻辑关系的整理 2.1 创建游戏初始界面(进入\退出 游戏) 2.2 ...
- C语言实现扫雷完整算法详解~(附完整代码~)
扫雷是一个常见小游戏,那么如何用C语言实现扫雷呢?学习了二维数组之后,我们可将扫雷的网格区域存储为二维数组,从而使用C语言实现扫雷. 目录 1.算法基本思路 2.算法详解 1.初始化数组与打印数组 2 ...
- Windows扫雷游戏代码详解【memset函数】
题目描述: 扫雷是Windows自带的游戏.游戏的目标是尽快找到雷区中的所有地雷,而不许踩到地雷.如果方块上的是地雷,将输掉游戏. 如果方块上出现数字,则表示在其周围的八个方块中共有多少颗地雷. 你的 ...
- C语言猜数字游戏(详解)
使用C语言写出猜数字游戏 1.思路 1.我们需要电脑生成一个随机数 2.玩家进行猜数字 3.玩过一次可以再玩一次,那么至少要进去一次,可以使用do...while循环 2.大体结构(主函数) 使用do ...
- python小游戏代码大全-20行python代码的入门级小游戏的详解
背景: 作为一个python小白,今天从菜鸟教程上看了一些python的教程,看到了python的一些语法,对比起来(有其他语言功底),感觉还是非常有趣,就随手添了一点内容,改了一个小例程,当着练练手 ...
- 《Android游戏开发详解》一1.1 什么是编程
本节书摘来异步社区<Android游戏开发详解>一书中的第1章,第1.1节,译者: 李强 责编: 陈冀康,更多章节内容可以访问云栖社区"异步社区"公众号查看. 1.1 ...
- 784-C语言rand和srand用法详解
C语言rand和srand用法详解 在实际编程中,我们经常需要生成随机数,例如,贪吃蛇游戏中在随机的位置出现食物,扑克牌游戏中随机发牌. 在C语言中,我们一般使用 <stdlib.h> 头 ...
- R语言可视化绘图基础知识详解
R语言可视化绘图基础知识详解 图形参数:字体.坐标.颜色.标签等: 图像符号和线条: 文本属性: 图像尺寸及边界: 坐标轴.图例自定义等: 图像的组合: #install.packages(c(&qu ...
最新文章
- 吴恩达机器学习笔记 —— 3 线性回归回顾
- git commit 提交的时候报错husky > pre-commit hook failed 或者‘lint-staged‘ 不是内部或外部命令,也不是可运行的程序(解决办法)
- 在Mysql中count(*)、count(1)与count(字段/列名)的详解—聚合函数count
- springmvc 页面跳转样式访问路径总是多一层地址_Net Core实战之基于角色的访问控制的设计...
- seaborn—seaborn.distplot绘制直方图和连续密度统计
- cad导出pdf_“又”一款免费的CAD批量导出PDF、DWF、PLT神兵利器
- 试验设计——均匀试验设计·好格子点法
- 青龙面板之【追书神器】——5.29
- 正态分布c语言算法,正态分布函数的几种近似算法
- Android后端工程师的要求,后端工程师的岗位职责和能力
- arch配置之百度网盘
- 量化城市︱计算机视觉技术在街道品质量化评估中的应用
- 详解 Java 常用的四种锁机制优缺点
- 用ffmpeg修改MP4文件头信息,使其支持流式加载及播放
- 【OR】YALMIP 指数锥规划
- Windows server 2012 远程桌面被系统自动关闭
- 尝试用ubuntu 22.04 LTS系统可能会遇到的问题和可以了解的东西
- Python绘图Turtle库详解情人节玫瑰花
- php 大量数导出表格 打包成zip
- mktime时间的转换
热门文章
- chrome浏览器缓存 from disk cache
- 腾讯云轻量级服务器怎么搭建网站,腾讯云轻量应用服务器新手教程:快速搭建网站...
- python基础 // 与 / % 的区别
- 国学入门书要目及其读法----梁启超
- SpringBoot 优雅的读取yml(yml规范篇)
- 提高抗打击能力_怎么有效提高自身的抗打击能力?
- 数据跨域交换成刚需 志翔科技助力企业数据安全合规
- 弥散阴影html,弥漫投影的制作(也叫弥散投影)
- 为什么是百度先造出了“知识型网红”
- HTML5文件夹隐藏了怎么打开,怎样显示隐藏文件夹|win7系统如何显示隐藏文件夹...