我能“C“——扫雷游戏

一.前言:

扫雷游戏,一款经典的游戏,没玩过的话也可以试着玩一玩,这样对写扫雷游戏这个小游戏的化是会有一个很好的思路的。那么本片博客就来介绍如何实现扫雷游戏的具体步骤。扫雷游戏链接👉 扫雷游戏网页版 - Minesweeper

二.游戏思路与逻辑

1.创建菜单界面函数选择退出游戏或者是进入游戏
2.存放布置好雷的信息以及存放排查出雷的信息
3.进行雷的初始化棋盘
4.再打印出雷的初始化棋盘。注意:一定是要先进行 初始化 然后再 打印棋盘
5.就可以布置雷的信息了
6.输入排查雷的坐标
7.检查出的坐标是不是雷,布置雷存放的是字符(1) 没有放置的是字符(0)

注:我们实现扫雷最好要用到模块化编程

模块化编程:把各个模块的代码放在不同的.c文件里,在.h文件里提供外部可调用函数的声明,其它.c文件想使用其中的代码时,只需要#include "XXX.h"文件即可。使用模块化编程可极大的提高代码的可阅读性、可维护性、可移植性等!

总的来说就是:当你代码比较多的时候,就可以采用模块化编程来完成这个程序。

三.游戏实现的步骤

1.游戏菜单

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

 2.选择是否进行游戏

