关闭

C语言简单实现扫雷小游戏~~~

标签: c语言扫雷游戏算法
469人阅读 评论(0) 收藏 举报
分类:

C语言实现扫雷

C语言编写小游戏扫雷,因为目前个人技术问题,外观界面不能做出来,最终呈现的效果还是在命令里进行,但是总体来说还是完成了扫雷的基本功能。
不过,标记的函数,没有写的完美,每次都要进行标记,比较麻烦,所以在代码中我将其注释了,若有人能够有好的算法的话,还请不吝赐教。
代码见下:
#define _CRT_SECURE_NO_WARNINGS 1

#ifndef __GAME_H__
#define __GAME_H__

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

#define ROW 9
#define COL 9

#define ROWS (ROW+2)
#define COLS (COL+2)

#define EASY 10
#define HARD 80

void Init_Array(char Array[ROWS][COLS], int row, int col, char set); //初始化数组
void Display(char Array[ROWS][COLS], int row, int col);  //打印数组
void Set_Mine(char Array[ROWS][COLS], int MINE);  //布雷
void Sweep_Mine(char Array[ROWS][COLS], char show[ROWS][COLS], int row, int col, int MINE);  //扫雷
void Move_mine(char Array[ROWS][COLS], int x, int y);  //移雷
void Get_Mine_Count(char Array[ROWS][COLS], char show[ROWS][COLS], int x, int y);  //区域展开

#endif //__GAME_H__ 


void game()  //游戏函数
{
	int input = 0;
	int MINE = 0;
	char mine[ROWS][COLS]; 
	char show[ROWS][COLS];
	Init_Array(mine, ROWS, COLS, '0');
	Init_Array(show, ROWS, COLS, '*');
	printf("***********  1.EASY    2.HARD  ***********\n");
	printf("\n请输入选择的难度:< ");
	scanf("%d", &input);

	switch (input)
	{
	case 1:
		MINE = EASY;
		break;
	case 2:
		MINE = HARD;
		break;
	default:printf("您的输入有误!\n");
	}

	printf("\n这个棋盘有%d处雷,小心咯!!!\n\n", MINE);
	Set_Mine(mine, MINE);
	Display(show, ROW, COL);
	Sweep_Mine(mine, show, ROW, COL, MINE);
}

void menu()
{
	printf("******************************************\n");
	printf("***********    欢迎来到扫雷    ***********\n");
	printf("***********  1.PLAY    0.EXIT  ***********\n");
	printf("******************************************\n");
}

void test()
{
	int input;

	do
	{
		srand((unsigned int)rand(NULL));
		menu();
		printf("\n请选择:< ");
		scanf("%d", &input);
		printf("\n");
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("您已退出游戏,谢谢!\n");
			break;
		default:
			printf("输入不合法,请重新输入!\n");
			break;
		}
	} while (input);
}

int main()
{
	test();
	system("pause");
	return 0;
}


void Init_Array(char Array[ROWS][COLS], int row, int col, char set)
{
	memset(Array, set, (row*col*sizeof(Array[0][0])));  //初始化数组内容为0与*
}

