C语言小游戏,编程入门必看,初级扫雷

一.扫雷描述

C语言写一个简易的初级扫雷,棋盘是9乘9的规格,设计有10个雷,创建两个棋盘,一个mine数组棋盘存放雷的信息,雷用字符1表示,非雷用字符0表示,另一个show数组棋盘存放排查出雷的信息,用字符*表示。


二.扫雷的设计思路

2.1扫雷游戏的基本结构和菜单交互

设计一个简易的菜单,让玩家进行选择,玩家有可能选其他数字,所以使用多分支语句,为了让游戏可以重复玩,提高可玩性,这里使用do-while结构,至少可以玩一次,只有玩家输入0游戏才停止。

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

int main()
{
	int input = 0;
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("开始游戏\n");
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,请重新输入!\n");
			break;
		}
	} while (input);
	return 0;
}

2.2扫雷游戏的实现函数game()

void game()
{
	//存放雷的信息
	char mine[ROWS][COLS] = { 0 };

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

	//初始化棋盘
	InitBoard(mine, ROWS, COLS, '0');//全部是'0'
	InitBoard(show, ROWS, COLS, '*');//全部是'*'

	//打印棋盘
	DisplayBoard(show, ROW, COL);

	//布置雷
	SetMine(mine, ROW, COL);
	//DisplayBoard(mine, ROW, COL);//可以看见雷放的位置

	//排查雷
	FindMine(mine, show, ROW, COL);
}

2.3扫雷棋盘的创建

9乘9棋盘计算外围的雷的个数时会造成数组越界,所以要扩大一圈,ROW表示行,COL表示列,ROWS是11,COLS是11。

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

在这里插入图片描述


2.4扫雷棋盘的初始化函数InitBoard()

存放雷的信息的棋盘全部初始化为字符0,存放排查出雷的信息的棋盘全部初始化为*。

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

2.5扫雷棋盘的打印函数DisplayBoard()

因为只需要操作中间9乘9的格子,所以打印二维数组棋盘的元素时,数组行和列都从下标1开始,到9结束。

void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
	printf("-------------------\n");
	int i = 0;
	//打印列的坐标数字
	for (i = 0; i <= row; 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");
	}
	printf("-------------------\n");
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hS9FZBpZ-1628342655497)(img/image-20210807192303941.png)]


2.6扫雷棋盘的布置雷函数SetMine()

EASY_COUNT表示雷的数量,雷的位置是随机的.

void SetMine(char board[ROWS][COLS], int row, int col)
{
	int count = EASY_COUNT;
	while (count)
	{
		//随机生成坐标(1-9)
		int x = rand() % row + 1;
		int y = rand() % col + 1;
		if (board[x][y] != '1')
		{
			board[x][y] = '1';
			count--;
		}
	}
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QaVVw9ic-1628342655498)(img/image-20210807194240217.png)]


2.7扫雷棋盘的排查雷函数FindMine()

玩家输入要排查的坐标,坐标要合理,如果输入的坐标在mine数组里是雷,则游戏结束,不然就在show数组对应的坐标显示周围有几个雷,数字字符(0~9)对应的ASCII值减去ASCII值等于数字,如:‘3’ - ‘0’ = 3。

void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int win = 0;

	while (win < row * col - EASY_COUNT)//9*9-10 = 71
	{
		printf("请输入要排查的坐标:");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (mine[x][y] == '1')
			{
				printf("很遗憾,你被炸死了\n");
				DisplayBoard(mine, ROW, COL);
				break;
			}
			else
			{
				int count = GetMineCount(mine, x, y);
				show[x][y] = count + '0';//如'3' = 3 + '0',字符'3'表示周围有3个雷
				DisplayBoard(show, ROW, COL);
				win++;
			}
		}
		else
		{
			printf("坐标非法,请重新输入!\n");
		}
	}
	if (win == row * col - EASY_COUNT)
	{
		printf("恭喜你,排雷成功!\n");
		DisplayBoard(mine, ROW, COL);
	}
}

//统计所选坐标周围有几个雷
GetMineCount(char mine[ROWS][COLS], int x, int y)
{
	//周围8个坐标的字符值加起来减去8乘字符'0'的值得到有几个雷
	return (mine[x - 1][y] +
		mine[x - 1][y - 1] +
		mine[x][y - 1] +
		mine[x + 1][y - 1] +
		mine[x + 1][y] +
		mine[x + 1][y + 1] +
		mine[x][y + 1] +
		mine[x - 1][y + 1] - 8 * '0');
}

三、扫雷的代码

3.1game.h:库函数,define定义的宏,扫雷函数的声明

