C语言扫雷详细代码(可标记,可展开)

以下代码是我最近学得的扫雷代码,如有改进地方请及时指正,感谢!

game.h

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

#define ROW 9
#define COL 9
#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 DisplayBoard(char Board[ROWS][COLS], int row, int col);
void SetMine(char Board[ROWS][COLS], int row, int col);
void FindMine(char Mine[ROWS][COLS], char Show[ROWS][COLS],int row, int col);

​

​

game.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"

void InitBoard(char Board[ROWS][COLS], int rows, int cols, char set) {
	int i = 0;
	for (i = 0;i < rows;i++) {
		int j = 0;
		for (j = 0;j < cols;j++) {
			Board[i][j] = set;
		} 
	} 
}
void DisplayBoard(char Board[ROWS][COLS], int row, int col) {
	int i = 0;
	printf("-----无敌扫雷-----\n");
	for (i = 0;i <= row;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;//1~9之间的数
		int y = rand() % col + 1;
			if (Board[x][y] == '0') {
				Board[x][y] = '1';
				count--;
			}
	}
}

int Getminecount(char Mine[ROWS][COLS],int a,int b){
	return Mine[a][b + 1] + Mine[a - 1][b + 1] + Mine[a - 1][b] + Mine[a - 1][b - 1] + Mine[a][b - 1] + Mine[a + 1][b - 1] + Mine[a + 1][b] + Mine[a + 1][b + 1]
		- 8 * '0';
}
void sign(char Show[ROWS][COLS],int row, int col) {
	int a = 0;int b = 0;
	printf("请输入要标记雷的坐标:");
	scanf("%d%d", &a, &b);
	Show[a][b] = '!';
	if (a==0||b==0) {
		return 0;
	}
}
void broaden(char Show[ROWS][COLS], char Mine[ROWS][COLS],int x,int y) {
	if (x<1||x>ROW||y<1||y>COL) {
		return;
	}
	if (Show[x][y] != '*') {
		return;
	}
	int count = Getminecount(Mine,x,y);
	if (count > 0) {
		Show[x][y] = count + '0';

	}
	if (count == 0) {
		Show[x][y] = ' ';
		broaden(Show, Mine, x - 1, y);
		broaden(Show, Mine, x - 1, y + 1);
		broaden(Show, Mine, x, y + 1);
		broaden(Show, Mine, x + 1, y + 1);
		broaden(Show, Mine, x + 1, y);
		broaden(Show, Mine, x + 1, y - 1);
		broaden(Show, Mine, x, y - 1);
		broaden(Show, Mine, x - 1, y - 1);

	}
}
void FindMine(char Mine[ROWS][COLS], char Show[ROWS][COLS], int row, int col) {
	int a = 0;int b = 0;int win = 0;int x = 0;int y = 0;
	do {
		sign(Show, x, y);//标记雷
		printf("请输入要查找的坐标:");
		scanf("%d %d", &a, &b);
		if (a <= row && a>0 && b <= col && b>0) {
			if (Mine[a][b] == '1') {
				system("cls");//清屏
				printf("你被炸死了\n");
				DisplayBoard(Mine, ROW, COL);
				break;
			}
			else {
				int count = Getminecount(Mine, a, b);//一个坐标周围雷数
				//Show[a][b] = count + '0';
				broaden(Show,Mine,a,b);//如果是0往外拓展,展开一片
				system("cls");//清屏
				DisplayBoard(Show, ROW, COL);
				win++;
			}
		}
		else {
			printf("坐标错误,请重输\n");
		}
		if (win == row * col - EASY_COUNT) {
			printf("恭喜你,猜对了\n");
			DisplayBoard(Show, ROW, COL);
		}
	}
	while (win < col * row - EASY_COUNT);

}

test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void menu() {
	printf("**********************\n");
	printf("******1. play*********\n");
	printf("******0. exit*********\n");
	printf("**********************\n");

}
void game() {
	char Mine[ROWS][COLS];
	char Show[ROWS][COLS];
	InitBoard(Mine, ROWS, COLS,'0');//棋盘初始化
	InitBoard(Show, ROWS, COLS, '*');
	DisplayBoard(Show, ROW, COL);//显示9*9棋盘
	SetMine(Mine, ROW, COL);//布置雷
	//DisplayBoard(Mine, ROW, COL);
	FindMine(Mine,Show, ROW, COL);//扫雷
	
}
int main() {
	int input = 0;
	srand((unsigned int) time(NULL));
	do {
		menu();
		printf("请选择>");
		scanf("%d", &input);
		switch(input) {
			case 1:
				game();
				break;
			case 0:
				printf("退出游戏\n");
				break;
			default:
				printf("输入错误,请重新输入\n");
				break;
		}
	} while (input);
	return 0;
}

        

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值