【C语言】扫雷小游戏详细分析(模块化编程)——内附源码

这篇具有很好参考价值的文章主要介绍了【C语言】扫雷小游戏详细分析(模块化编程)——内附源码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

.
🚀write in front🚀
🔎大家好,我是gugugu。希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎
🆔本文由 gugugu 原创 CSDN首发🐒 如需转载还请通知⚠
📝个人主页:gugugu—CSDN博客
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​
📣系列专栏:gugugu的系列专栏——CSDN博客
✉️我们并非登上我们所选择的舞台,演出并非我们所选择的剧本📩

前言

在学完数组和函数之后,今天带来C语言的第二个小游戏——扫雷。
本程序对初学者来说存在一定难度,多次反复练习,加强理解即可。
本文将从设计思路,功能实现等角度进行详细教学分析。

注意:本游戏是多文件编程


一.介绍扫雷。

1.扫雷的规则

游戏规则:点击方格,如果是地雷,游戏失败,找到所有方格,而不踩到地雷游戏胜利。游戏初始,所有的方格都是被覆盖的。点开的“空”会标识数字,中心的“空”标识数字“1”,即表示其周围8个方格内仅有1颗雷,玩家需要通过这样的信息来判断正确的雷区位置并予以标识。最终排除所有地雷获胜。
看看扫雷游戏的原版是啥样的吧。
【C语言】扫雷小游戏详细分析(模块化编程)——内附源码,技术栏,博客创作,小白教学,c语言,开发语言,游戏

【C语言】扫雷小游戏详细分析(模块化编程)——内附源码,技术栏,博客创作,小白教学,c语言,开发语言,游戏
本文将介绍初阶的扫雷,进阶版将在不久之后继续更新。

2.扫雷功能模板

扫雷游戏主要由以下几个板块组成
a.菜单
b.初始化
c.打印游戏界面
d.布置雷
e.排除雷

二、扫雷功能分析

首先本游戏依旧采用do while循环的结构实现多次进行游戏的功能。

1.确定棋盘的大小和雷的个数

在这里我们需要使用宏来确定棋盘的大小和雷的个数
使用宏可以方便随时更改,而不会把程序给写死,也就是说,我们想要多大的棋盘,想要多少颗雷都可以随时更改

#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2//棋盘大小

#define BOOM 10//10课雷

2.菜单

扫雷游戏的菜单和猜数字游戏菜单的实现是一个道理,详细可见猜数字游戏博客
…链接…
创建一个变量,用1表示开始游戏,用0表示结束游戏,设计一个菜单进行选择即可。

void main()
{
printf("#####################\n");
printf("########1.play#######\n");
printf("########0.exit#######\n");
printf("#####################\n");
}

3.初始化

棋盘初始化就是将界面清空,放上我们想让界面存在的东西。
【C语言】扫雷小游戏详细分析(模块化编程)——内附源码,技术栏,博客创作,小白教学,c语言,开发语言,游戏

void init(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;
           }
        }
}

4.打印

我们玩游戏的时候肯定要看到游戏界面啊,所以需要写一个函数来打印游戏界面。
也就是打印数组的内容。
但是打印的时候不能只有*啊
我们还得打印行号和列号来辅助玩家确定坐标。
【C语言】扫雷小游戏详细分析(模块化编程)——内附源码,技术栏,博客创作,小白教学,c语言,开发语言,游戏

void Display(char board[ROWS][COLS],int row,int col)//这个地方使用rows和cols也可以,代码差别不大
{     
         //分割线
         printf("########扫雷########\n");
         //打印列号
         int i=0;
         for(i=0;i<=col;i++)
         {
           printf("%d ",i);
         }
         //换行
         printf("\n");
         //打印棋盘内容
         for(i=1;i<=row;i++)
         {
             int j=0;
             for(j=0;j<=col;j++)//一行
             {
             if(j=0)
             {
             printf("%d ",i);//打印行号
             }
             else
             {
             printf("%c ",board[i][j]);
             }
             }
             printf("\n");
         }
         printf("########扫雷########\n");
}

5.布置雷

