C语言实现扫雷游戏详细代码实例

扫雷游戏

思路:先制作一个菜单让玩家选择是玩游戏还是退出游戏,菜单做好了,接着我们开始制作扫雷的棋盘并初始化,初始化弄完了我们下一步开始埋雷,雷埋好了就开始扫雷。

大概思路就是这样具体实现看下面:

菜单的实现代码:

int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));

	do
	{
		printf("**************************\n");
		printf("*** 1. play 0. exit ***\n");
		printf("*** 2. clear ***\n");
		printf("**************************\n");
		printf("请选择:>");
		scanf("%d", &input);

		switch (input)
		{
		case 1:
			game();//游戏实现
			break;
		case 2://清屏选项
			system("cls");
			break;
		case 0:
			printf("退出程序!\n");
			break;
		default:
			printf("输入错误,请重新输入!\n");
			Sleep(1000);
			system("cls");
			break;
		}
	} while (input);

	return 0;
}

这里我们用了Windows库函数清屏,如果屏幕上显示的东西太多了,我们可以选择2来清屏,还有一个睡眠函数,如果输出错误会短暂的提示你一秒,告诉你选择错误了。

效果展示图:

制作好菜单那我们开始实现整个游戏的逻辑框架了,定义两个二维数组,一个用于显示,一个用于存放地雷。如果这两个东西都只用一个二维数组的话后面的实现逻辑会比较麻烦所以我选择使用两个二维数组。

char mine[ROWS][COLS] = { 0 };//用于埋雷
char show[ROWS][COLS] = { 0 };//用于游戏的画面显示

有这两个二维数组我们开始初始化

//初始化
void initzeboard(char mine[ROWS][COLS], int rows, int cols, char val)
{
	int i = 0;
	int j = 0;

	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < cols; j++)
		{
			mine[i][j] = val;
		}
	}
}

我遍历整个二维数组来初始化,val这个参数是用于接收这两个二维数组的初始化的内容,如果不用这个val参数我就要再写一个函数封装很麻烦。

接下来,实现个打印棋盘函数来看看我们的初始化是否正确的初始化成我想要的内容

打印棋盘代码:

//显示棋盘
void Display_board(char mine[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;

	printf("  扫雷游戏\n");
	printf("---------------------------------\n");
	for (j = 0; j <= col; j++)
	{
		printf("%d ", j);
	}

	printf("\n");

	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);
		for (j = 1; j <= col; j++)
		{
			printf("%c ", mine[i][j]);
		}

		printf("\n");

	}
}

接下来看看我们初始化的是否正确:

可以看到它正确的初始化了,全0代表埋雷的二维数组,而*代表的是用户看到的,正常来说,这个埋雷是不需要显示出来的,但是我们需要确认是否正确初始化所以打印出来看看,下一步我们开始埋雷。

//埋雷
void random_mine(char mine[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int count = EASILY;

	while (count)
	{
		x = rand() % row + 1;
		y = rand() % col + 1;

		if (mine[x][y] == '0')//用于判断是否正确的埋雷,只有我们这没被埋过的雷我们才自减
		{
			mine[x][y] = '1';
			count--;
		}
	}
}

埋好雷的效果:

1代表是雷,0代表步是雷,埋好的雷会被赋值成字符1

埋雷我采用随机函数来帮我埋下雷,弄好这步接来的就是扫雷这很关键。

扫雷代码:

//扫雷
void mine_sweeping(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;

	while (count < row * col - EASILY)
	{
		system("cls");
		Display_board(show, COL, ROW);
		printf("请输入坐标:>");
		scanf("%d %d", &x, &y);

		if ((1 <= x && x <= row) && (1 <= y && y <= col))
		{
			if (mine[x][y] == '0')
			{
				int leng = statistics_mine(mine, x, y);
				show[x][y] = leng + '0';
				count++;
			}
			else
			{
				printf("很遗憾你被炸死了\n");
				Display_board(mine, ROW, COL);
				break;
			}
		}
		else
		{
			printf("请输入有效数字!\n");
		}
	}

	if (count == row * col - EASILY)
	{
		printf("恭喜你扫雷成功!\n");
		Display_board(mine, ROW, COL);
	}
}

如果玩家输入的坐标是合法的我们就统计它周围有多少雷,统计雷的功能我做成了一个内部函数防止重名。

如果全部没有雷的地方都排查完了,我们就停止循环。然后打印下雷的棋盘让玩家知道哪有雷,如果被炸死了,我们也打印下雷的二维数组让玩家死得瞑目。

统计雷的函数:

//统计周围雷的个数
static int statistics_mine(char mine[ROWS][COLS], int x, int y)
{
	return mine[x - 1][y - 1] +
		mine[x - 1][y] +
		mine[x - 1][y + 1] +
		mine[x][y - 1] +
		mine[x][y + 1] +
		mine[x + 1][y - 1] +
		mine[x + 1][y] +
		mine[x + 1][y + 1] - 8 * '0';
}

根据ASCII码字符1减去字符0就是整形1,所以根据此方法我们就只用把周围的雷全部加起来减去字符零就可以得到周围雷的个数并返回 。

统计雷效果图:

周围没有雷就是0,如果有就显示个数。

通关也会打印所有雷的位置并提示你是否通关

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m4tO2ZuP-1613214039851)(C:\Users\86176\AppData\Roaming\Typora\typora-user-images\image-20210213185535958.png)]

