编写代码实现简单的扫雷游戏

扫雷

菜单

比较简单,代码如下

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

效果如图
在这里插入图片描述
然后就是根据不同的输入来执行不同的程序,这里用到了switch函数,也比较简单,如果想让这个游戏可以一直玩的话,我们再加上一个循环,这里用了do_while循环

do{menu();int input = 0;printf("请输入选项\n");scanf("%d", &input);switch (input){case 1:printf("开始扫雷\n");game();break;case 0:printf("退出游戏\n");break;default:printf("请重新选择\n");break;}} while (input);
}

以上的都比较简单,重点是里面game()的实现,对于初学者来说可能有一点难。
对于这个扫雷呢,我们的思路是设置两个棋盘,一个棋盘用来布置雷,也就是存放雷的信息,而另一个棋盘则用来展示给玩家看,也就是展示排查出来雷的信息,于是我们定义这样的两个棋盘。

char mine[ROWS][COLS] = { 0 };//布置好的雷的信息
char show[ROWS][COLS] = { 0 };//排查出的雷的信息

假设这是一个9*9的棋盘我们在头文件里面声明ROW和COL

#define ROW 9
#define COL 9

注意上面我们定义棋盘的时候用的不是ROW和COL,而是ROWS和COLS,这是因为我们在排查雷到边界点的时候,再往外排查啊会出现下标越界的情况,于是我们上下各加一行,左右各加一列,于是就变成了1111,也就是ROW+2COL+2,于是我们接着在头文件中定义

#define ROWS ROW+2
#define COLS COL+2

代码实现

初始化棋盘

定义好棋盘后我们就要对它进行初始化,如图

void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);//初始化棋盘

因为我们对两个棋盘进行初始化的值不一样,所有在形参的后面加了一个返回值set,我们这里将mine棋盘初始化为’0’,将show棋盘初始化为’*’

InitBoard(mine, ROWS, COLS, '0');
InitBoard(show, ROWS, COLS, '*');

接下来就是这个函数的代码实现了,比较简单

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

打印棋盘

将棋盘进行初始化之后我们可以来打印棋盘出来看看,看是否初始化成功,函数声明如下

void PrintBoard(char board[ROWS][COLS], int row, int col);//打印棋盘

这里看起来复杂,其实比较简单,就是利用循环打印数组里的元素,这里为了方便玩家看清还在棋盘的侧面加上了坐标

void PrintBoard(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);//布置雷

首先我们假设一个简单的难度,有10个雷,这个可以自己去调节

#define EASY_COUNT 10

那么思路是什么呢?
首先我们还是要利用rand()函数来生成合法的随机下标,然后就是每生成一个雷后这个雷的数量减一,直到变成0,这样就布置好了10个雷

void SetMine(char mine[ROWS][COLS], int row, int col)
{int count = EASY_COUNT;while (count){//1.生成随机下标int x = rand() % row + 1;//对生成的随机数进行限制int y = rand() % col + 1;//2.布置雷if (mine[x][y] == '0')//若该位置没有布置过雷,则在该位置布雷{mine[x][y] = '1';count--;}}
}

写好之后我们可以来打印看看
在这里插入图片描述
可以看到棋盘上出现了10个1,也就说明成功地布置了10个雷

排除雷

声明和之前都比较类似

void FineMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);//排除雷

而对于排雷的过程的思路是在玩家随机输入一个排雷坐标后,若该地方没有雷,则显示周围八个格子内雷的数目,若该地方已被排查过,则提示,若该地方为雷,则提示游戏结束
所以在这个函数实现之前我们需要定义一个函数来返回周围八个格子雷的总数的函数,假设玩家输入的坐标为x,y,则其周围八个格子的坐标可以找到

int get_mine_count(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';
}

这里的-8 * ‘0’是因为棋盘中存放的雷都是以字符1的形式来存放的,假设该位置周围有两个雷,即两个’1’,那么该位置显示的数就是2*‘1’+6*‘0’-8*‘0’,也就是2
再根据上面排雷的思路,我们可以大概写出部分代码的实现

void FineMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int x = 0;int y = 0;printf("请输入要排查的坐标");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col)//越界检查{if (show[x][y] != '*'){printf("该坐标被排查过");continue;}if (mine[x][y] == '1'){printf("很遗憾,踩到雷了\n");PrintBoard(mine, ROW, COL);break;}else{int n = get_mine_count(mine, x, y);show[x][y] = n + '0';PrintBoard(show, ROW, COL);}}else{printf("坐标错误,请重新输入\n");}
}

这里的show[x][y] = n + '0';的意思是把周围的雷的数目返回到show[x][y],但是我们在屏幕上显示的是字符2而不是数字2,但这个函数返回的数字2,十一我们要想办法把数字2变成字符2,由ASCII表可知也就是加上48,即加上一个字符0就可以了

而当雷都排完也就是十个雷都找完后的时候游戏就结束了,我们可以定义一个win,每找到一个雷win就加一,一直加到对于我们对应的难度后游戏结束,所以我们可以对以上代码进行补充

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("请输入要排查的坐标");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (show[x][y] != '*'){printf("该坐标被排查过");continue;}if (mine[x][y] == '1'){printf("很遗憾,踩到雷了\n");PrintBoard(mine, ROW, COL);break;}else{int n = get_mine_count(mine, x, y);show[x][y] = n + '0';PrintBoard(show, ROW, COL);win++;}}else{printf("坐标错误,请重新输入\n");}}if (win == (row * col - EASY_COUNT)){printf("恭喜你,排雷成功\n");}
}

到这里的话游戏就可以玩了,不好的地方是需要一个个去排雷,不能展开没有雷的地方,要想达到这个效果就得用到递归的思想了。
下面是运行截图(破解版)
在这里插入图片描述
在这里插入图片描述

全部代码

game.h

#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define EASY_COUNT 10void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);//初始化棋盘
void PrintBoard(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);//排除雷

game.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{int i = 0;for (i = 0; i < rows; i++){int j = 0;for (j = 0; j < cols; j++){board[i][j] = set;}}
}
void PrintBoard(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;//1-9int y = rand() % col + 1;if (mine[x][y] == '0'){mine[x][y] = '1';count--;}}
}
int get_mine_count(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("请输入要排查的坐标");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (show[x][y] != '*'){printf("该坐标被排查过");continue;}if (mine[x][y] == '1'){printf("很遗憾,踩到雷了\n");PrintBoard(mine, ROW, COL);break;}else{int n = get_mine_count(mine, x, y);show[x][y] = n + '0';PrintBoard(show, ROW, COL);win++;}}else{printf("坐标错误,请重新输入\n");}}if (win == (row * col - EASY_COUNT)){printf("恭喜你,排雷成功\n");}
}

text.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"void menu()
{printf("*******************\n");printf("****  1. play  ****\n");printf("****  0. exit  ****\n");printf("*******************\n");
}
void game()
{char mine[ROWS][COLS] = { 0 };char show[ROWS][COLS] = { 0 };InitBoard(mine, ROWS, COLS, '0');InitBoard(show, ROWS, COLS, '*');PrintBoard(show, ROW, COL);SetMine(mine, ROW, COL);PrintBoard(mine, ROW, COL);FineMine(mine, show, ROW, COL);
}
void test()
{srand((unsigned int)time(NULL));int input = 0;do{menu();int input = 0;printf("请输入选项\n");scanf("%d", &input);switch (input){case 1:printf("开始扫雷\n");game();break;case 0:printf("退出游戏\n");break;default:printf("请重新选择\n");break;}} while (input);
}
int main()
{test();return 0;
}

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

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

相关文章

【C语言】扫雷游戏详解及完整代码

文章目录 前言一、程序环境配置二、各种功能的实现以及逻辑关系的整理2.1 创建游戏初始界面&#xff08;进入\退出 游戏&#xff09;2.2 创建并初始化二维数组board[][] mine[][] (board存放棋盘的信息 mine存放雷的信息)2.3 初始化棋盘2.4 打印棋盘2.5 设置雷区2.6 扫雷 三、完…

互联网最值得加入的 173 家国企名单