#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 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[ROWS][COLS], char show[ROWS][COLS], int row, int col);

3.2test.c:扫雷游戏的基本结构

#include "game.h"

void menu()
{
	printf("************************\n");
	printf("*****     扫雷     *****\n");
	printf("******   1.play   ******\n");
	printf("******   0.exit   ******\n");
	printf("************************\n");
}
void game()
{
	//存放雷的信息
	char mine[ROWS][COLS] = { 0 };
	
	//存放排查出雷的信息
	char show[ROWS][COLS] = { 0 };

	//初始化棋盘
	InitBoard(mine, ROWS, COLS, '0');
	InitBoard(show, ROWS, COLS, '*');

	//打印棋盘
	DisplayBoard(show, ROW, COL);

	//布置雷
	SetMine(mine, ROW, COL);
	//DisplayBoard(mine, ROW, COL);//可以看见雷放的位置

	//排查雷
	FindMine(mine, show, ROW, COL);
}

int main()
{
	srand((unsigned int)time(NULL));//作为rand()函数的随机数种子
	int input = 0;
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("开始游戏\n");
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,请重新输入!\n");
			break;
		}
	} while (input);
	return 0;
}

3.3game.c:扫雷游戏函数的实现

#include "game.h"

//初始化棋盘
void InitBoard(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 DisplayBoard(char board[ROWS][COLS], int row, int col)
{
	printf("-------------------\n");
	int i = 0;
	//打印列的坐标数字
	for (i = 0; i <= row; 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");
	}
	printf("-------------------\n");
}

//布置雷
void SetMine(char board[ROWS][COLS], int row, int col)
{
	int count = EASY_COUNT;
	while (count)
	{
		//随机在棋盘上生成雷
		int x = rand() % row + 1;
		int y = rand() % col + 1;

		if (board[x][y] != '1')
		{
			board[x][y] = '1';
			count--;
		}
	}
}

//统计所选坐标周围有几个雷
GetMineCount(char mine[ROWS][COLS], int x, int y)
{
	//把周围雷'1'的坐标加起来
	return (mine[x - 1][y] +
		mine[x - 1][y - 1] +
		mine[x][y - 1] +
		mine[x + 1][y - 1] +
		mine[x + 1][y] +
		mine[x + 1][y + 1] +
		mine[x][y + 1] +
		mine[x - 1][y + 1] - 8 * '0');
}

//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int win = 0;

	while (win < row * col - EASY_COUNT)
	{
		printf("请输入要排查的坐标:");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (mine[x][y] == '1')
			{
				printf("很遗憾,你被炸死了\n");
				DisplayBoard(mine, ROW, COL);
				break;
			}
			else
			{
				int count = GetMineCount(mine, x, y);
				show[x][y] = count + '0';//如'3' = 3 + '0',字符'3'表示周围有3个雷
				DisplayBoard(show, ROW, COL);
				win++;
			}
		}
		else
		{
			printf("坐标非法,请重新输入!\n");
		}
	}
	if (win == row * col - EASY_COUNT)
	{
		printf("恭喜你,排雷成功!\n");
		DisplayBoard(mine, ROW, COL);
	}
}

排雷成功:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TtsEL4ea-1628342655500)(img/image-20210807211014937.png)]

排雷失败:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qIsH3spG-1628342655501)(img/image-20210807211105442.png)]


以上就是扫雷的实现内容。

作者水平有限,如果代码或者文章哪里出现了错误,请大家在评论区留言,方便及时改正。

长路漫漫,代码作伴,制作不易,给个三连!!!

