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

相关文章

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略 1. 特权模式限制2. 宿主机资源隔离3. 用户和组管理4. 权限提升控制5. SELinux配置 💖The Begin💖点点关注,收藏不迷路💖 Kubernetes的PodSecurityPolicy(PSP)是一个关键的安全特性,它在Pod创建之前实施安全策略,确保P

工厂ERP管理系统实现源码(JAVA)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本,并实时掌握各环节的运营状况。 在采购管理方面,系统能够处理采购订单、供应商管理和采购入库等流程,确保采购过程的透明和高效。仓库管理方面,实现库存的精准管理,包括入库、出库、盘点等操作,确保库存数据的准确性和实时性。 生产管理模块则涵盖了生产计划制定、物料需求计划、