C语言(扫雷)

扫雷

  • 开发过程
  • 开发思路
  • 菜单界面
  • 游戏界面的打印
  • 雷的随机产生
  • 扫雷以及判断胜利条件
  • 代码整合

在这里插入图片描述

开发过程

  • 准备工作
  • 效果展示

准备工作:
在这里插入图片描述
game.h 一个头文件–>声明函数
test.c 为主文件
game.c 为功能函数实现文件

效果展示
在这里插入图片描述
在这里插入图片描述

开发思路

  • 菜单界面

  • 游戏界面打印(二维数组)

  • 雷的随机产生

  • 排雷(以及判断周围的雷数)

  • 胜利条件

大致思路就是这样,接下来我们一步步去分析

菜单界面

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

这里我们要不断的去 接收用户的输入,当为1时,进入游戏,为0时,退出程序
直接就想到了 条件语句判断,这里我们用switch

不断的:用户完成游戏后,可以再次打印菜单供用户选择

这个操作当然是项目的核心部分了,放在 main()函数

int main()
{int input = 0;//设置随机数  后面会讲srand((unsigned int)time(NULL));do{menu();printf("请输入:>");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏");break;default:printf("输入有误!!!");break;}} while (input);return 0;
}

游戏界面的打印

这里当然是用二维数组,但是我们要去考虑,如果就一个数组的话,能否起到不知情排雷的效果。
当然,一个数组是不可能的,所以我们要建立两个数组
一个是真实的,一个是展示给用户看的

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

在这里我们要先去考虑一下,该数组若是9×9,在边缘时去判断周围的雷数会越界
我们可以通过建立11×11的数组,其中最外围我们不用,只是设置为默认值

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

对地图的初始化

	//mine 数组在没有布置雷的时候全为 0InitBoard(mine, ROWS, COLS, '0');//show 数组在没有排查雷的时候全为 *InitBoard(show, ROWS, COLS, '*');

我们的InitBoard函数为:

void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{int i = 0, 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, j = 0;printf("-----------扫雷游戏--------------\n");//打印上面0~9注释for (j = 0; j <= col; j++){printf("%d ", j);}printf("\n");for (i = 1; i <= row; i++){printf("%d ", i); //打印竖着1~9的注释for (j = 1; j <= col; j++){printf("%c ", board[i][j]);}printf("\n");}printf("-----------扫雷游戏--------------\n");
}

雷的随机产生

我们很容易想到,就是产生随机数,对其数组进行更改元素值。
这就用到了 srand()函数

	//设置随机数的起始srand((unsigned int)time(NULL));

随机产生的函数:

我们定义EASY_COUNT(雷的数量)在头文件中

void SetMine(char board[ROWS][COLS], int row, int col)
{int count = EASY_COUNT;//横纵坐标1~9while (count){int d = rand() % row + 1;int c = rand() % col + 1;//随机生成十个雷,雷:1if (board[d][c] == '0'){board[d][c] = '1';count--;}}
}

扫雷以及判断胜利条件

扫雷
让用户输入一个坐标,对其值进行判断

  • 若在 show数组内该坐标为*,则该坐标已经被排雷
  • 若在mine数组内该坐标为1则被雷炸失败
  • 否则对其周围进行判断在mine数组内有几颗雷并在show数组的该坐标上显示其数量

判断是否重复输入坐标

			if (show[x][y] != '*'){printf("该坐标已经排查过了,请重新输入:>\n");}

失败的代码很简单,一个判断就行了

				if (mine[x][y] == '1')	//是雷{printf("被炸死咯\n");DisplayBoard(mine, ROW, COL);break;}

判断周围有几颗雷的函数为
在这里插入图片描述

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

整个操作的函数为