void Display(char Array[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;
	printf("      ");

	for (i = 1; i <= row; i++)
		printf(" %d  ", i);
	printf("\n      -----------------------------------\n");

	for (i = 1; i <= col; i++)   //因涉及周围展开,故数组从1开始打印
	{
		printf("   %d |", i);
		for (j = 1; j <= col; j++)
		{
			printf(" %c |", Array[i][j]);
		}
		printf("\n     |---|---|---|---|---|---|---|---|---|\n");
	}
	printf("\n");
}

void Set_Mine(char Array[ROWS][COLS], int MINE)  //布雷
{
	int count = MINE;
	int x = 0;
	int y = 0;

	while (count)
	{
		x = rand() % ROW + 1;
		y = rand() % COL + 1;

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

//若输入的坐标无雷,则要遍历周围,统计雷数
//若周围无雷,则递归遍历,统计周围雷数
void Get_Mine_Count(char Array[ROWS][COLS], char show[ROWS][COLS], int x, int y) 
{                                                                                 
		if ((Array[x][y] == '0'))
		{
			int count = 0;

			if (Array[x - 1][y - 1] == '1')
				count++;

			if (Array[x - 1][y] == '1')
				count++;

			if (Array[x - 1][y + 1] == '1')
				count++;

			if (Array[x][y - 1] == '1')
				count++;

			if (Array[x][y + 1] == '1')
				count++;
			if (Array[x + 1][y - 1] == '1')
				count++;

			if (Array[x + 1][y] == '1')
				count++;

			if (Array[x + 1][y + 1] == '1')
				count++;

			show[x][y] = (count + '0');
		}

		if (show[x][y] == '0')
		{
			if (show[x - 1][y - 1] == '*')
				Get_Mine_Count(Array, show, x - 1, y - 1);

			if (show[x - 1][y] == '*')
				Get_Mine_Count(Array, show, x - 1, y);

			if (show[x - 1][y + 1] == '*')
				Get_Mine_Count(Array, show, x - 1, y + 1);

			if (show[x][y - 1] == '*')
				Get_Mine_Count(Array, show, x, y - 1);

			if (show[x][y + 1] == '*')
				Get_Mine_Count(Array, show, x, y + 1);

			if (show[x + 1][y - 1] == '*')
				Get_Mine_Count(Array, show, x + 1, y - 1);

			if (show[x + 1][y] == '*')
				Get_Mine_Count(Array, show, x + 1, y);

			if (show[x + 1][y + 1] == '*')
				Get_Mine_Count(Array, show, x + 1, y + 1);
		}
}

//为提高游戏体验,设置玩家第一次无论如何都不会被炸死
void Move_mine(char Array[ROWS][COLS], int x, int y)   
{
	int ret = 1;
	do
	{
		Array[x][y] = '0';
		while (ret)
		{
			x = rand() % ROW + 1;
			y = rand() % COL + 1;
			if (Array[x][y] == '0')
			{
				Array[x][y] = '1';
			}
			ret--;
		}
	} while (ret);
}

//玩家对以确定的雷的位置,可以进行标记
//void Mark_Mine(char show[ROWS][COLS])   
//{
//	int x = 0;
//	int y = 0;
//	printf("请输入您要标记的位置(不标记请输入0,0):<");
//	scanf("%d%d", &x, &y);
//	printf("\n");
//	if (x == 0 && y == 0)
//		return 0;
//	else
//		show[x][y] = '$';
//}


void Sweep_Mine(char Array[ROWS][COLS], char show[ROWS][COLS], int row, int col, int MINE)
{
	int x = 0;
	int y = 0;
	int count = 0;
	int temp = 0;
	int win = 0;

	while (win<(row*col - MINE))
	{
		printf("请输入您要扫雷的坐标:<");
		scanf("%d%d", &x, &y);
		temp++;

		if (((x >= 1) && (x <= row)) && (y >= 1) && (y <= col))
		{
			while ((Array[x][y] == '1') && (temp == 1))
			{
				Move_mine(Array, x, y);    //保证玩家第一次不会被炸死,移走雷
				Get_Mine_Count(Array, show, x, y);  //对周围的雷数进行遍历
			}

			if (Array[x][y] == '1')
			{
				printf("\n哈哈,你被炸死啦!\n\n");
				Display(Array, ROW, COL);
				break;
			}
			else
			{
				Get_Mine_Count(Array, show, x, y);
				printf("\n\n");
				win++;
			}
			Display(show, ROW, COL);
			//Mark_Mine(show);
		}
		else
		{
			printf("坐标输入有误,请重新输入!\n");
		}
	}

	if (win == (row*col - MINE))
		printf("恭喜你,排完了所有的雷!\n");
}
运行结果如下:                                                                                                                          



0
0
查看评论

C语言实现经典游戏——扫雷!

C语言实现经典游戏——扫雷
  • gebushuaidanhenhuai
  • gebushuaidanhenhuai
  • 2016-10-13 18:00
  • 807

简易小游戏扫雷——C语言编程实现

#define _CRT_SECURE_NO_WARNINGS 1 #include #include #include #include #define ROWS 10 #define COLS 10 #define MINE 30 void menu() { printf("**...
  • JenaeLi
  • JenaeLi
  • 2016-10-28 15:52
  • 835

扫雷游戏 C语言实现

扫雷游戏 C语言实现实现了如下功能: 鼠标控制 左键点开 右键标记 中键自动翻开(效果同windows扫雷) 首次点击不会中雷下面是几张效果图: 这是初始界面,3种难度级别,难度同经典版windows扫雷 Beginner 不同颜色的数字和标记功能 赢了! 游戏结束,可以点击Re...
  • c_duoduo
  • c_duoduo
  • 2015-02-20 20:06
  • 6368

【C语言】简易扫雷游戏——C语言实现

好玩的简易扫雷游戏——C语言实现
  • LX18792732127
  • LX18792732127
  • 2016-10-12 09:23
  • 12525

扫雷游戏的C语言实现

在学习C语言初期,我们可以找一些平常玩的游戏进行简单的C语言实现。今天就和大家分享一下关于windows中扫雷游戏的实现。
  • Monster_Girl
  • Monster_Girl
  • 2016-10-09 18:51
  • 3238

C语言编写扫雷

扫雷: 定义两个二维数组:mine用来布雷、show用来显示扫雷情况、mine初始化为’0’、show初始化为’*’; 开始扫雷输入坐标、如果有雷、提示你踩雷了,本轮游戏结束,如果没雷继续扫直到扫完所有没有雷的地方,没扫一次会提示其周围有几个雷。因为统计四周,边缘位置不好实现,所以把二维数组的行...
  • xiaobingRSQ
  • xiaobingRSQ
  • 2016-11-17 23:43
  • 3933

扫雷游戏(C语言实现)

扫雷游戏 自己动手写了扫雷游戏(C语言版)。 我使用了EasyX这个库(下载地址:http://www.easyx.cn EasyX 2014冬至版)。 在写扫雷游戏过程中用到了 1.二维数组的划分与创建 划分:int **p,i; p=(int **)malloc(sizeof(int...
  • qq_27602093
  • qq_27602093
  • 2015-07-28 08:50
  • 1721

C语言实现扫雷——详解

扫雷大家应该都玩过,这是一个十分经典的游戏,今天我将给大家讲解如何用C语言多文件编程实现扫雷,我的这个扫雷有如下几个功能: 显示该点周围雷的个数 第一次下子,不炸死 坐标周围没雷,可以实现展开 游戏结束后展示玩家用时 话不多说,先附上效果图:我们只要输入坐标就可以扫雷了,是不是很有趣?其实要想实现这...
  • yc1515707718
  • yc1515707718
  • 2017-12-07 23:08
  • 541

CCF NOI1054 扫雷游戏

问题链接:CCF NOI1054 扫雷游戏。 时间限制: 1000 ms  空间限制: 262144 KB 题目描述    扫雷游戏是一款十分经典的单机小游戏。它的精髓在于,通过已翻开格子所提示的周围格地雷数,来判断未翻开格子里是否是地雷。   现...
  • tigerisland45
  • tigerisland45
  • 2017-04-26 04:11
  • 1130

C语言:简单的无界面化操作扫雷游戏

扫雷是生活中接触比较多的一块小游戏,那么我们该如何通过C语言来实现呢? 姐先来的代码能够实现基本的扫雷功能,只是缺少了界面化,鼠标操作等,日后有待改善,不过基本功能还是可以实现的,比如:第一步绝对不会踩到地雷的哦! 接下来是代码展示: 直接下颚在一个文件里,虽然功能可以实现,却并不是一个好习惯。可以...
  • sinat_36101354
  • sinat_36101354
  • 2016-12-10 12:00
  • 957
    个人资料
    • 访问:5063次
    • 积分:351
    • 等级:
    • 排名:千里之外
    • 原创:32篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条