头文件:

#pragma once
#include <stdio.h>
#include <Windows.h>
#include <time.h>
#include <stdlib.h>

#define ROW 9
#define COL 9
#define ROWS ROW + 2
#define COLS COL + 2
#define EASILY 0//雷的数量

//初始化
void initzeboard(char mine[ROWS][COLS], int rows, int cols, char val);

//显示棋盘
void Display_board(char mine[ROWS][COLS], int row, int col);

//埋雷
void random_mine(char mine[ROWS][COLS], int row, int col);

//扫雷
void mine_sweeping(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

游戏实现代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include "Game.h"

int count = 0;//统计还剩多少格子没被扫

void game()//游戏实现
{
	char mine[ROWS][COLS] = { 0 };//用于埋雷
	char show[ROWS][COLS] = { 0 };//用于游戏的画面显示

	//初始化
	initzeboard(show, ROWS, COLS, '*');
	initzeboard(mine, ROWS, COLS, '0');

	//显示棋盘
	Display_board(show, ROW, COL);
	//Display_board(mine, ROW, COL);

	//埋雷
	random_mine(mine, ROW, COL);
	//Display_board(mine, ROW, COL);

	//扫雷
	mine_sweeping(mine, show, ROW, COL);
}

//初始化
void initzeboard(char mine[ROWS][COLS], int rows, int cols, char val)
{
	int i = 0;
	int j = 0;

	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < cols; j++)
		{
			mine[i][j] = val;
		}
	}
}

//显示棋盘
void Display_board(char mine[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;

	printf("  扫雷游戏\n");
	printf("---------------------------------\n");
	for (j = 0; j <= col; j++)
	{
		printf("%d ", j);
	}

	printf("\n");

	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);
		for (j = 1; j <= col; j++)
		{
			printf("%c ", mine[i][j]);
		}

		printf("\n");

	}
}

//埋雷
void random_mine(char mine[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int count = EASILY;

	while (count)
	{
		x = rand() % row + 1;
		y = rand() % col + 1;

		if (mine[x][y] == '0')
		{
			mine[x][y] = '1';
			count--;
		}
	}
}

//统计周围雷的个数
static int statistics_mine(char mine[ROWS][COLS], int x, int y)
{
	return mine[x - 1][y - 1] +
		mine[x - 1][y] +
		mine[x - 1][y + 1] +
		mine[x][y - 1] +
		mine[x][y + 1] +
		mine[x + 1][y - 1] +
		mine[x + 1][y] +
		mine[x + 1][y + 1] - 8 * '0';
}

//扫雷
void mine_sweeping(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;

	while (count < row * col - EASILY)
	{
		system("cls");
		Display_board(show, COL, ROW);
		printf("请输入坐标:>");
		scanf("%d %d", &x, &y);

		if ((1 <= x && x <= row) && (1 <= y && y <= col))
		{
			if (mine[x][y] == '0')
			{
				int leng = statistics_mine(mine, x, y);
				show[x][y] = leng + '0';
				count++;
			}
			else
			{
					printf("很遗憾你被炸死了\n");
					Display_board(mine, ROW, COL);
					break;
			}
		}
		else
		{
				printf("请输入有效数字!\n");
		}
	}

	if (count == row * col - EASILY)
	{
		printf("恭喜你扫雷成功!\n");
		Display_board(mine, ROW, COL);
	}
}

主函数代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include "Game.h"

extern void game();

int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));

	do
	{
		printf("**************************\n");
		printf("*** 1. play 0. exit ***\n");
		printf("*** 2. clear ***\n");
		printf("**************************\n");
		printf("请选择:>");
		scanf("%d", &input);

		switch (input)
		{
		case 1:
			game();//游戏实现
			break;
		case 2://清屏选项
			system("cls");
			break;
		case 0:
			printf("退出程序!\n");
			break;
		default:
			printf("输入错误,请重新输入!\n");
			Sleep(1000);
			system("cls");
			break;
		}
	} while (input);

	return 0;
}