void FindMine(char mine[ROW][COL], char show[ROW][COL], int row, int col)
{int x = 0, y = 0;int a = 0, b = 0;int win = 0;while (win<row*col-EASY_COUNT)//判断胜利条件,win小于整体-雷数{printf("请输入排查的坐标:>\n");scanf("%d %d", &a, &b);x = a + 1;y = b + 1;if (x >= 1 && x <= row && y >= 1 && y <= col){if (show[x][y] != '*'){printf("该坐标已经排查过了,请重新输入:>\n");}else{if (mine[x][y] == '1')	//是雷{printf("被炸死咯\n");DisplayBoard(mine, ROW, COL);break;}else //不是雷         '0'-'0'=0     '1'-'0'=1  字符->整型   // ASCII码值分别为 '1':49     '0':48{int count = get_mine_count(mine, x, y);//统计该坐标周围有几颗雷show[x][y] = count + '0';//转换成数字字符//printf("%c\n", count + '0');DisplayBoard(show, ROW, COL);win++;}}}else{printf("输入坐标错误,请重新输入:>\n");}}if (win == row * col - EASY_COUNT){printf("恭喜你,扫雷成功!!!\n");DisplayBoard(mine, ROW, COL);}
}

代码整合

test.c

#include "game.h"void menu()
{printf("*********************\n");printf("*** 1.play 0.exit ***\n");printf("*********************\n");
}void game()
{char mine[ROWS][COLS] = { 0 };//存放布置好的雷的信息char show[ROWS][COLS] = { 0 };//存放排查出雷的信息//初始化数组的内容为指定内容//mine 数组在没有布置雷的时候全为 0InitBoard(mine, ROWS, COLS, '0');//show 数组在没有排查雷的时候全为 *InitBoard(show, ROWS, COLS, '*');//DisplayBoard(mine,ROW, COL);//设置雷SetMine(mine, ROW, COL);//展示DisplayBoard(show, ROW, COL);//排雷FindMine(mine,show,ROW,COL);
}int main()
{int input = 0;//设置随机数srand((unsigned int)time(NULL));do{menu();printf("请输入:>");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏");break;default:printf("输入有误!!!");break;}} while (input);return 0;
}

game.c

#include "game.h"void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{int i = 0, 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, 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");}printf("-----------扫雷游戏--------------\n");
}void SetMine(char board[ROWS][COLS], int row, int col)
{int count = EASY_COUNT;//横纵坐标1~9while (count){int d = rand() % row + 1;int c = rand() % col + 1;//随机生成十个雷,雷:1if (board[d][c] == '0'){board[d][c] = '1';count--;}}
}int get_mine_count(char board[ROWS][COLS], int x, int y)
{return (board[x - 1][y] +board[x - 1][y - 1] +board[x - 1][y + 1] +board[x][y + 1] +board[x][y - 1] +board[x + 1][y - 1] +board[x + 1][y] +board[x + 1][y + 1]- 8*'0');
}void FindMine(char mine[ROW][COL], char show[ROW][COL], int row, int col)
{int x = 0, y = 0;int a = 0, b = 0;int win = 0;while (win<row*col-EASY_COUNT)//判断胜利条件,win小于整体-雷数{printf("请输入排查的坐标:>\n");scanf("%d %d", &a, &b);x = a + 1;y = b + 1;if (x >= 1 && x <= row && y >= 1 && y <= col){if (show[x][y] != '*'){printf("该坐标已经排查过了,请重新输入:>\n");}else{if (mine[x][y] == '1')	//是雷{printf("被炸死咯\n");DisplayBoard(mine, ROW, COL);break;}else //不是雷         '0'-'0'=0     '1'-'0'=1  字符->整型   // ASCII码值分别为 '1':49     '0':48{int count = get_mine_count(mine, x, y);//统计该坐标周围有几颗雷show[x][y] = count + '0';//转换成数字字符//printf("%c\n", count + '0');DisplayBoard(show, ROW, COL);win++;}}}else{printf("输入坐标错误,请重新输入:>\n");}}if (win == row * col - EASY_COUNT){printf("恭喜你,扫雷成功!!!\n");DisplayBoard(mine, ROW, COL);}
}

