C语言程序设计实践-扫雷小游戏

C语言 专栏收录该内容
1 篇文章 0 订阅

C语言程序设计实践-扫雷小游戏

大连海事大学 信息科学技术学院 电子信息工程专业四班 C语言程序实训-扫雷小游戏
在这里插入图片描述

实验代码

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include <windows.h>
#define xx 51
#define yy 51

int a[xx][yy];
char show[xx][yy];
Int boom[xx][yy];
int hang,lie;
double begin, finish;
int oo;

void menu(void);
void set(int boom[xx][yy]);
void display(char show[xx][yy]);
int sweep(int boom[xx][yy], char show[xx][yy]);
int num(int boom[xx][yy], char show[xx][yy], int x, int y);
void nandu();

主函数如下
int main()
{
int m, n;
kaishi:
	for (m = 0; m<xx; m++)
	{
		for (n = 0; n<yy; n++)
{
			show[m][n] = '\0';
			boom[m][n] = 0;
			a[m][n] = 0;//为数组进行初始化
		}
	}

menu();
	int f;
	scanf("%d", &f);
	if (f == 1)
{
		system("cls");
		nandu();
	for (m = 0, n = 0; n<lie; n++)//设置边界标识 
		a[m][n] = 1;
	for (m = (hang-1), n = 0; n<lie; n++)//设置边界标识 
		a[m][n] = 1;
	for (m = 0, n = 0; m<hang; m++)//设置边界标识 
		a[m][n] = 1;
	for (m = 0, n = (lie-1); m<hang; m++)//设置边界标识 
		a[m][n] = 1;

		system("cls");
		set(boom);
		display(show);
		sweep(boom, show);
		printf("按任意键返回主菜单\n");
		scanf("%d", &m);
		system("cls");
		goto kaishi;
}
	return 0;
}
 

void menu()
{
	printf("\n");
	printf("                  \n");
	printf("      主菜单      \n");
	printf("\n");
	printf("    1.进入游戏     \n");
	printf("    2.退出游戏     \n");
	printf("\n");

	printf("(输入对应序号进入)\n");
	printf("copyright by team 6\n");
	printf("\n");
	printf("\n");
	printf("\n");
}

选择难度
void nandu()//难度调节  
{tou:
	color(7);
	printf("1.简单模式\n");
	color(9);
	printf("2.普通模式\n");
	color(4);
	printf("3.困难模式\n");
	color(5);
	printf("4.噩梦模式\n");
	color(7);
	printf("5.自定义(行列小于50)\n");
	int mm;
	scanf("%d", &mm);
	switch (mm)
	{
	case 1:oo = 10; hang = 11; lie = 11; break;
	case 2:oo = 40; hang = 18; lie = 18; break;
	case 3:oo = 99; hang = 23; lie = 23; break;
	case 4:oo = 120; hang = 23; lie = 23; break;
	case 5:	printf("行 列 雷\n");
		    scanf("%d %d %d",&hang,&lie,&oo);
			hang=hang+2;
			lie=lie+2;
			break;
	default:{printf("错误,请重新选择");
	
		goto tou;
	system("cls");
	}
	}

}

void set(int boom[xx][yy]) 
{
	int count = oo;
	int x = 0;
	int y = 0;
	srand((unsigned)time(NULL));
	while (count)
	{
		x = rand() % (hang-3) + 1;
		y = rand() % (lie-3) + 1;
		if (boom[x][y] == 0)
		{
			boom[x][y] = 1;
			count--;
		}
	}
}

void display(char show[xx][yy])
{
	int i = 0;
	int j = 0;
	printf("  ");
	for (i = 1; i<hang - 1; i++)
	{
		printf(" %2d ", i);
	}
	printf("\n");
	for (i = 1; i < hang - 1; i++)
	{

		printf("  ");
		for (j = 1; j<lie - 1; j++)
		{
			printf("|---");
		}
		printf("|\n");
		printf("%2d", i);
		for (j = 1; j < lie - 1; j++)
		{
			printf("| %c ", show[i][j]);
		}
		printf("|\n");
	}
	printf("  ");
	for (j = 1; j < lie - 1; j++)
	{
		printf("|---", show[i][j]);
	}
	printf("|\n");
}

