c语言扫雷

一,程序

先设置头文件,各个功能接口

mine.h 文件

#pragma once

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

#define MineNumber 10

#define ROW 10
#define COL 10

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

//初始化棋盘
void InitBoard(char board[ROWS][COLS],char set);
//打印棋盘
void PrintBoard(char board[ROWS][COLS]);
//布置雷
void SetMineBoard(char mine[ROWS][COLS]);
//排查雷
void SeekMine(char mine[ROWS][COLS], char show[ROWS][COLS]);
//排查0雷及周围
void SeekMine1(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
//标记雷
void FindMine(char show[ROWS][COLS]);
//判断获胜
int Win(char mine[ROWS][COLS], char show[ROWS][COLS]);

再设置各个接口功能,mine.c 文件

#define _CRT_SECURE_NO_WARNINGS

#include"mine.h"

//初始化棋盘
void InitBoard(char board[ROWS][COLS],char set)
{
	for (int row = 0; row < ROWS; row++)
	{
		for (int col = 0; col < COLS; col++)
		{
			board[row][col] = set;
		}
	}
}

//打印棋盘
void PrintBoard(char board[ROWS][COLS])
{
	printf("\n");
	for (int r = 0; r < ROWS-1; r++)
	{
		for (int c = 0; c < COLS-1; c++)
		{
			if (0 == r && 0 == c)
			{
				printf("%-2d ", r);
			}
			else if (0 == r)
			{
				printf("%d ",c);
			}
			else
			{
				if (0==c)
				{
					printf("%-2d ", r);
				}
				else
					printf("%c ", board[r][c]);
			}	
		}
		printf("\n");
	}
	printf("\n");
}

//布置雷
void SetMineBoard(char mine[ROWS][COLS])
{
	int count=0;
	while (MineNumber != count)
	{
		int r = rand() % ROW + 1, c = rand() % COL + 1;
		if ('0'==mine[r][c])
		{
			mine[r][c] = '1';
			count++;
		}
	}
}

//判断周围雷数
char Judge(char mine[ROWS][COLS], int row, int col)
{
	char count ='0';
	for (int i = -1; i < 2; i++)
	{
		for (int j = -1; j < 2; j++)
		{
			if (i != 0 || j != 0)
			{
				count += mine[row + i][col + j] - '0';
			}
		}
	}
	return count;
}
//排查周围
void SeekMine2(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	for (int i = -1; i < 2; i++)
	{
		for (int j = -1; j < 2; j++)
		{
			if (i != 0 || j != 0)
			{
				SeekMine1(mine, show, row + i, col + j);
			}
		}
	}
}
//排查0雷及周围
void SeekMine1(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	if ('1' == mine[row][col] && '+' != show[row][col])
	{
		show[row][col] = '#';
		printf("\n你被炸死了\n");
		PrintBoard(mine);
	}
	else if ('*' == show[row][col] && row>0 && col>0 && row<ROW + 1 && col<COL + 1)
	{
		show[row][col] = Judge(mine, row, col);
		if ('0' == show[row][col])
		{
			SeekMine2(mine, show, row, col);
		}
	}
}

//排查雷
void SeekMine(char mine[ROWS][COLS], char show[ROWS][COLS])
{
	int row=0, col=0;
	while (true)
	{
		printf("\n请输入要排查的坐标:>");
		scanf("%d%d",&row,&col);
		if (0 == row && 0 == col)
			FindMine(show);
		else if (row<1 || col<1 || row>ROW || col>COL )
		{
			printf("输入超界\n");
		}
		else
		{
			if ('*'!= show[row][col])
			{
				int count = show[row][col] - '0';
				for (int i = -1; i < 2; i++)
				{
					for (int j = -1; j < 2; j++)
					{
						if (i != 0 || j != 0)
						{
							if ('+' == show[row + i][col+j])
							{
								count--;
							}
						}
					}
				}
				if (0 == count)
				{
					SeekMine2(mine, show, row, col);
					break;
				}
				else
				{
					printf("运用失败\n");
				}
			}
			if ('1'==mine[row][col])
			{
				show[row][col] = '#';
				printf("\n你被炸死了\n");
				PrintBoard(mine);
				break;
			}
			else
			{
				SeekMine1(mine, show, row, col);
				break;
			}	
		}
	}
}

//标记雷
void FindMine(char show[ROWS][COLS])
{
	int row = 0, col = 0;
	while (true)
	{
		printf("\n请输入要标记雷的坐标:>");
		scanf("%d%d", &row, &col);
		if (0 == row, 0 == col)
		{
			PrintBoard(show);
			break;
		}
		if ('*' != show[row][col] || row<1 || col<1 || row>ROW || col>COL)
		{
			printf("无法标记\n");
		}
		else
		{
			show[row][col] = '+';
		}
	}
}
//判断获胜
int Win(char mine[ROWS][COLS], char show[ROWS][COLS])
{
	int count1 = 0, count2 = 0, count3 = 0;
	for (int r = 1; r < ROWS - 1; r++)
	{
		for (int c = 1; c < COLS - 1; c++)
		{
			if ('#' == show[r][c])
				return 0;
			if ('*' == show[r][c] || '+' == show[r][c])
				count1++;
			if ('+' == show[r][c])
				count2++;
			if ('+' == show[r][c] && '1' == mine[r][c])
				count3++;
		}
	}
	if (10 == count1)
	{
		printf("你赢了\n");
		return 0;
	}
	if (10 == count2 && 10 == count3)
	{
		printf("你赢了\n");
		return 0;
	}
	return 1;
}

最后设置菜单

main.c 文件

#define _CRT_SECURE_NO_WARNINGS

#include"mine.h"

void menu()
{
	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,'0');//'0'
	InitBoard(show,'*');//'*'

	//打印一下棋盘
	PrintBoard(show);

	//布置雷
	SetMineBoard(mine);
	int win = 1;
	while (win)
	{
		//排查雷
		SeekMine(mine, show);
		PrintBoard(show);
		win = Win(mine, show);
	}
	
}

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

二,实验

我们来玩玩吧

 

运气不错,一下出来不少,输入0 0,进入标记模式,将确认的雷打上标记,

再输入0 0,退出标记模式

 输入7 3坐标,因为7 3周围的雷都被我们标记出来了,周围未知区域可以一次性显示出来。

如果标错了,这个显示会让你直接踩到雷哦。

最后简单完成扫雷

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值