c语言扫雷

实时更新时间

文件存档

记录游戏时间来排名

#include "game.h"


//数据的操作







void CheckCapacity(Num* pc)
{
	if (pc->size == pc->capacity)
	{
		Rank* tmp = (Rank*)realloc(pc->data, (pc->capacity * 2) * sizeof(Rank));

		if (tmp != NULL)
		{
			pc->data = tmp;
		}
		else
		{
			perror("CheckCapacity::realloc");
			exit(-1);
		}
		pc->capacity *= 2;
		printf("增容成功\n");
	}

}

void AddRank(Num* pc, double time)
{
	assert(pc);
	CheckCapacity(pc);
	char name[20];
	printf("请输入名字\n");
	scanf("%s", pc->data[pc->size].name);
	pc->data[pc->size].time = time;
	pc->size++;
	printf("上榜成功\n");

}


//读文件的数据
void LoadRank(Num* pc)
{
	//打开文件
	FILE* pf = fopen("rank.dat", "rb");
	if (pf == NULL)
	{
		perror("LoadRank::fopen");
		return 1;
	}
	//读文件
	Rank tmp = { 0 };
	while (fread(&tmp, sizeof(Rank), 1, pf))
	{
		CheckCapacity(pc);
		pc->data[pc->size] = tmp;
		pc->size++;
	}
	//关闭文件
	fclose(pf);
	pf = NULL;
}

//文件初始化
void InitRank(Num* pc)
{
	assert(pc);
	pc->capacity = 3;
	pc->size = 0;
	pc->data = (Rank*)malloc(pc->capacity * sizeof(Rank));
	if (pc->data == NULL)
	{
		perror("InitRank;;malloc");
		return;
	}
	memset(pc->data, 0, sizeof(Rank) * pc->capacity);
	//加载信息
	LoadRank(pc);
}
//保存数据到文件
void SaveRank(const Num* pc)
{
	FILE* pf = fopen("rank.dat", "wb");
	if (pf == NULL)
	{
		perror("SaveRank::open");
		return 1;
	}
	int i = 0;
	for (i = 0; i < pc->size; i++)
	{
		fwrite(pc->data + i, sizeof(Rank), 1, pf);
	}
	//关闭文件
	fclose(pf);
	pf = NULL;
}
//销毁文件,释放内存;
void RankDestory(Num* pc)
{
	assert(pc);
	free(pc->data);
	pc->data = NULL;
	pc->capacity = 0;
	pc->size = 0;
	printf("销毁成功\n");
}

//排序
void SortRank(Num* pc)
{
	int i = 0;
	int j = 0;
	Rank tmp;
	for (i = 0; i < pc->size - 1; i++)
	{
		for (j = 0; j < pc->size - 1 - i; j++)
		{
			if (pc->data[j].time > pc->data[j + 1].time)
			{
				tmp = pc->data[j];
				pc->data[j] = pc->data[j + 1];
				pc->data[j + 1] = tmp;
			}
		}
	}
}

void FinRank(const Num* pc)
{

	printf("是否需要查找您的成绩\n");
	printf("1. 查找\n");
	printf("0. 不需要\n");
	int wheather = 0;
	int i = 0;
	int k = 0;   //判断是否找到
	char name[20];
	scanf("%d", &wheather);
	if (wheather == 1)
	{
		printf("请输入你的名字\n");
		scanf("%s", name);
		for (i = 0; i < pc->size; i++)
		{
			if (0 == strcmp(name, pc->data[i].name))
			{
				printf("%s的最好排名是:\n", name);
				printf("  排名--名字----时间\n");
				printf("%5d\t%-5s\t%-20lf\n", i + 1, pc->data[i].name, pc->data[i].time);
				k = 1;
				break;
			}
		}
		if (k == 0)
		{
			printf("%s暂时没有排名\n", name);
		}
	}
	printf("退出查找\n");
}

void PrintfRank(const Num* pc)//打印
{
	system("cls");
	assert(pc);
	SortRank(pc);
	int i = 0;
	//判断是否为空
	if (pc->size == 0)
	{
		printf("暂无排名\n");
		return;
	}
	printf("  排名--名字----时间\n");
	for (i = 0; i < pc->size; i++)
	{
		printf("%5d\t%-10s\t%-10.2lf秒\n", i + 1, pc->data[i].name, pc->data[i].time);
	}
	//查找我的排名
	FinRank(pc);
}




//游戏



void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{
	for (int i = 0; i < rows; i++)
	{
		for (int j = 0; j < cols; j++)
		{
			board[i][j] = set;
		}
	}
}

void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
	printf("-------------------------\n");
	printf("  ");
	for (int i = 1; i <= col; i++)
	{
		printf("%d ", i);
	}
	printf("\n");
	for (int i = 1; i <= row; i++)
	{
		printf("%d ", i);
		for (int j = 1; j <= col; j++)
		{
			printf("%c ", board[i][j]);
		}
		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--;
		}
	}
}

int GetMineCount(char mine[ROWS][COLS], int x, int y)
{
	int ret = 0;
	for (int i = x - 1; i <= x + 1; i++)
	{
		for (int j = y - 1; j <= y + 1; j++)
		{
			if (mine[i][j] == '1')
			{
				ret++;
			}
		}
	}
	return ret;
}