int sweep(int boom[xx][yy], char show[xx][yy])
{
	int num(int boom[xx][yy], char show[xx][yy], int x, int y);
	int x, y, count = 0, l, k, win = 0;

	begin = clock();
	while (1)
	{

	start:
	win = 0;
		for (l = 1; l<hang - 1; l++)
		{
			for (k = 1; k<lie - 1; k++)
			if (show[l][k] >= 48 && show[l][k]<57)//胜利条件检测 
				win++;

		}
		if (win == ((hang - 2)*(lie - 2) - oo))//胜利条件判断 
			break;
	
		printf("请输入坐标,输入坐标的相反数可以标记为雷区\n");
		scanf("%d %d", &x, &y);
		if (x>(hang-2) || y>(lie-2)||x<-(hang-2)||y<-(lie-2)||!((x>0&&y>0)||(x<0&&y<0)))
		{
		
				system("cls");
				display(show);
			printf("输入错误,请重新输入\n");
			goto start;
		}

		if (x<0)
		{
			if (show[-x][-y] == '\0')
				show[-x][-y] = '!';
				else  
			if(show[-x][-y] == '!')
				show[-x][-y] = '\0';
			else {goto start;
			}
			system("cls");
			display(show);

			continue;
		}

		if (count == 0)//防止第一次踩雷
		{
			if (boom[x][y] == 1)//count在这里是计步作用 记录操作次数
			{
				boom[x][y] = 0;
				l = rand() % (hang-3)+ 1;
				k = rand() % (lie-3) + 1;
				if (boom[l][k] == 0)
				{
					boom[l][k] = 1;

				}

			}
		}


		if (boom[x][y] == 1){
			for (l = 1; l<hang - 1; l++){
				for (k = 1; k<lie - 1; k++)
				if (boom[l][k] == 1)
					show[l][k] = '*';//失败时雷区显示
			}
			system("cls");
			display(show);
			finish = clock();
			printf("你踩到地雷了!\n");
			printf("游戏结束,用时%d秒\n", (int)(finish - begin) / 1000);
			return 0;//游戏失败
		}
		else
		{
			num(boom, show, x, y);
			system("cls");
			display(show);
			count++;

		}

	}
	finish = clock();
	printf("你赢了!!\n");
	printf("游戏结束,用时%d秒\n", (int)(finish - begin) / 1000);
	printf("输入任意数字返回主菜单\n");
	return 0;

}

int num(int boom[xx][yy], char show[xx][yy], int x, int y)//查看一点周围雷的个数 

