C语言-扫雷游戏的简单实现

扫雷游戏的简单实现

本篇博客采用了多文件的方式来实现扫雷游戏
geme.h ----------函数的声明及符号的定义
game.c-----------函数的实现
test.c -----------游戏的运行

主体代码如下

game.h

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define EASY_COUNT 10

#define ROW 9
#define COL 9

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

//初始化棋盘
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
#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 (i = 1; i <= row; i++)
	{
		int j = 0;
		printf("%d ", i);
		for (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] == '0')
		{
			board[x][y] = '1';
			count--;
		}
	}
}
int GetMineCount(char mine[ROWS][COLS], int x, int y)
{
	return  mine[x - 1][y] + mine[x - 1][y - 1] + mine[x - 1][y + 1] + 
		    mine[x][y - 1] + mine[x][y + 1] + mine[x + 1][y] + 
		    mine[x + 1][y - 1] + mine[x + 1][y + 1]-8*'0';
}

void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int win = 0;
	while (win<row*col-EASY_COUNT)
	{
		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);
				show[x][y] = count + '0';
				DisplayBoard(show, ROW, COL);
				win++;
			}
		}
		else
		{
			printf("输入坐标非法,请重新输入\n");
		}
	}
	if (win == row * col - EASY_COUNT)
	{
		printf("恭喜你,排雷成功\n");
		DisplayBoard(mine, ROW, COL);
	}
}

test.c

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#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);
	
	//布置雷
	SetMine(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("退出游戏");
			break;
		default:
			printf("选择错误,请重新选择");
			break;
		}
	} while (input);
}

1. 初始化棋盘

game.h

#define ROW 9
#define COL 9

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

void InitBoard(char board[ROWS][COLS], int rows, int cols,char set);

在头文件中定义ROW和COL的值,以便我们可以随时更换棋盘(二维数组)的大小

game.c

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;
		}
	}

将棋盘(二维数组)中的值设置成想要设置的值,来分别表示有雷和无雷(在这里我是以字符 ‘0’ 表示无雷 ‘1’ 表示有雷)

test.c

char mine[ROWS][COLS];
char show[ROWS][COLS];

InitBoard(mine, ROWS, COLS,'0');
InitBoard(show, ROWS, COLS,'*');

分别定义两个二维数组 mine 和 show , mine是用来布置雷的, show是用来展示出来的

2.打印棋盘

game.h

void DisplayBoard(char board[ROWS][COLS], int row, int col);

为了便于游玩时方便查看坐标,同时防止在运行代码时数组越界,我们将二维数组设置成比棋盘大两格。

game.c

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

test.c

DisplayBoard(show, ROW, COL);

3.在棋盘中布置雷

game.h

#define EASY_COUNT 10
#include<stdlib.h>
#include<time.h>
void SetMine(char board[ROWS][COLS], int row, int col);

game.c

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] == '0')
		{
			board[x][y] = '1';
			count--;
		}
	}
}

test.c

SetMine(mine, ROW, COL);

在int main()函数中还要包含:

srand((unsigned int)time(NULL));

通过时间戳,使每次运行game.c中 rand 函数所输入的数字完全随机

4.排查雷

game.h

void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

game.c

int GetMineCount(char mine[ROWS][COLS], int x, int y)
{
	return  mine[x - 1][y] + mine[x - 1][y - 1] + mine[x - 1][y + 1] + 
		    mine[x][y - 1] + mine[x][y + 1] + mine[x + 1][y] + 
		    mine[x + 1][y - 1] + mine[x + 1][y + 1]-8*'0';
}

void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int win = 0;
	while (win<row*col-EASY_COUNT)
	{
		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);
				show[x][y] = count + '0';
				DisplayBoard(show, ROW, COL);
				win++;
			}
		}
		else
		{
			printf("输入坐标非法,请重新输入\n");
		}
	}
	if (win == row * col - EASY_COUNT)
	{
		printf("恭喜你,排雷成功\n");
		DisplayBoard(mine, ROW, COL);
	}
}

因为在代码中布置雷是以字符 ‘0’ 来表示无雷, 字符 ‘1’ 表示雷,所以在计算所排查坐标周围雷的个数时,通过+或-字符 ‘0’ 来实现
在GetMineCount函数中,通过排查坐标周围8个格子中的字符分别减去字符 ‘0’ 后相加,得出周围8个格子中的雷的个数
在FindMine函数中,通过count+字符 ‘0’ 将雷的个数以ASCII码的形式表示出来,存放到show数组中的相应坐标处

相关推荐

  1. C语言-扫雷游戏简单实现

    2024-03-26 00:40:04       41 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-26 00:40:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-26 00:40:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-26 00:40:04       82 阅读
  4. Python语言-面向对象

    2024-03-26 00:40:04       91 阅读

热门阅读

  1. C++ 模板知识大全

    2024-03-26 00:40:04       39 阅读
  2. C++ day2

    C++ day2

    2024-03-26 00:40:04      43 阅读
  3. 设计模式(1):介绍

    2024-03-26 00:40:04       39 阅读
  4. Solana关闭账户返还租金

    2024-03-26 00:40:04       39 阅读
  5. JVM垃圾回收

    2024-03-26 00:40:04       40 阅读
  6. 洛谷 1443.马的遍历

    2024-03-26 00:40:04       40 阅读
  7. js一些底层

    2024-03-26 00:40:04       44 阅读