void OpenOwn(char show[ROWS][COLS], char mine[ROWS][COLS],
	int row, int col, int x, int y, int state[][COLS])
{
	if (state[x][y] == 0)
	{
		state[x][y] = 1;
		int count = GetMineCount(mine, x, y);
		show[x][y] = '0' + count;
	}
}
//展开
void OpenNeighbor(char show[ROWS][COLS], char mine[ROWS][COLS],
	int row, int col, int x, int y, int state[][COLS])
{
	if (state[x][y] == 0)
	{
		state[x][y] = 1;
		int count1 = GetMineCount(mine, x, y);
		show[x][y] = '0' + count1;
		for (int i = x - 1; i <= x + 1; i++)
		{
			for (int j = y - 1; j <= y + 1; j++)
			{
				if (i >= 1 && i <= ROW && j >= 1 && j <= COL)
				{
					if (state[i][j] == 0)
					{
						int count = GetMineCount(mine, i, j);
						if (count != 0)
							OpenOwn(show, mine, row, col, i, j, state);
						else
							OpenNeighbor(show, mine, row, col, i, j, state);
					}
				}
			}
		}
	}
	else
	{
		return;
	}
}


void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col, Num* pc)
{
	int x, y;
	double start, end, cost;
	int wheather;
	start = clock();
	int win = 0;
	int state[ROWS][COLS] = { 0 };
	//一共有COL*ROW个格子,当我们排了COL*ROW-EASY_COUNT个格子的时候,扫雷就成功了
	while (win < COL * ROW - EASY_COUNT)
	{
		//char whethermark[10] = { 0 };
		int whethermark = 0;
		//DisplayBoard(mine, ROW, COL);			///test
		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);
				if (count != 0)
				{
					win += 1;
					OpenOwn(show, mine, ROW, COL, x, y, state);
					system("cls");
					DisplayBoard(show, ROW, COL);
					//Sleep(2000);
				}
				else
				{
					OpenNeighbor(show, mine, row, col, x, y, state);
					int nums = 0;
					for (int i = 1; i <= ROW; i++)
					{
						for (int j = 1; j <= COL; j++)
						{
							if (state[i][j] == 1)
							{
								nums++;
							}
						}
					}
					win = nums;
					system("cls");
					DisplayBoard(show, ROW, COL);
					//Sleep(2000);
				}
				while (1)
				{
					end = clock();
					printf("已用时 %2.lf秒\n", (end - start) / 1000);
					printf("是否要标记雷?\n");
					printf("1.标记 \n");
					printf("任意建继续\n");
					scanf("%d", &whethermark);
					if (whethermark == 1)
					{
						Mark(show, ROW, COL);
					}
					else
					{
						break;
					}
				}
			}
		}
		else
		{
			printf("输入错误请重新输入\n");
		}
	}
	if (win == COL * ROW - EASY_COUNT )// 当雷是八十个时出现bug
	{
		system("cls");
		end = clock();								//记录时间
		printf("恭喜你扫雷成功!\n");
		DisplayBoard(mine, ROW, COL);
		printf("您一共用时  %2.lf秒\n", (end - start) / 1000); 
		//记录排名
		printf("是否记录成绩到排名\n");
		printf("1. 金榜高悬姓子真,分明折得一枝春\n");
		printf("2. 事了拂衣去,深藏功与名\n");
		scanf("%d", &wheather);
		if (wheather == 1)
		{
			system("cls");
			printf("开始添加\n");
			AddRank(pc, (end - start) / 1000.0);
			PrintfRank(pc);
		}
		
		printf("再来一把?\n");
	}
}



void Mark(char show[ROWS][COLS], int row, int col)
{
	int x, y;
again:
	printf("请输入要标记为雷的坐标->");
	scanf("%d %d", &x, &y);
	if (x >= 1 && x <= row && y >= 1 && y <= col)
	{
		system("cls");
		printf("标记成功\n");
		show[x][y] = '#';
		DisplayBoard(show, ROW, COL);
		return;
	}
	else
	{
		printf("输入错误 请重新输入\n");
		goto again;
	}
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自动控制节水灌溉技术的高低代表着农业现代化的发展状况,灌溉系统自动化水平较低是制约我国高效农业发展的主要原因。本文就此问题研究了单片机控制的滴灌节水灌溉系统,该系统可对不同土壤的湿度进行监控,并按照作物对土壤湿度的要求进行适时、适量灌水,其核心是单片机和PC机构成的控制部分,主要对土壤湿度与灌水量之间的关系、灌溉控制技术及设备系统的硬件、软件编程各个部分进行了深入的研究。 单片机控制部分采用上下位机的形式。下位机硬件部分选用AT89C51单片机为核心,主要由土壤湿度传感器,信号处理电路,显示电路,输出控制电路,故障报警电路等组成,软件选用汇编语言编程。上位机选用586型以上PC机,通过MAX232芯片实现同下位机的电平转换功能,上下位机之间通过串行通信方式进行数据的双向传输,软件选用VB高级编程语言以建立友好的人机界面。系统主要具有以下功能:可在PC机提供的人机对话界面上设置作物要求的土壤湿度相关参数;单片机可将土壤湿度传感器检测到的土壤湿度模拟量转换成数字量,显示于LED显示器上,同时单片机可采用串行通信方式将此湿度值传输到PC机上;PC机通过其内设程序计算出所需的灌水量和灌水时间,且显示于界面上,并将有关的灌水信息反馈给单片机,若需灌水,则单片机系统启动鸣音报警,发出灌水信号,并经放大驱动设备,开启电磁阀进行倒计时定时灌水,若不需灌水,即PC机上显示的灌水量和灌水时间均为0,系统不进行灌水。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值