到此这篇关于C语言实现扫雷游戏详细代码实例的文章就介绍到这了,更多相关C语言实现扫雷游戏内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C语言模拟实现扫雷游戏

    扫雷是Windows系统的经典游戏,下文将利用c语言实现这个经典的小游戏.本版本程序添加了炸弹标记功能.但由于作者水平实现较为死板,此处留坑待以后学习后改进. Part 1主函数部分: 此部分主要提供用户界面,不同程序均可利用: int main() { srand((unsigned int)time(NULL)); int input = 0; do { menu(); printf("请选择:>\n"); scanf("%d", &input);

  • C语言实现简单的扫雷游戏

    本文实例为大家分享了C语言实现简单扫雷游戏的具体代码,供大家参考,具体内容如下 前言 扫雷游戏规则: 1.踩过所有非雷格子即扫雷成功,踩到雷即游戏结束. 2.点击方格,如果出现数字,数字表示这个格子周围八个格子的雷的个数. 一.如何实现? 1.如何实现雷与雷周围的信息不冲突? 如果采用一个二维数组,1表示雷,0表示非雷,那么某一坐标周围如果雷的个数是1,就会与前面冲突,所以设定两个字符型(char)数组,数组mine用来存储雷的信息,数组show用来存放排查出来的雷的信息(周围八个格子中雷的个数

  • C语言代码实现简单扫雷游戏

    C语言实现扫雷游戏,供大家参考,具体内容如下 game1.h中的代码如下: 里边放置的是相关的函数声明 #include<stdio.h> #include<stdlib.h> #include<time.h> #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

  • C语言实现扫雷游戏详解

    本文实例为大家分享了C语言实现扫雷游戏的具体代码,供大家参考,具体内容如下 功能设计 扫雷大家应该都玩过,这是一个十分经典的游戏,今天我将给大家讲解如何用C语言实现扫雷,我的这个扫雷有如下几个功能: 1.显示该点周围雷的个数 2.第一次下子,不炸死 3.坐标周围没雷,可以实现展开 4.游戏结束后展示玩家用时 效果展示 话不多说,先附上效果图: 设计思路 我们只要输入坐标就可以扫雷了,是不是很有趣? 其实要想实现这也不难,我们要用几个算法模块来模拟游戏规则,需要用函数来调用各个模块使游戏跑起来.

  • C语言实现扫雷游戏详细代码

    本文实例为大家分享了C语言实现扫雷游戏的详细代码,供大家参考,具体内容如下 一.思想实现 本文的扫雷游戏主要实现以下的功能: 1.显示雷和其信息 2.输入一个坐标可观测其周围九格内的地雷数 3.点击到地雷则游戏结束 用到的IDE为VS2013 二.源代码 创建一个头文件saolei.h 存放关于所有自定义函数的声明 #define COL 9 char** creatMat(int row, int col); void intMat(char** Mat, int row, int col,

  • C语言实现扫雷游戏详细代码实例

    扫雷游戏 思路:先制作一个菜单让玩家选择是玩游戏还是退出游戏,菜单做好了,接着我们开始制作扫雷的棋盘并初始化,初始化弄完了我们下一步开始埋雷,雷埋好了就开始扫雷. 大概思路就是这样具体实现看下面: 菜单的实现代码: int main() { int input = 0; srand((unsigned int)time(NULL)); do { printf("**************************\n"); printf("*** 1. play 0. exi

  • C语言实现扫雷游戏详细流程

    目录 前言 头文件部分 主函数部分(源文件) 函数定义(原文件) 1.菜单打印 2.初始化棋盘 3.打印棋盘 4.生成地雷 5.数雷并赋值给trueboard 6.排查雷区 7.展开 8.判断输赢 前言 嘿!是不是写扫雷小游戏的时候发现一个个输入太慢了?是不是想要展开却发现陷入了死递归?让小黄教教你怎么巧妙地解决这个问题吧! 其实总结起来就是一句话“可以让计算机多判断,但是不能让他多算”.只要每次判断一个格子周围雷数的时候赋值到另一个棋盘,后续递归的时候就不判断这个地方的棋盘就解决啦! PS:采

  • Java实现扫雷游戏详细代码讲解

    目录 效果展示 难度选择展示 游戏界面展示 代码展示 主类:GameWin类 底层地图MapBottom类 顶层地图MapTop类 底层数字BottomNum类 初始化地雷BottomRay类 工具GameUtil类 难度选择GameSelect类 项目结构 程序界面布局 总结 大家好!上一期我们使用GUI技术写了一个简单的扫雷小游戏,今天对这个Java应用程序更新迭代,增加了难度选择等功能,修复了已知的几个问题.成为初学者学习的好项目!Java实现扫雷小游戏[完整版] 效果展示 难度选择展示

  • C语言实现扫雷游戏及其优化

    本文实例为大家分享了C语言实现扫雷游戏及其优化的具体代码,供大家参考,具体内容如下 关于扫雷优化 1.核心思想:使用两个二维数组进行设计,一个用于显示,一个用于后台雷的布置. 2.使用宏常量,后期可以任意修改游戏难度. 3.关于扫雷拓展模块,目前使用的方法比较low,若周围均没有,则全部显示. 4.剩余位置数使用全局变量count,必须考虑拓展之后count变化. 有待改进之处 1.需设计标记雷的步骤,增加用户体验. 2.拓展方式有待改进. 3.界面布局仍需要进行优化. 扫雷游戏代码 #incl

  • C语言实现扫雷游戏(初级版)

    本文实例为大家分享了C语言实现扫雷游戏的具体代码,供大家参考,具体内容如下 game.h #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 10 //初始化棋盘 void InitBoard(char board[ROWS][COLS], int rows,

  • C语言实现扫雷游戏源代码

    本文实例为大家分享了C语言实现扫雷游戏的具体代码,供大家参考,具体内容如下 此次扫雷中我们以9乘以9的表格为例,后期可自动调动 主要思路:建立两个11乘以11的表格,分别为布雷和排雷后的表格,其中我们以字符1表示此处有雷,字符0表示此处无雷,在布雷时我们用时间函数布置随机的10个雷(具体多少个雷可自行选择),在另一个表格中显示出所选位置周围雷的个数 建立11*11的表格是因为便于统计四条边上位置周围含雷的个数 用vs建立头文件game.n和两个源文件game.c和test.c (先分开讲解,在文

  • C语言实现扫雷游戏(可展开)

    本文实例为大家分享了C语言实现扫雷游戏的具体代码,供大家参考,具体内容如下 # 一.游戏的思路 先理清游戏大概需要实现的功能,菜单功能的实现.棋盘初始化.打印棋盘.布置雷等.运用两个数组,一个放入布置雷的信息,另一个放入排查雷的信息.选一个坐标扫雷,坐标有雷则游戏结束,没有就计算选中坐标的周围8个格子中雷的总数放入选中的坐标中,若选中的坐标周围8个格子中都没有雷则自动展开.考虑到棋盘边框的情况,实际数组要比打印出的棋盘多两行两列.下面是宏定义和函数声明: ROW.COL为打印行.列,ROWS.C

  • C语言版扫雷游戏

    本文实例为大家分享了C语言版扫雷游戏的具体代码,供大家参考,具体内容如下 1.思路 一.创建二维数组,来表示地图 每一个格子要表示的信息: 1.未翻开状态(草地)和已翻开状态(数字) 2.该格子是地雷或者不是地雷(1表示是地雷,0表示不是) 二.使用两个二维数组来分别表示以上的两种状态 第一个二维数组 char showMap[9][9];表示每个格子的翻开和未翻开状态 表示未翻开,字符'0'-'8'表示已翻开的数字 第二个二维数组 char mineMap[9][9];表示每个格子是否是地雷

随机推荐