首先我们确定雷的个数
使用宏来确定雷的个数,比较方便,易于更改
#define BOOM 10
但是记住雷的数量要布置的合理,不能出现9*9的棋盘,出现100颗雷,对吧。

  • 那么雷的位置如何确定呢?
    这就需要创建两个随机数分别放在x和y中,作为行号和列号。

布置雷肯定是把数组某一个位置上放雷,我们把雷记作‘1’,注意,这里的1是字符1,而不是数字1.

  • 但是肯定不止布置一颗雷啊,所以需要用到循环,创建一个变量int count=BOOM;
    把count作为while的判断条件,每进行一次循环count–,那么当count=0,也就是当雷布置完的时候,会自动退出循环。

  • 注意,每次布置雷的时候,要确定这个地方是否已经布置过雷了,如果布置过雷的话,重新产生随机数,重新布置这颗雷。

look look!!

void getboom(char board[ROWS][COLS],int row,int col)
{
      int x=0;
      int y=0;
      int count=BOOM;
      while(count)
      {
      int x=rand()%row+1;
      int y=rand()%col+1;
      if(board[x][y]=='0')
      {
      board[x][y]='1';
      count--;
      }
      }
}

6.排雷

布置好雷之后要进行排查雷,每次排查完一次之后都要进行一次排查完之后的展示
如果排到的地方是雷的话,你会被炸死,游戏结束;
如果不是雷,则在该处计算并输出旁边的八个格子内有多少颗雷;
一直循环,知道炸死,或者雷被排完。

