C语言实现低配版“扫雷”小游戏

2023-11-05 17:20

本文主要是介绍C语言实现低配版“扫雷”小游戏,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

C语言实现“低配版”——扫雷小游戏

​ 用C语言完成的小游戏——“扫雷”,这是一个有年代感的游戏,经久不衰也恰恰证明了这款游戏的趣味性,接下来,就用我们的所学来实现这个游戏。

​ 游戏例图:

游戏开始
游戏结束

​ 首先,我们应该先思考如何去一步步完成它,开始我们建立3个主要文件。mine

mine_sweeps.c mine_sweeps.h test.c

mine_sweeps.c 用于存放函数体的文件。

mine_sweeps.h 用于存放全局变量和头文件还有mine_sweeps.h中的函数声明

test.c是用来测试游戏的可行性

在test.c搭建基本选项
void menu()
{printf(" *******************\n");printf(" |     1.play      |\n");printf(" |     0.exit      |\n");printf(" ******************\n");
}
int main()
{srand((unsigned int)time(NULL));//随机数生成函数int input = 0;do {menu();printf("plase input number:>");scanf("%d", &input);//分支选择switch (input){case 1://开始游戏mine_sweep();break;case 0://退出游戏printf("game over!\n");break;default://重新输入printf("input wrong,plase input again!\n");break;}} while (input);return 0;
}

输入不同的数字会有不同的提示,这一点的设计会让玩家清楚现在正处于什么形势。

mine_sweep.h设计函数的实现和理清游戏步骤

#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 MINE 10//控制游戏体验//初始化数组
void init_board(char board[ROWS][COLS], int row, int col,char set);
//打印棋盘
void print_board(char board[ROWS][COLS], int row, int col);
//布置雷
void set_board(char board[ROWS][COLS], int row, int col);
//排查雷
void find_board(char board[ROWS][COLS],char show[ROWS][COLS],int row,int col);

此文件主要是函数声明和宏,改变其中数字可以把难度提升!!!

“mine_sweeps.c”

里面包含了游戏实现需要的主要函数

初始化棋盘函数,其中传递的字符决定了打印的效果。

//初始化棋盘
void init_board(char board[ROWS][COLS], int row, int col, char set)//set是将函数初始化
{int i = 0;for (i = 0; i < row; i++){int j = 0;for (j = 0; j < col; j++){board[i][j] = set;}}
}

打印棋盘函数,要注意打印的效果,特别是行号和列好的控制,虽然两个数组是11x11,但是我们实际打印的只有9x9。

//打印棋盘
void print_board(char board[ROWS][COLS], int row, int col)
{int i = 0;//打印列号for (i = 0; i <=col; i++){printf("%d ", i);}printf("\n");for (i = 1; i <= row; i++){//打印行号printf("%d ", i);int j = 0;for (j = 1; j <= col; j++){printf("%c ", board[i][j]);}printf("\n");}
}

布置雷函数,要使用我们设定好的数量然后放置相同数量的雷,可以设定count等于雷的数量,千万不可以用于++或者–,因为宏不可赋值。

