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

相关文章

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

OpenCV图像形态学的实现

《OpenCV图像形态学的实现》本文主要介绍了OpenCV图像形态学的实现,包括腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽运算和黑帽运算,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起... 目录一、图像形态学简介二、腐蚀(Erosion)1. 原理2. OpenCV 实现三、膨胀China编程(

通过Spring层面进行事务回滚的实现

《通过Spring层面进行事务回滚的实现》本文主要介绍了通过Spring层面进行事务回滚的实现,包括声明式事务和编程式事务,具有一定的参考价值,感兴趣的可以了解一下... 目录声明式事务回滚:1. 基础注解配置2. 指定回滚异常类型3. ​不回滚特殊场景编程式事务回滚:1. ​使用 TransactionT

Android实现打开本地pdf文件的两种方式

《Android实现打开本地pdf文件的两种方式》在现代应用中,PDF格式因其跨平台、稳定性好、展示内容一致等特点,在Android平台上,如何高效地打开本地PDF文件,不仅关系到用户体验,也直接影响... 目录一、项目概述二、相关知识2.1 PDF文件基本概述2.2 android 文件访问与存储权限2.

使用Python实现全能手机虚拟键盘的示例代码

《使用Python实现全能手机虚拟键盘的示例代码》在数字化办公时代,你是否遇到过这样的场景:会议室投影电脑突然键盘失灵、躺在沙发上想远程控制书房电脑、或者需要给长辈远程协助操作?今天我要分享的Pyth... 目录一、项目概述:不止于键盘的远程控制方案1.1 创新价值1.2 技术栈全景二、需求实现步骤一、需求

Spring Shell 命令行实现交互式Shell应用开发

《SpringShell命令行实现交互式Shell应用开发》本文主要介绍了SpringShell命令行实现交互式Shell应用开发,能够帮助开发者快速构建功能丰富的命令行应用程序,具有一定的参考价... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定义S

SpringBatch数据写入实现

《SpringBatch数据写入实现》SpringBatch通过ItemWriter接口及其丰富的实现,提供了强大的数据写入能力,本文主要介绍了SpringBatch数据写入实现,具有一定的参考价值,... 目录python引言一、ItemWriter核心概念二、数据库写入实现三、文件写入实现四、多目标写入

Android Studio 配置国内镜像源的实现步骤

《AndroidStudio配置国内镜像源的实现步骤》本文主要介绍了AndroidStudio配置国内镜像源的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、修改 hosts,解决 SDK 下载失败的问题二、修改 gradle 地址,解决 gradle

SpringSecurity JWT基于令牌的无状态认证实现

《SpringSecurityJWT基于令牌的无状态认证实现》SpringSecurity中实现基于JWT的无状态认证是一种常见的做法,本文就来介绍一下SpringSecurityJWT基于令牌的无... 目录引言一、JWT基本原理与结构二、Spring Security JWT依赖配置三、JWT令牌生成与

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带