void outboom(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col)
{
       int x=0;
       int y=0;
       int count=row*col-BOOM;
       while(count)
       { 
       printf("请输入坐标\n");
       scanf("%d %d",&x,&y);
       if(x>=1&&x<=row&&y>=1&&y<=col)
       {
          if(show[x][y]!='*')
          {
          printf("该位置已被排查,请重新输入\n”);
          }
          if(mine[x][y]=='1')
          {
          printf("很遗憾,你被炸死了\n");
          break;
          }
          else
          {
                  char num=getnum(mine,x,y);//需要再引入一个函数
                  show[x][y]=num;
                  display(show,ROW,COL);
           }
       }
       else
      {
      printf("坐标非法,请重新输入\n");
      }

7.数雷的个数

这里就需要另写一个函数来实现这个功能了,因为我们的数组show和mine都是字符数组,所以我们返回的雷的个数也需要是字符,所以将返回类型定义为char

char getnum(char board[ROWS][COLS], int x,int y)
{
     return (board[x-1][y-1]+
                board[x-1][y]+
                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*48+48);
  }
  • 来分析一下为什么会这么写

  • 首先我们先解释一下为什么可以字符加减

  • 每一个字符会对应一个ASCII码表, 字符会先转化为ASCII码值,用ASCII码值进行加减,再返回ASCII码表对应的字符

  • 【C语言】扫雷小游戏详细分析(模块化编程)——内附源码,技术栏,博客创作,小白教学,c语言,开发语言,游戏

  • 为什么要先减8*48呢?

  • 因为0的ASCII码值为48,这里就是相当于8个位置都减了一个字符0

  • 那为什么要加48呢?

  • 如果不加48的话,那运算结果就是从ASCII值0开始,可以看上表,ASCII码值0对应的字符是不显示字符,但是字符0对应的ASCII值为48,之后加上48之后,才能从字符0开始输出。【C语言】扫雷小游戏详细分析(模块化编程)——内附源码,技术栏,博客创作,小白教学,c语言,开发语言,游戏

三、效果演示

【C语言】扫雷小游戏详细分析(模块化编程)——内附源码,技术栏,博客创作,小白教学,c语言,开发语言,游戏
【C语言】扫雷小游戏详细分析(模块化编程)——内附源码,技术栏,博客创作,小白教学,c语言,开发语言,游戏
【C语言】扫雷小游戏详细分析(模块化编程)——内附源码,技术栏,博客创作,小白教学,c语言,开发语言,游戏
大致就是这些功能啦,更高级的功能将在下一次博客—进阶版扫雷更新,敬请期待!

四、源码

1、头文件(game.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 BOOM 10

void init(char board[ROWS][COLS], int rows, int cols, char set);

void display(char board[ROWS][COLS], int row, int col);

void getboom(char board[ROWS][COLS], int row, int col);

void outboom(char board[ROWS][COLS], int row, int col);

2、函数实现部分(game.c)

#define  _CRT_SECURE_NO_WARNINGS 1

#include "game.h"

char numboom(char board[ROWS][COLS], int x, int y)
{
	return board[x - 1][y - 1] +
		board[x - 1][y] +
		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 * 48 + 48;

}
//初始化
void init(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 display(char board[ROWS][COLS], int row, int col)
{
	printf("-------扫雷--------\n");
	int i = 0;
	//列号
	for (i = 0; i <= col; i++)
	{
		printf("%d ", i);
	}
	printf("\n");

	//打印内容
	for (i = 1; i <= row; i++)
	{
		int j = 0;
		for (j = 0; j <= col; j++)//一行
		{
			if (j == 0)
			{
				printf("%d ", i);//行号
			}
			else
			{
				printf("%c ", board[i][j]);
			}
		}
		printf("\n");
	}
	printf("-------扫雷--------\n");
}

//布置雷
void getboom(char board[ROWS][COLS], int row, int col)
{
	int count = BOOM;
	while (count)
	{
		int x = rand() % row + 1;
		int y = rand() % col + 1;
		if (board[x][y] == '0')
		{
			board[x][y] = '1';
			count--;
		}
	}
}

//排查雷
void outboom(char mine[ROWS][COLS],char show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int count = row * col - BOOM;
	while (count)
	{
		printf("请输入坐标\n");
		scanf("%d %d", &x, &y);

		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (show[x][y] != '*')
			{
				printf("位置已经排查,请重新输入\n");
			}

			if (mine[x][y] == '1')
			{
				printf("很遗憾,你被炸死了\n");
				display(mine, ROW, COL);
				break;
			}
			else
			{
				char num = numboom(mine, x, y);
				show[x][y] = num;
				display(show, ROW, COL);
				count--;
			}

			
		}
		else
		{
			printf("输入的坐标非法,请重新输入\n");
		}
	}
	if (count == 0)
	{
		printf("游戏获胜\n");
	}
}

3、主函数部分(test.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 };
	//初始化
	init(mine, ROWS, COLS, '0');
	init(show, ROWS, COLS, '*');
	//打印
	display(mine, ROW, COL);
	display(show, ROW, COL);
	//布置雷
	getboom(mine, ROW, COL);
	display(mine, ROW, COL);
	//排查雷
	outboom(mine, show, ROW, COL);
}
int main()
{
	srand((unsigned int)time(NULL));
	int input = 0;

	do
	{
		menu();
		printf("请选择\n");
	    scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("######  扫雷   ########\n");
			game();
			break;
		case 0:
			printf("安全退出\n");
			break;
		default :
			printf("选择错误,请重新选择\n");
			break;
		}
	} while (input);

	return 0;
}

好了,到这里本期分享就结束了,不知道各位小伙伴有没有学会,可以在评论区留言哦,博主看到就会回答的。下一期进阶版扫雷将很快更新!!!敬请期待!!!!!


!!!!!!!!!!!!!!求关注!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!一键三连吧!!!!!!!!!!!!!!!!

【C语言】扫雷小游戏详细分析(模块化编程)——内附源码,技术栏,博客创作,小白教学,c语言,开发语言,游戏文章来源地址https://www.toymoban.com/news/detail-624697.html

到了这里,关于【C语言】扫雷小游戏详细分析(模块化编程)——内附源码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • c语言小游戏之扫雷

    目录 一:游戏设计理念及思路 二:初步规划的游戏界面 三:开始扫雷游戏的实现 注:1.创建三个文件,test.c用来测试整个游戏的运行,game.c用来实现扫雷游戏的主体,game.h用来函数声明和包含头文件 2.为方便定位坐标,在展示数组时添加行号和列号 四:谢谢观看  听说看到

    2024年01月23日
    浏览(57)
  • C语言:轻松实现扫雷小游戏

    目录 一、前言 二、扫雷步骤 1.创建项目 2.设计整体框架 1.定义数组长度和雷的个数 2.game函数功能 三、头文件game.h代码实现  四、测试文件test.c代码实现 五、game函数功能实现 1.初始化棋盘 2.打印棋盘  3.布置雷 4. 获得雷的个数  5.排查雷 6.game函数实现代码 六、总结 大家好

    2024年02月03日
    浏览(55)
  • 【C】C语言实现扫雷小游戏

    相信大家一定都玩过扫雷小游戏,今天我就带大家来用C语言实现一个简易版的扫雷小游戏。 这里我们还是需要三个文件来封装我们的写的代码: test.c ----- 用于我们代码的测试,以及游戏整体框架的实现。 game .c ------ 用来封装实现我们游戏的相关函数。 game.h ------ 主要用来

    2024年02月11日
    浏览(122)
  • 【C语言】扫雷小游戏(递归展开版)

    哈喽,大家好,上次我们已经学习了三子棋小游戏,今天我们来学习扫雷小游戏了。 目录 1.游戏介绍 2.函数部分 2.1菜单 2.2game()函数 2.3mian()函数 2.4初始化棋盘 2.5打印棋盘 2.6布置雷 2.7排查雷 2.8统计雷 2.9递归,展开一片区域 3.完整代码展示  想必大家都玩过扫雷这款小游戏吧

    2024年02月12日
    浏览(52)
  • C语言——扫雷小游戏(递归展开版)

    哈喽,大家好,上次我们已经学习了三子棋小游戏,今天我们来学习扫雷小游戏了。 目录 1.游戏介绍 2.函数部分 2.1菜单 2.2game()函数 2.3mian()函数 2.4初始化棋盘 2.5打印棋盘 2.6布置雷 2.7排查雷 2.8统计雷 2.9递归,展开一片区域 3.完整代码展示  想必大家都玩过扫雷这款小游戏吧

    2024年02月03日
    浏览(58)
  • 【C语言】小游戏-扫雷(清屏+递归展开+标记)

    大家好,我是深鱼~ 目录 一、游戏介绍 二、文件分装  三、代码实现步骤 1.制作简易游戏菜单  2. 初始化棋盘(11*11)  3.打印棋盘(9*9) 4.布置雷   5.计算(x,y)周围8个坐标的和  6.排查雷   1清屏后打印棋盘 2递归展开 3标记雷 四、完整代码 game.h:相关函数的声明,整个代码要引用

    2024年02月12日
    浏览(57)
  • 【C语言实现扫雷小游戏——可展开一片】

    学习完了函数和数组,让我们做个扫雷小游戏巩固一下所学的知识把! 使用控制台操作 通过菜单实现选择 棋盘为9×9 默认随机布置10个雷 排查雷 如果排查的位置不是雷,就显示周围有几个雷 排查位置是雷,游戏结束,玩家失败 把10个雷全部排除,游戏结束,玩家成功 扫雷

    2024年02月08日
    浏览(53)
  • C语言之扫雷小游戏的实现【含递归展开】

    扫雷游戏是1992年发行的一款大众类益智游戏,对于许多80后、90后来说都是童年的回忆。如今三十年过去了,这款游戏依旧受到很多网友的喜爱,今天我们一起来模拟实现一下扫雷游戏。 本文所用的编译器是VS2022 这里我们使用模块化设计,模块化设计就是把各个模块的代码分

    2024年02月02日
    浏览(52)
  • 带你实现初阶扫雷小游戏—【C语言】

      目录 1. 扫雷游戏实现的思路 注意点1  注意点2  2. 函数实现扫雷功能 2.1 初始化棋盘 2.2 显示棋盘 2.3 设置雷 2.4 排查雷 2.5 返回附近雷的个数 3.源码 3.1 game.h 3.2 game.c  3.3 test.c 我们这里拿9*9的棋盘(其中包含10个雷)来实现(这里也可以自定义棋盘大小和雷的个数 》我们这

    2024年02月05日
    浏览(107)
  • C语言经典小游戏之扫雷(超详解释+源码)

    “少年气,是历尽千帆举重若轻的沉淀,也是乐观淡然笑对生活的豁达!” 今天我们学习一下扫雷游戏怎么用C语言来实现! 一个扫雷盘面由许多方格(cell)组成,方格中随机分布着一定数量的雷(mine),一个格子中至多只有1雷。胜利条件是打开所有安全格(非雷格,saf

    2024年02月12日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包