大家好&#xff01;我是韩老师。 今年的就业相比以往是难了不少&#xff0c;感受到的人都懂。有一位学妹毕业后在互联网公司工作了两年多&#xff0c;受到的业绩考核压力越来越大&#xff0c;萌发了跳去国企的念头&#xff0c;和她通话聊了挺久。 就是这次的起因&#xff0c;给…

苹果,王炸产品来了!下一个 iPhone 诞生了?

推荐阅读&#xff1a; 《实名举报&#xff01;》 《简单&#xff0c;聊两句。》 1 科技界春晚 知道为什么&#xff0c;总称苹果发布会为科技界的春晚吗&#xff1f; 因为苹果总是可以结合最新工艺、制造、科技&#xff0c;打造出一个跨越时代的产品&#xff0c;或者说可以称之为…

30岁硕士拿100万在云南开启“吃利息躺平式养老” 现在年轻人在怎样规划养老?...

上一篇&#xff1a;阿里巴巴裁员19576人&#xff01; 你考虑过养老吗&#xff1f;你觉得积攒多少钱&#xff0c;可提前退休过上安详的退休生活&#xff1f;在网上&#xff0c;一位30岁的年轻硕士拿着100万元的本金&#xff0c;在云南过上了吃利息的“躺平式养老”生活&#xff…

朋友,承认吧,你可能根本不懂 ChatGPT

© 2023 Conmajia 人工智能在各个行业的采用率都在上升&#xff0c;强大的语言模型 ChatGPT 似乎成为了一种特别受欢迎的业务开发工具。Chat 表示这是一个聊天机器人&#xff0c;GPT 是“Generative Pre-Training”预训练的缩写。然而&#xff0c;似乎多数使用者因为对方可…

2023-H1--CSDN-文库研发团队总结

目录 前言 整体数据 业务功能的迭代 1、创作者分层 2、专题上新 3、新文库-AIGC内容 4、ChatDoc 团队技术输出 多篇技术博客 技术分享直播 前言 晃眼之间&#xff0c;2023年已经过半&#xff0c;那么今天就总结一下我们团队在2023年上半年度所做的工作。2023年上半年…

windows中CMake的安装与配置

本文提供两种方法安装CMake命令&#xff0c;不知道自己电脑有没有CMake命令行的同学可以输入 cmake -version 查看。 如果出现类似于下图所示&#xff0c;则电脑中已经安装有CMake命令&#xff0c;安装本文方法安装后也可用该方法检查是否成功安装CMake. 如果没有出现cmake …

Electron客户端的自动升级方案-2022版

基于Electron开发了桌面应用程序&#xff0c;最后免不了要做安装包&#xff0c;还少不了“在线升级”功能。Electron号称支持自动升级&#xff0c;但真到动手做的时候&#xff0c;才发现并没有官方文档上说得那么简单。最近在网上看了不少文章&#xff0c;反复尝试&#xff0c;…

ControlNet 和 T2I-Adapter,控制Stable Diffusion的不受控制的力量,AI 图像生成精确控制的破冰解决方案(教程含免安装使用方式)

控制Stable Diffusion的不受控制的力量 人工智能艺术社区的兴奋在最近几天达到顶峰,让我想起了去年 Stable Diffusion 的首次发布。本次重点介绍基于Stable Diffusion 1.5的轻量级预训练模型ControlNet,可以检测输入图像中的边缘、深度图或姿态骨架,结合文字提示,精准指导…

chatgpt赋能python:Python免安装怎么用?

Python免安装怎么用&#xff1f; 什么是Python&#xff1f; Python是一种高级、解释型、交互式、面向对象的编程语言。它被广泛应用于Web开发、数据科学、人工智能、网络爬虫、游戏开发等领域。Python拥有简洁明了的语法&#xff0c;使得它易于上手&#xff0c;同时也具有强大…

如何用TL084制作低音炮电路

本低音电路具有适应面广、可调性强、选择性好、失真度低的特点&#xff0c;并可进行特性设置&#xff0c;与合适的扬声器 系统配有源箱&#xff0c;适用于重低音重放。 图1所示的是低音处理电路。4个运算放大器IClB、IClA、IClC和IClD分别承担输入放大、窄频带滤波调节、宽…