觉得不错点个赞支持一下啦!
请添加图片描述

  • 10
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
如 果你会一点C、C++语言,你就可以学习游戏编程了,开发真正的游戏!如果你学过一点C++更好,没学过也没关系。本课程教你从零基础开始开发7个完整的 游戏:Brainiac、Light Cycles、Henway、Battle Office、Meteor Defense、Space Out、Stunt Jumper。教程无KEY wmv版本,手机平板等移动设备均可观看! 第1部分 入门 第1章 学习开发游戏的基础知识 1.1 认识视频游戏 1.1.1 为什么人们如此沉迷于开发视频游戏 1.1.2 视频游戏的类型 1.2 学习游戏设计的要素 1.2.1 提出基本思想 1.2.2 整理剧情 1.2.3 可视化图形 1.2.4 为游戏选择正确的声音 1.2.5 使用控制器控制游戏 1.2.6 确定游戏模式 1.3 面向对象的编程游戏 1.3.1 理解OOP 1.3.2 在游戏中应用OOP 1.4 研究相关工具 1.4.1 编译器和开发环境 1.4.2 选择图形工具 1.4.3 选择声音和音乐工具 1.5 小结 1.6 亲身实践 第2章 创建游戏引擎 2.1 什么是游戏引擎 2.2 考虑游戏引擎的作用 2.2.1 将游戏分解为事件 2.2.2 建立游戏的计时机制 2.3 开发游戏引擎 2.3.1 游戏事件函数 2.3.2 GameEngine类 2.4 开发Blizzard示例 2.4.1 编写程序代码 2.4.2 测试完成的程序 2.5 小结 2.6 游戏大变身 第3章 学习绘制基本图形 3.1 图形基础 3.1.1 理解图形坐标系统 3.1.2 学习颜色的基础知识 3.2 查看Windows中的图形 3.2.1 使用设备环境 3.2.2 使用画笔写 3.2.3 使用画刷绘制 3.2.4 使用位图绘制图像 3.2.5 使用调色板管理颜色 3.3 绘制窗口 3.3.1 绘制文本 3.3.2 绘制图元 3.3.3 使用画笔和画刷 3.4 开发Crop Circles示例 3.4.1 编写程序代码 3.4.2 测试完成的程序 3.5 小结 3.6 亲身实践 第4章 绘制图形图像 4.1 位图图像的基础知识 4.2 深入学习位图 4.3 开发位图类 4.3.1 位图类的工作原理 4.3.2 整合代码 4.4 开发Slideshow示例 4.4.1 编写程序代码 4.4.2 汇集资源 4.4.3 测试完成的程序 4.5 小结 4.6 游戏大变身 第2部分 与游戏玩家交互 第5章 使用键盘和鼠标控制游戏 5.1 游戏与用户输入 5.2 了解用户输入设备 5.2.1 接受键盘输入 5.2.2 响应鼠标 5.2.3 使用游戏杆交互 5.3 评估游戏的键盘输入 5.4 跟踪鼠标 5.5 向游戏引擎添加输入支持 5.5.1 添加键盘支持 5.5.2 添加鼠标支持 5.5.3 修改Bitmap类 5.6 开发UFO示例 5.6.1 编写程序代码 5.6.2 测试完成的程序 5.7 小结 5.8 亲身实践 第6章 示例游戏:Brainiac 6.1 游戏的玩法 6.2 设计游戏 6.3 开发游戏 6.4 测试游戏 6.5 小结 6.6 游戏大变身 第7章 使用游戏杆改进输入 7.1 了解游戏杆的基础知识 7.2 校准游戏杆 7.3 追踪游戏杆的移动 7.4 向游戏引擎添加游戏杆支持 7.4.1 访问Win32多媒体功能 7.4.2 开发游戏杆代码 7.5 开发UFO 2示例 7.5.1 编写程序代码 7.5.2 测试完成的程序 7.6 小结 7.7 亲身实践 第8章 示例游戏:Light Cycles 8.1 游戏的玩法 8.2 设计游戏 8.3 开发游戏 8.4 测试游戏 8.5 小结 8.6 游戏大变身 第3部分 在游戏中使用子画面 第9章 使用于画面动画移动对象 9.1 理解动画的基础知识 9.1.1 动画和帧频 9.1.2 了解计算机动画 9.2 2D动画与3D动画 9.3 理解2D动画的类型 9.3.1 基于帧的动画 9.3.2 基于形状的动画 9.4 将子画面动画应用于游戏 9.5 设计通用的子画面 9.6 创建Sprite类 9.6.1 创建和破坏子画面 9.6.2 更新子画面 9.6.3 绘制子画面 9.7 开发Planets示例程序 9.7.1 编写程序代码 9.7.2 测试完成的程序 9.8 小结 9.9 亲身实践 第10章 管理子画面 10.1 了解管理子画面的需求 10.2 设计子画面管理器 10.3 向游戏引擎添加子画面管理器 10.3.1 改进Sprite类 10.3.2 增强游戏引擎 10.4 使用双重缓存消除闪烁 10.5 开发Planets 2示例 10.5.1 编写程序代码 10.5.2 测试完成的程序 10.6 小结 10.7 游戏大变身 第11章 示例游戏:Henway 11.1 游戏的玩法 11.2 设计游戏 11.3 开发游戏 11.4 测试游戏 11.5 小结 11.6 游戏大变身 第4部分 使用声音和音乐 第12章 播放数字声音效果 12.1 理解数字声音 12.2 了解Windows波形声音 12.3 了解声音工具 12.3.1 Sony Sound Forge 12.3.2 Adobe Audition 12.3.3 廉价的声音编辑器 12.4 创建和编辑声音 12.5 查找声音和音乐 12.6 访问波形声音 12.7 播放波形声音 12.7.1 播放文件中的波形声音 12.7.2 播放作为资源的波形声音 12.7.3 循环播放波形声音 12.7.4 停止播放波形声音 12.8 开发Brainiac 2示例程序 12.8.1 编写程序代码 12.8.2 组合资源 12.8.3 测试完成的游戏 12.9 小结 12.10 亲身实践 第13章 播放MIDI音乐 13.1 感受MIDI音乐 13.2 理解Windows媒体控制接口 13.3 使用MCI播放MIDI音乐 13.3.1 打开MIDI设备 13.3.2 播放MIDI歌曲 13.3.3 暂停MIDI歌曲 13.3.4 关闭MIDI设备 13.4 向游戏引擎添加MIDI音乐支持 13.5 开发Henway 2示例程序 13.5.1 编写程序代码 13.5.2 测试完成的游戏 13.6 小结 13.7 亲身实践 第14章 示例游戏:Battle Office 14.1 游戏的玩法 14.2 设计游戏 14.3 开发游戏 14.4 测试游戏 14.5 小结 14.6 亲身实践 第5部分 高级动画 第15章 实现子画面外观动画 15.1 再次介绍帧动画 15.2 设计动画子画面 15.3 向游戏引擎添加动画子画面支持 15.3.1 只绘制位图的一部分 15.3.2 对Sprite类实现动画 15.4 开发Battle Office 2示例程序 15.4.1 编写程序代码 15.4.2 测试完成的游戏 15.5 小结 15.6 游戏大变身 第16章 创建子画面背景 16.1 了解游戏背景的重要性 16.2 了解游戏背景的类型 16.2.1 纯色背景 16.2.2 图像背景 16.2.3 动画背景 16.2.4 滚动背景 16.3 向游戏引擎添加背景支持 16.3.1 创建基本的背景类 16.3.2 创建动画背景类 16.4 开发Roids示例 16.4.1 编写程序代码 16.4.2 测试完成的游戏 16.5 小结 16.6 亲身实践 第17章 示例游戏:Meteor Defense 17.1 游戏的玩法 17.2 设计游戏 17.3 增强游戏引擎中的子画面 17.4 开发游戏 17.5 测试游戏 17.6 小结 17.7 游戏大变身 第6部分 让游戏拥有大脑 第18章 教游戏思考 18.1 理解人工智能 18.2 了解游戏AI的类型 18.2.1 漫游AI 18.2.2 行为AI 18.2.3 策略AI 18.3 开发AI策略 18.4 开发Roids 2示例程序 18.4.1 编写程序代码 18.4.2 测试完成的程序 18.5 小结 18.6 亲身实践 第19章 示例游戏:Space Out 19.1 游戏的玩法 19.2 设计游戏 19.3 向游戏引擎中添加另一个子画面特性 19.4 开发游戏 19.5 测试游戏 19.6 小结 第7部分 增添游戏的趣味性 第20章 使用闪屏增添游戏的活力 20.1 闪屏的重要性 20.2 了解闪屏 20.3 创建Space Out 2游戏 20.3.1 编写游戏代码 20.3.2 测试完成的游戏 20.4 小结 20.5 亲身实践 第21章 使用演示模式展示游戏 21.1 什么是演示模式 21.2 演示模式的细节 21.3 开发Space Out 3游戏 21.3.1 编写游戏代码 21.3.2 测试完成的游戏 21.4 小结 21.5 游戏大变身 第22章 记录高分 22.1 记录得分的重要性 22.2 确定高分数据模型 22.3 存储和检索高分数据 22.4 开发Space Out 4游戏 22.4.1 编写游戏代码 22.4.2 测试完成的游戏 22.5 小结 22.6 亲身实践 第8部分 附加练习 第23章 使用滚动背景更改远景 23.1 什么是滚动背景 23.1.1 横向滚动的背景 23.1.2 纵向滚动的背景 23.1.3 视差滚动背景 23.2 理解滚动背景的工作原理 23.3 向游戏引擎添加滚动背景支持 23.3.1 创建背景图层类 23.3.2 创建滚动背景类 23.4 开发Wanderer示例 23.4.1 编写程序代码 23.4.2 测试完成的程序 23.5 小结 23.6 游戏人变身 第24章 示例游戏:Stunt Jumper 24.1 游戏的玩法 24.2 设计游戏 24.3 开发游戏 24.4 测试游戏 24.5 小结 24.6 游戏大变身 24.7 亲身实践

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

那年盛夏繁如花

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值