int main()
{int input = 0;do{ menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏\n");break;default:printf("选择错误\n");break;}} while (input); return 0;
}

3. 实现多行多列扫雷 

#define ROW 9
#define COL 9

#define宏定义的功能:

方便程序的修改,不用对整个程序进行修改,只需对宏定义上修改

如下图#define宏定义9*9的行列

4.实现多个雷

#define EASY_COUNT 10

这里表示宏定义10个雷

5.棋盘初始化 

打印棋盘,本质上是打印数组的内容。

void InitBoard(char board[ROWS][COLS], int rows, int cols,char set)
{int i = 0;int j = 0;for (i = 0;i < rows;i++){for (j = 0;j < cols;j++){board[i][j] = set;}}
}

char set 是实参传递到形参的字符。

注:实参数组名 可以省略,但是 不能进行省略。

6.棋盘打印

打印数组内容,这里数组的内容是字符'0'.

void DisplayBoard(char board[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;printf("******* 扫雷 *******\n");for (j = 0;j <= col;j++){printf("%d ", j);}printf("\n");for (i = 1;i <= row;i++){printf("%d ", i);for (j = 1;j <= col;j++){printf("%c ", board[i][j]);}printf("\n");}
}

7.布置雷的信息

void SetMine(char mine[ROWS][COLS], int row, int col)
{int count = EASY_COUNT;while (count){ int x = rand() % row + 1;int y = rand() % col + 1;if (mine[x][y] == '0'){mine[x][y] = '1';count--;}}
}

这里还用到了一个知识点(随机数)

在实际开发中,我们往往需要一定范围内的随机数,过大或者过小都不符合要求,那么,如何产生一定范围内的随机数呢?我们可以利用取模的方法.

int a = rand() % 10;    //产生0~9的随机数,注意10会被整除
如果要规定上下限:
int a = rand() % 51 + 13;    //产生13~63的随机数
分析:取模即取余,rand()%51+13 我们可以看成两部分:rand()%51 是产生 0~50 的随机数,后面+13保证 a 最小只能是 13,最大就是 50+13=63

使用 <time.h> 头文件中的 time() 函数即可得到当前的时间(精确到秒),就像下面这样:

srand((unsigned)time(NULL));


注意:这个在程序当中是只执行一次即可!

8.玩家输入雷实现步骤 

这里的玩家输入坐标,在玩家输入下棋的时候,定义了个静态局部变量,在执行代码的时候。玩游戏的时候会提醒一次, 输入第一个坐标记得空一格!每次进入游戏只有一次,这里主要就是用到了 静态局部变量 就可以保证上一次的值不会被销毁。

检查坐标处是不是雷,布置存放的是字符'1',没有放置雷存放的是字符'0'。

void FineMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int x = 0;int y = 0;int win = 0;while (win<row*col-EASY_COUNT){printf("请输入要排查的坐标:>\n");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (mine[x][y] == '1'){printf("很遗憾,你被炸死了\n");DisplayBoard(mine, ROW, COL);break;}else{//如果该坐标不是雷,就要统计这个坐标周围有几个雷int count = GetMineCount(mine,x,y);show[x][y] = count + '0';DisplayBoard(show, ROW, COL);}}else{printf("排查的坐标非法,请重新输入\n");  }}if (win == row * col - EASY_COUNT){printf("恭喜你,排雷成功\n");DisplayBoard(mine, ROW, COL);}
}

 9.排查 x ,y 周围有多少

int GetMineCount(char mine[ROWS][COLS],int x,int y )
{return (mine[x-1][y] + mine[x-1][y-1] +mine[x][y -1] +mine[x+1][y-1] +mine[x+1][y] +mine[x+1][y+1] +mine[x][y+1]+mine[x - 1][y + 1] - 8 * '0');}

 四.源码

1.test.c

#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
void menu()
{printf("*********************\n");printf("****** 1.play *******\n");printf("****** 0.exit *******\n");printf("*********************\n");
}
void game()
{//mine数组是专门存放布置好的雷的信息char mine[ROWS][COLS] = { 0 };//show数组是专门存放布置好的雷的信息char show[ROWS][COLS] = { 0 };//初始化棋盘InitBoard(mine, ROWS, COLS,'0');//'0'InitBoard(show, ROWS, COLS,'*');//'*'//打印棋盘DisplayBoard(show, ROW, COL);//DisplayBoard(mine, ROW, COL);//布置雷SetMine(mine,ROW,COL);//DisplayBoard(show, ROW, COL);//排查雷FineMine(mine,show,ROW,COL);}
int main()
{int input = 0;do{ menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏\n");break;default:printf("选择错误\n");break;}} while (input); return 0;
}

2.game.h

#pragma once
#define _CRT_SECURE_NO_WARNINGS
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define EASY_COUNT 10
#include<stdio.h>
//初始化棋盘
void InitBoard(char board[ROWS][COLS],int rows,int cols,char set);
//打印棋盘
void DisplayBoard(char board[ROWS][COLS], int row, int col);//布置雷
void SetMine(char mine[ROWS][COLS], int row, int col);//排查雷
void FineMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

 3.game.c

#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
void InitBoard(char board[ROWS][COLS], int rows, int cols,char set)
{int i = 0;int j = 0;for (i = 0;i < rows;i++){for (j = 0;j < cols;j++){board[i][j] = set;}}
}
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;printf("******* 扫雷 *******\n");for (j = 0;j <= col;j++){printf("%d ", j);}printf("\n");for (i = 1;i <= row;i++){printf("%d ", i);for (j = 1;j <= col;j++){printf("%c ", board[i][j]);}printf("\n");}
}
void SetMine(char mine[ROWS][COLS], int row, int col)
{int count = EASY_COUNT;while (count){ int x = rand() % row + 1;int y = rand() % col + 1;if (mine[x][y] == '0'){mine[x][y] = '1';count--;}}
}
int GetMineCount(char mine[ROWS][COLS],int x,int y )
{return (mine[x-1][y] + mine[x-1][y-1] +mine[x][y -1] +mine[x+1][y-1] +mine[x+1][y] +mine[x+1][y+1] +mine[x][y+1]+mine[x - 1][y + 1] - 8 * '0');}
void FineMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int x = 0;int y = 0;int win = 0;while (win<row*col-EASY_COUNT){printf("请输入要排查的坐标:>\n");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (mine[x][y] == '1'){printf("很遗憾,你被炸死了\n");DisplayBoard(mine, ROW, COL);break;}else{//如果该坐标不是雷,就要统计这个坐标周围有几个雷int count = GetMineCount(mine,x,y);show[x][y] = count + '0';DisplayBoard(show, ROW, COL);}}else{printf("排查的坐标非法,请重新输入\n");  }}if (win == row * col - EASY_COUNT){printf("恭喜你,排雷成功\n");DisplayBoard(mine, ROW, COL);}
}

初学者可以尝试一下,锻炼编程能力,增进对代码的理解,希望可以帮助到大家!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/74840.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MMCV】mmpretrain/mmclassification概览、环境安装与验证

概览 MMPretrain 是一个全新升级的预训练开源算法框架,旨在提供各种强大的预训练主干网络, 并支持了不同的预训练策略。MMPretrain 源自著名的开源项目 MMClassification 和 MMSelfSup,并开发了许多令人兴奋的新功能。 目前,预训练阶段对于视觉识别至关重要,凭借丰富而强…

GPT Prompt编写的艺术:如何提高AI模型的表现力

随着AI技术的迅速发展&#xff0c;人工智能模型变得越来越强大&#xff0c;能够协助我们完成各种任务。然而&#xff0c;如何更好地利用AI的能力仍然存在很大的探索空间。在与AI进行交互的过程中&#xff0c;我们主要依赖于Prompt&#xff0c;不管是直接与大模型交互&#xff0…

Simulink仿真模块 - Relay

目录 说明 模块特性 Relay是在两个常量输出之间进行切换。 在仿真库中的位置为:Simulink / Discontinuitie模型为: 说明 Relay 模块的输出在两个指定值之间切换。打开中继时,它会一直保持打开,直到输入低于 Switch off point 参数的值为止。关闭中继时,它会一直保持关闭…

[C++项目] Boost文档 站内搜索引擎(1): 项目背景介绍、相关技术栈、相关概念介绍...

项目背景 Boost库是C中一个非常重要的开源库. 它实现了许多C标准库中没有涉及的特性和功能, 一度成为了C标准库的拓展库. C新标准的内容, 很大一部分脱胎于Boost库中. Boost库的高质量代码 以及 提供了更多实用方便的C组件, 使得Boost库在C开发中会被高频使用 为方便开发者学…

Excel功能总结

1&#xff09;每一张表格上都打印表头 “页面布局”-->“打印标题”-->页面设置“工作表”页-->打印标题“顶端标题行” 如&#xff1a;固定第1~2行&#xff0c;设置成“$1:$2” 2&#xff09;将页面内容打印在一页【缩印】 1.选好需要打印的区域&#xff0c;“页面布…

算法通关村——如何使用中序和后序来恢复一棵二叉树

通过序列构造二叉树 给出以下三个二叉树遍历的序列&#xff1a; (1) 前序: 1 2 3 4 5 6 8 7 9 10 11 12 13 15 14 (2) 中序: 3 4 8 6 7 5 2 1 10 9 11 15 13 14 12 (3) 后序: 8 7 6 5 4 3 2 10 15 14 13 12 11 9 1 前中序复原二叉树 所需序列 (1) 前序: 1 2 3 4 5 6 8 7 9 10 …

瑞芯微RK3568开发板保姆级护航入门学习嵌入式

资料优势 专为3568编写|迅为原创|拒绝网络拼凑 20个手册2800页手册进行结构分层适用于学习与开发 为了方便大家清晰快速的学习&#xff0c;迅为iTOP-3568开发板手册资料全面升级&#xff0c;对手册内容进行了结构分层&#xff0c;共计20个文档&#xff0c;超2800页的资料专为…

这个视频翻译英文的技巧带你畅享无障碍沟通

在一个充满魔法和奇迹的童话世界里&#xff0c;住着一个聪明勇敢的小女孩&#xff0c;她叫芳芳。芳芳一直梦想着探索更广阔的世界&#xff0c;直到有一天&#xff0c;她意外发现了一本神奇的书&#xff0c;名叫《翻译之光》。这本魔法书的每一页都流动着绚丽的彩虹光芒&#xf…

blender凹凸感和置换形变

一、怎么做出凹凸感 需要三个部分的内容&#xff1a; 1、一个基础的纹理&#xff1a;告诉计算机需要用一个什么样的纹理做凹凸&#xff0c;纹理一般采用黑白&#xff0c;在计算机里面&#xff0c;从 0 - 1之间的值可以用从黑到白之间不同的灰度来表示因此&#xff0c;有一张黑白…

kernel32.dll如何修复,快速解决kernel32.dll缺失的方法

Kernel32.dll是Windows操作系统中一个重要的系统文件&#xff0c;对于系统的正常运行至关重要。然而&#xff0c;由于各种原因&#xff0c;用户可能会遇到kernel32.dll文件的缺失问题。今天小编就来给大家详细的介绍一下kernel32.dll这个文件&#xff0c;并且详细的介绍一下ker…

《金融数据保护治理白皮书》发布(137页)

温馨提示&#xff1a;文末附完整PDF下载链接 导读 目前业界已出台数据保护方面的治理模型&#xff0c;但围绕金融数据保护治理的实践指导等尚不成熟&#xff0c;本课题围绕数据保护治理的金融实践、发展现状&#xff0c;探索和标准化相关能力要求&#xff0c;归纳总结相关建…

ApplicationArguments 接口的作用和使用介绍

在Spring Boot中&#xff0c;ApplicationArguments接口是用于获取应用程序的命令行参数的一个接口。它是Spring Boot提供的一种方便的方式&#xff0c;用于获取在应用程序启动时从命令行传递的参数。 ApplicationArguments接口提供了以下方法来获取命令行参数&#xff1a; ge…

TDesign中后台管理系统-访问后端服务

目录 1 修改后端服务地址2 解决跨域问题3 动态获取菜单4 测试后端接口5 前后端联调总结 目前我们已经搭建了TDesign的前端和express的后端&#xff0c;目前是两个独立的应用。通常我们需要把前后端集成在一起&#xff0c;TDesign已经配置了相关的信息&#xff0c;只需要修改后端…

【Linux】网络编程套接字

1 预备知识 1.1 IP地址 IP协议有两个版本&#xff0c;分别是IPv4和IPv6。没有特殊说明&#xff0c;默认都是IPv4对于IPv4&#xff0c;IP地址是一个四个字节32为的整数&#xff1b;对于IPv6来说&#xff0c;IP地址是128位的整数 我们通常也使用 “点分十进制” 的字符串表示IP…

flask------消息闪现 flash

1介绍 flask提供了一个非常有用的flash()函数&#xff0c;它可以用来“闪现”需要提示给用户的消息&#xff0c;比如当用户登录成功后显示“欢迎回来&#xff01;”。在视图函数调用flash()函数&#xff0c;传入消息内容&#xff0c;flash&#xff08;&#xff09;函数把消息存…

【C++】带三维重建和还原的RIS/PACS源码

【PACS】集成三维影像后处理功能&#xff0c;包括三维多平面重建、三维容积重建、三维表面重建、三维虚拟内窥镜、最大/小密度投影、心脏动脉钙化分析等功能。系统功能强大&#xff0c;代码完整。 一、RIS/PACS系统简介 RIS/PACS系统在预约登记、分诊叫号、技师检查、诊断报告…

提交App Store应用图标不能包含alpha通道

近日提交APP至App Store时遇到一个问题&#xff0c;在交付ipa时出现一个图标不符合规定的提示 翻译过来就是 资产验证失败&#xff08;90717&#xff09;应用商店图标无效。“HBuilder.App”中资产目录中的应用商店图标不能是透明的&#xff0c;也不能包含alpha通道。 因为我…

一台电脑给另外一台电脑共享网络

这里写自定义目录标题 有网的电脑上操作一根网线连接两台电脑没网的电脑上 有网的电脑上操作 右键->属性->共享 如同选择以太网&#xff0c;勾选。确认。 一根网线连接两台电脑 没网的电脑上 没网的电脑为mips&麒麟V10 新增个网络配置ww&#xff0c;设置如下。 …

ThinkPHP v6.0.8 CacheStore 反序列化漏洞

漏洞说明 1. 漏洞原理&#xff1a;ThinkPHP 6.0.8 CacheStore 会触发POP利用链子&#xff0c;造成任意命令执行 2. 组件描述&#xff1a; ThinkPHP是一个免费开源的&#xff0c;快速、简单的面向对象的轻量级PHP开发框架 3. 影响版本&#xff1a;V6.0.8 漏洞复现 1. 环境安…

【前端知识】React 基础巩固(四十)——Navigate导航

React 基础巩固(四十)——Navigate导航 一、Navigate的基本使用 新建Login页面&#xff0c;在Login中引入Navigate&#xff0c;实现点击登陆按钮跳转至/home路径下&#xff1a; import React, { PureComponent } from "react"; import { Navigate } from "reac…