干货·Doherty功放设计

当今世界&#xff0c;通信技术的发展可谓日新月异&#xff08;准确来说是人类的欲望日新月异...&#xff09;&#xff0c;然而当前人类所依赖的无线通信完全借由无线电&#xff0c;频段还大都集中在C频段以下&#xff0c;相当拥挤。那么&#xff0c;为了在有限的频谱资源内增加…

IU8689+IU5706 单声道100W/立体声60W同步升压+功放IC大功率拉杆音箱应用组合方案

引言 目前中大功率拉杆音箱主要采用12V铅酸电池为供电电源&#xff0c;在电源直供的时候&#xff0c;一般的功放芯片输出功率在20W左右&#xff08;喇叭为4欧、THD10%&#xff09;。超过50W的功率现阶段市场上主要采用升压芯片TPA3116的组合解决方案。 随着竞争的加剧&#x…

华为Push用户增长服务:精准触达,加速增长

速戳了解华为Push用户增长服务&#xff1a;通过精细化运营&#xff0c;助力开发者高效实现用户增长&#xff0c;提升用户活跃度和粘性&#xff01; 合作咨询请点此链接 了解更多详情>> 访问华为开发者联盟官网 获取开发指导文档 华为移动服务开源仓库地址&#xff1a;G…

华为Vo5G技术EPSFB

EPS FB EPS FB即 EPS Fallback&#xff0c;5G NR 初期不提供语音业务&#xff0c;当 gNB 在 NR 上建立 IMS话音 通道时触发切换&#xff0c;此时 gNB 向 5GC 发起重定向或者 inter-RAT切换请求&#xff0c;回落到 LTE 网络&#xff0c;由 VoLTE提供服务&#xff0c;如下&#…

OpenAI最新官方ChatGPT聊天插件接口《插件示例demo》全网最详细中英文实用指南和教程,助你零基础快速轻松掌握全新技术(四)(附源码)

Example plugins 插件示例demo 前言Introduction 导言Learn how to build a simple todo list plugin with no auth 了解如何构建一个简单的待办事项列表插件&#xff0c;无需授权Learn how to build a simple todo list plugin with service level auth 了解如何构建一个简单的…

一个简单的星座运势查询APP

先看效果图如下&#xff1a; 这是一个简单的星座运势查看的APP。 先来看欢迎界面&#xff0c;欢迎界面很简单&#xff0c;只要是一个简单的动画播放效果&#xff0c;然后对动画播放设置监听&#xff0c;当动画播放结束后自动跳转到主界面。欢迎界面主要代码如下&#xff1a; p…

运气指数测试软件,测一测最近的运势如何,有什么测试运势的软件

说到测一测最近的运势如何&#xff0c;大家都了解&#xff0c;有人问求测算运程&#xff0c;最近不太顺利&#xff0c;另外&#xff0c;还有人想问最近运势不太好&#xff0c;帮帮测里的大师能化解吗&#xff0c;这是怎么回事&#xff1f;其实有好家伙测试运势的软件吗&#xf…

chatgpt赋能python:Python排队:提高效率、优化流程的神器

Python排队&#xff1a;提高效率、优化流程的神器 随着科技的不断进步&#xff0c;排队已经成为了现代生活中不可避免的一部分。在各个行业中&#xff0c;排队都是必须考虑的问题&#xff0c;包括餐馆、医院、机场和银行等等。针对排队问题&#xff0c;我们可以使用Python编程…

与Bard竞争,OpenAI急了 官宣:ChatGPT用户无需排队,直接可用上联网和插件功能...

OpenAI和谷歌&#xff0c;已经打得急红了眼&#xff0c;ChatGPT Plus用户&#xff0c;下周就可以体验联网和插件功能&#xff0c;无需再排队。鲨疯了&#xff0c;真的鲨疯了&#xff01;来自&#xff1a;新智元排版&#xff1a;深度学习自然语言处理 进NLP群—>加入NLP交流群…