game.h

#pragma once
#include <stdio.h>
#include <time.h>
#include <stdlib.h>#define ROW 9
#define COL 9#define ROWS ROW+2
#define COLS COL+2
#define EASY_COUNT 10  //雷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 board[ROWS][COLS],int row,int col);void FindMine(char mine[ROW][COL],char show[ROW][COL], int row, int col);

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

python实现区域截屏(类似于QQ微信截图)功能

该功能是本人用python写的小工具集Jamtools里面的截屏部分整合&#xff0c;代码完全原创&#xff0c;分享出来。 CSDN源码下载地址&#xff1a;https://download.csdn.net/download/Fandes_F/12318103(积分支持一下呗) GitHub项目地址&#xff1a;https://github.com/fandesfy…

仿造微信截图工具

起因&#xff1a;身处大学身不由己&#xff0c;总有些社团活动需要拉外联啥的&#xff0c;一拉外联就的朋友圈发广告&#xff0c;还不能发私密。为了一劳永逸的解决这个问题&#xff0c;自己用pyhton写了一个类似于p图的代码。 目的&#xff1a;将一张朋友圈截图中的某一矩形区…

微信小程序学习之自定义对话框、底部弹出框(总结)

在Android开发中&#xff0c;经常需要我们自定义对话框或者底部弹出框&#xff0c;用于满足客户的需求。在微信小程序中&#xff0c;也是如此。 一、自定义对话框 &#xff08;1&#xff09;列表形式。 WXML文件代码如下&#xff1a; <!-- 支付方式对话框 --> <vi…

2020微信对话截图生成器,各种截图一键制作!

前言 上次有朋友说想要个微商作图神器,找了几款觉得功能一般般,就没有发出来,今天又有朋友私信了,对比了这几款,选择中一款不错的给大家分享一下,软件是安卓版的,打开就是VIP,无需去登陆了,直接使用即可&#xff01;嗯&#xff01;拉下去看下详情介绍叭&#xff01; // 软件…

微信小程序之页面中关于聊天框三角形的制作和使用

文章目录 方法一&#xff1a;使用三角形的图片&#xff0c;定位在文本的左侧。方法二&#xff1a;通过在页面中制作一个白色背景的正方形&#xff0c;然后对它进行45度旋转即可实现。方法三&#xff1a;直接制作一个三角形 我最近需要写一个消息通知的页面&#xff0c;需要用到…