{
	int nnn = 0, p, q;
	if (a[x][y] == 0)
	{

		if (boom[x - 1][y - 1] == 1)
			nnn++;
		if (boom[x - 1][y] == 1)
			nnn++;
		if (boom[x - 1][y + 1] == 1)
			nnn++;
		if (boom[x][y - 1] == 1)
			nnn++;
		if (boom[x][y + 1] == 1)
			nnn++;
		if (boom[x + 1][y - 1] == 1)
			nnn++;
		if (boom[x + 1][y] == 1)
			nnn++;
		if (boom[x + 1][y + 1] == 1)
			nnn++;
		show[x][y] = nnn + '0';
		if (nnn == 0){//连锁反应递归 
			a[x][y] = 1;




			for (p = x - 1; p<x + 2; p++)
			{
				for (q = y - 1; q<y + 2; q++)
					num(boom, show, p, q);

			}

		}
	}

	else return 0;


运行结果

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实验心得

在这里插入图片描述

                                               COPYRIGHT BY LIDONGLIN
相关推荐
共分为8篇,包括基础篇、数值计算与数据结构篇、文本屏幕与文件操作篇、病毒与安全篇、图形篇、系统篇、游戏篇、综合篇,基本涵盖了目前C语言编程的各个方面。   全部以实例为线索展开讲解,注重对实例的分析、对方法的详细讲解以及对知识点的归纳总结。书中通过实例来讲解知识点,同时又通过相应的知识点来分析实例,二者相辅相成。   通过阅读本书,初学者不会再为编写程序时无从下手而苦恼,具有一定C语言基础的读者也不会再原地踏步,停滞不前。因此,本书不仅可以帮助初学者快速入门,也可帮助中级读者在C语言程序设计的殿堂中迈进。 第1部分 基础篇 实例1 一个价值“三天”的BUG 2 实例2 灵活使用递增(递减)操作符 5 实例3 算术运算符计算器 7 实例4 逻辑运算符计算器 9 实例5 IP地址解析 11 实例6 用if…else语句解决奖金发放问题 13 实例7 用for循环模拟自由落体 16 实例8 用while语句求n! 19 实例9 模拟银行常用打印程序 22 实例10 使用一维数组统计选票 26 实例11 使用二维数组统计学生成绩 29 实例12 简单的计算器 32 实例13 时钟程序 35 实例14 华氏温度和摄氏温度的相互转换 38 实例15 SimpleDebug函数应用 40 第2部分 数值计算与数据结构篇 实例16 常用的几种排序方法 46 实例17 广度优先搜索及深度优先搜索 53 实例18 实现基本的串操作 59 实例19 计算各点到源点的最短距离 62 实例20 储油问题 65 实例21 中奖彩球问题 67 实例22 0-1背包问题 69 实例23 阶梯计数问题 72 实例24 二叉树算法集 74 实例25 模拟LRU页面置换算法 79 实例26 大整数阶乘新思路 82 实例27 银行事件驱动模拟程序 84 实例28 模拟迷宫探路 87 实例29 实现高随机度随机序列 89 实例30 停车场管理系统 91 第3部分 文本屏幕与文件操作篇 实例31 菜单实现 96 实例32 窗口制作 97 实例33 模拟屏幕保护程序 100 实例34 文件读写基本操作 102 实例35 格式化读写文件 105 实例36 成块读写操作 107 实例37 随机读写文件 108 实例38 文件的加密和解密 111 实例39 实现两个文件的连接 113 实例40 实现两个文件信息的合并 116 实例41 文件信息统计 118 实例42 文件分割实例 121 实例43 同时显示两个文件的内容 123 实例44 模拟Linux环境下的vi编辑器 124 实例45 文件操作综合应用——银行账户管理 128 第4部分 病毒与安全篇 实例46 实用内存清理程序 134 实例47 如何检测Sniffer  136 实例48 加密DOS批处理程序 139 实例49 使用栈实现密码设置 141 实例50 远程缓冲区溢出漏洞利用程序 144 实例51 简易漏洞扫描器 146 实例52 文件病毒检测程序 149 实例53 监测内存泄露与溢出 150 实例54 实现traceroute命令 152 实例55 实现ping程序功能 154 实例56 获取Linux本机IP地址 157 实例57 实现扩展内存的访问 161 实例58 随机加密程序 164 实例59 MD5加密程序 165 实例60 RSA加密实例 168 第5部分 图形篇 实例61 制作表格 172 实例62 用画线函数作出的图案 174 实例63 多样的椭圆 176 实例64 多变的立方体 177 实例65 简易时钟 178 实例66 跳动的小球 181 实例67 用柱状图表示学生成绩各分数段比率 183 实例68 EGA/VGA屏幕存储 187 实例69 按钮制作 190 实例70 三维视图制作 193 实例71 红旗图案制作 194 实例72 火焰动画制作 196 实例73 模拟水纹扩散 199 实例74 彩色的Photo Frame  201 实例75 火箭发射演示 203 第6部分 系统篇 实例76 恢复内存文本 208 实例77 挽救磁盘数据 210 实例78 建立和隐藏多个PRI DOS分区 213 实例79 简单的DOS下的中断服务程序 216 实例80 文件名分析程序 219 实例81 鼠标中断处理 222 实例82 实现磁盘数据的整体加密 224 实例83 揭开CMOS密码 227 实例84 获取网卡信息 229 实例85 创建自己的设备 231 实例86 设置应用程序启动密码 233 实例87 获取系统配置信息 236 实例88 硬件检测 239 实例89 管道通信 241 实例90 程序自杀技术实现 244 第7部分 游戏篇 实例91 连续击键游戏 248 实例92
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值