//布置雷
void set_board(char board[ROWS][COLS], int row, int col)
{int count = MINE;while (count){int x = rand() % row + 1;//随机数库函数int y = rand() % col + 1;//随机数库函数if ('0' == board[x][y]){board[x][y] = '1';//含雷先设定为字符1count--;}}
}

生成随机数的函数:rand,是跟随srand一起使用的库函数。使用时必须引用 stdilb.h 头文件。srand生成的随机数会被rand接收,不过这个函数生成随机数是需要一个随机数来转换成随机数,这时候就要使用到我们的时间戳——time库函数,使用时必须引用 time.h头文件。这时候在main函数中将一个空指针传递给我们的time(NULL)就可以产生随机数了!!在使用rand时需要产生你需要的数字需要使用算数操作符,比如你需要0~9的数字,只需要rand%10。

排查雷函数主要是用于最后玩家输入的游戏体验,需要合适的提示和界面打印。

//排查雷
void find_board(char board[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int x = 0;int y = 0;int win = 0;;while (win<row*col-MINE){printf("please input x y:>");scanf("%d %d", &x, &y);if (x > 0 && x < row  && y>0 && y < col){if ('1' == board[x][y]){printf("很遗憾,你被炸死了*_*\n");print_board(board, ROW, COL);}else{//统计雷的个数int count=count_board(board, x, y);//返回的值就是该位置九宫格里的含雷数show[x][y] = count+'0';print_board(show, ROW, COL);win++;}}else{printf("x,y wrong,please input again!\n");}}if (win==col*row-MINE)printf("YOU WINING!!!\n");
}

统计雷函数不用在mine_sweep.h中声明的函数,因为他是用于排查雷需要的函数,具体如下:

//统计雷
int count_board(char board[ROWS][COLS],int x, int y)
{int count = 0; count += '0';count=board[x-1][y-1]+board[x-1][y]+board[x-1][y+1]+board[x][y-1]+board[x][y]+board[x][y+1]+board[x+1][y-1]+board[x+1][y]+board[x+1][y+1]-9 * '0';return count;
}

以上是每个函数的实现。

具体组成

mine_sweep.h

#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 MINE 80//初始化数组
void init_board(char board[ROWS][COLS], int row, int col,char set);
//打印棋盘
void print_board(char board[ROWS][COLS], int row, int col);
//布置雷
void set_board(char board[ROWS][COLS], int row, int col);
//排查雷
void find_board(char board[ROWS][COLS],char show[ROWS][COLS],int row,int col);

mine_sweep.c

#define _CRT_SECURE_NO_WARNINGS 1#include"mine_sweep.h"//初始化棋盘
void init_board(char board[ROWS][COLS], int row, int col, char set)
{int i = 0;for (i = 0; i < row; i++){int j = 0;for (j = 0; j < col; j++){board[i][j] = set;}}
}//打印棋盘
void print_board(char board[ROWS][COLS], int row, int col)
{int i = 0;//打印列号for (i = 0; i <=col; i++){printf("%d ", i);}printf("\n");for (i = 1; i <= row; i++){//打印行号printf("%d ", i);int j = 0;for (j = 1; j <= col; j++){printf("%c ", board[i][j]);}printf("\n");}
}//布置雷
void set_board(char board[ROWS][COLS], int row, int col)
{int count = MINE;while (count){int x = rand() % row + 1;int y = rand() % col + 1;if ('0' == board[x][y]){board[x][y] = '1';count--;}}
}//统计雷
int count_board(char board[ROWS][COLS],int x, int y)
{int count = 0; count += '0';count=board[x-1][y-1]+board[x-1][y]+board[x-1][y+1]+board[x][y-1]+board[x][y]+board[x][y+1]+board[x+1][y-1]+board[x+1][y]+board[x+1][y+1]-9 * '0';/*count=mine[x - 1][y - 1] +mine[x][y - 1] +mine[x + 1][y - 1] +mine[x - 1][y] +mine[x + 1][y] +mine[x - 1][y + 1] +mine[x][y + 1] +mine[x + 1][y + 1] - 8 * '0';*/return count;
}
//排查雷
void find_board(char board[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int x = 0;int y = 0;int win = 0;;while (win<row*col-MINE){printf("please input x y:>");scanf("%d %d", &x, &y);if (x > 0 && x < row  && y>0 && y < col){if ('1' == board[x][y]){printf("很遗憾,你被炸死了*_*\n");print_board(board, ROW, COL);}else{//统计雷的个数int count=count_board(board, x, y);show[x][y] = count+'0';print_board(show, ROW, COL);win++;}}else{printf("x,y wrong,please input again!\n");}}if (win==col*row-MINE)printf("YOU WINING!!!\n");
}

test.c

```#define _CRT_SECURE_NO_WARNINGS 1
#include"mine_sweep.h"void menu()
{printf(" * ————————*\n");printf(" |     1.play      |\n");printf(" |     0.exit      |\n");printf(" * ————————*\n");
}void mine_sweep()
{char board[ROWS][COLS] = { 0 };//带雷char show[ROWS][COLS] = { 0 };//不带雷//初始化棋盘init_board(board, ROWS, COLS,'0');init_board(show, ROWS, COLS,'*');//打印棋盘//print_board(board, ROW, COL);print_board(show, ROW, COL);//布置雷set_board(board, ROW, COL);print_board(board, ROW, COL);//排查雷find_board(board, show, ROW, COL);}int main()
{srand((unsigned int)time(NULL));int input = 0;do {menu();printf("plase input number:>");scanf("%d", &input);switch (input){case 1:mine_sweep();break;case 0:printf("game over!\n");break;default:printf("input wrong,plase input again!\n");break;}} while (input);return 0;
}

以上就是该小游戏的全部函数,因为技术有限,并不能完全实现与电脑游戏一模一样的体验。不过我还是会继续深造,努力将他实现成原有的功能,谢谢观看😀。

这篇关于C语言实现低配版“扫雷”小游戏的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/351360

相关文章

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

Python实现微信自动锁定工具

《Python实现微信自动锁定工具》在数字化办公时代,微信已成为职场沟通的重要工具,但临时离开时忘记锁屏可能导致敏感信息泄露,下面我们就来看看如何使用Python打造一个微信自动锁定工具吧... 目录引言:当微信隐私遇到自动化守护效果展示核心功能全景图技术亮点深度解析1. 无操作检测引擎2. 微信路径智能获

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

Python位移操作和位运算的实现示例

《Python位移操作和位运算的实现示例》本文主要介绍了Python位移操作和位运算的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 位移操作1.1 左移操作 (<<)1.2 右移操作 (>>)注意事项:2. 位运算2.1

如何在 Spring Boot 中实现 FreeMarker 模板

《如何在SpringBoot中实现FreeMarker模板》FreeMarker是一种功能强大、轻量级的模板引擎,用于在Java应用中生成动态文本输出(如HTML、XML、邮件内容等),本文... 目录什么是 FreeMarker 模板?在 Spring Boot 中实现 FreeMarker 模板1. 环

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

SpringMVC 通过ajax 前后端数据交互的实现方法

《SpringMVC通过ajax前后端数据交互的实现方法》:本文主要介绍SpringMVC通过ajax前后端数据交互的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价... 在前端的开发过程中,经常在html页面通过AJAX进行前后端数据的交互,SpringMVC的controll

Spring Security自定义身份认证的实现方法

《SpringSecurity自定义身份认证的实现方法》:本文主要介绍SpringSecurity自定义身份认证的实现方法,下面对SpringSecurity的这三种自定义身份认证进行详细讲解,... 目录1.内存身份认证(1)创建配置类(2)验证内存身份认证2.JDBC身份认证(1)数据准备 (2)配置依

利用python实现对excel文件进行加密

《利用python实现对excel文件进行加密》由于文件内容的私密性,需要对Excel文件进行加密,保护文件以免给第三方看到,本文将以Python语言为例,和大家讲讲如何对Excel文件进行加密,感兴... 目录前言方法一:使用pywin32库(仅限Windows)方法二:使用msoffcrypto-too