微信聊天框

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>微信聊天</title><style>.box{margin: …

Qt实现微信截图功能(一)

简述 Qt 之 简单截图功能&#xff08;一&#xff09;实现鼠标选中区域截图Qt 之 简单截图功能&#xff08;二&#xff09;实现可移动选中区域Qt 之 简单截图功能&#xff08;三&#xff09;实现可拖拽选中区域 在之前的文章中有带大家讲解过部分截图功能&#xff0c;有兴趣的…

高仿微信聊天界面长按弹框样式

效果图 背景 在公司做的项目里面&#xff0c;刚好有需要用到微信聊天界面长按弹框样式这种UI的。 网上找了一下&#xff0c;没找到。 Android现成的 ListPopupWindow又不能满足需求。 因此在非上班时间撸一个出来&#xff0c;供大家使用。 示例代码 关键文件、示例代码及…

截图快捷键ctrl加什么

我们使用电脑聊天&#xff0c;玩游戏或者视频&#xff0c;都经常会使用到截图的功能。使用快捷键截图就会很快速简单&#xff0c;下面小编来告诉大家电脑截图快捷键ctrl加什么。希望可以帮助到大家。 截图快捷键ctrl加什么&#xff1a; ps&#xff1a;要使用ctrl的话&#xf…

数睿通2.0数据血缘、标准、质量功能更新发布

文章目录 引言数据血缘数据标准数据质量结语 引言 这段时间工作繁忙&#xff0c;琐事较多&#xff0c;加上二阳的冲击&#xff0c;导致数睿通 2.0 的更新进度缓慢&#xff0c;深表歉意&#xff0c;还望大家可以理解。本次更新主要包含数据治理模块的血缘&#xff0c;标准&…

Linux cp 命令仅复制文件

参考资料&#xff1a; https://unix.stackexchange.com/questions/101916/copy-only-regular-files-from-one-directory-to-another 作为一个经常进行机器学习训练的人&#xff0c;你可能会想给你的训练代码的每一次run都重新创建一个文件夹&#xff0c;此时你可能只想复制一个…

C++实现cp覆盖指令

前言&#xff1a; 想必大家都知道cp这个命令&#xff0c;现在我要给大家分享一个用命令行参数实现的cp覆盖命令 main函数的命令行参数&#xff1a; int main(int argc,char* argv[]) {} 关于argc与argv[ ] 下面这张图可以助你理解 本图来自&#xff1a;https://blog.csdn.…

cp命令详解

用法&#xff1a; cp [选项]... [-T] 源文件 目标文件 或&#xff1a;cp [选项]... 源文件... 目录 或&#xff1a;cp [选项]... -t 目录 源文件... 功能&#xff1a; 将源文件复制至目标文件&#xff0c;或将多个源文件复制至目标目录。 参数&#xff1a; -a或--ar…

cp (复制)命令

用来将一个或多个源文0件或者目录复制到指定的目的文件或目录。它可以将单个源文件复制成一个指定文件名的具体的文件或一个已经存在的目录下。cp命令还支持同时复制多个文件&#xff0c;当一次复制多个文件时&#xff0c;目标文件参数必须是一个已经存在的目录&#xff0c;否则…

CP命令

cp命令 拷贝文件&#xff0c;cp 【源文件】 【目标文件】&#xff08;拷贝后的文件可直接对其重命名&#xff09; 拷贝目录&#xff0c;cp -r 【源目录】 【目标目录】 拷贝目录是一定要加-r 否则命令不生效。 复制目录时&#xff0c;最好以/结尾。

cp命令用法

cp命令用来将一个或多个源文件或者目录复制到指定的目的文件或目录。它可以将单个源文件复制成一个指定文件名的具体的文件或一个已经存在的目录下。cp命令还支持同时复制多个文件&#xff0c;当一次复制多个文件时&#xff0c;目标文件参数必须是一个已经存在的目录&#xff0…

复制命令 cp

一、命令详解 1.命令说明 cp是copy的缩写,主要是用来复制文件或者目录。cp命令可以将一个或者多个文件、目录复制到一个制定的文件或目录下&#xff0c;也可以同时复制多个文件到一个指定的目录中。 默认情况&#xff0c;cp会被设置一个别名cp is aliased to cp -i&#xff0c…

2022年适合初学者的Python书籍推荐

一、前言 网上有很多Python书或者视频&#xff0c;种类繁多该怎么选择&#xff1f; 看书全是文字看就了眼睛累&#xff0c;也容易厌倦&#xff0c;看视频有时候又觉得讲的慢&#xff0c;有其他方案吗&#xff1f; 其实&#xff0c;关于自学python&#xff0c;找一本浅显易懂&…

推荐几本Python好书!

大家好&#xff01;我是Sitin涛哥&#xff01; 经常有小伙伴问我推荐Python书籍&#xff0c;每次都零零碎碎的。 今天我整理了一些Python3.x编程相关书籍&#xff0c;从基本概念到完整项目开发&#xff0c;并加以数学辅助&#xff0c;帮助你迅速掌握Python编程&#xff0c;成为…

Python入门必备的书籍推荐

想要自学好Python&#xff0c;搜集资料是最关键的一步&#xff0c;现在在网上有很多的资料、视频和网站可供自学入门者选择。但是想要扎扎实实学好基础&#xff0c;书籍是不可少的一种选择&#xff0c;因为书本上的知识还是跟网上的介绍方法有点不一样的&#xff0c;还有书籍上…