您现在的位置是:首页 >技术交流 >扫雷【C语言】网站首页技术交流

扫雷【C语言】

小宁n 2024-06-17 10:14:48
简介扫雷【C语言】

用C语言实现一个9X9的扫雷

test.c   测试部分

game.c  游戏实现部分

game.h   游戏声明部分

菜单部分

 游戏部分

游戏部分包括创建一个扫雷的区域,在其中埋雷,玩家进行扫雷,判断扫雷是否成功

这里我i们定义行列,便于以后将其修改为其他格式的扫雷

创建扫雷区域

因为我们扫雷如果扫到的不是类雷会返回该点周围雷的个数,如果扫到的区域位于扫雷区域的边界,我们返回容易出出现越界访问,所以这里我们定义一个比扫雷区域大一圈的是最优的,比如这里我们需要实现的是9X9的区域,那么我们定义一个11X11的区域是最佳的,这里我们也定义行列,便于日后修改

 扫雷我们将雷所在位置设为1,不是雷设置为0,但是我们还需要展现给玩家每步所扫出来的结果,所以这里我们需要定义两个二位数组,一个存储雷的位置,另一个展现给玩家看

 打印区域

我们需要将区域展现给玩家看,让玩家进行游戏

 埋雷

RAY是雷的个数,这里定义便于以后修改

 排雷

这里我们需要加一个循环条件,当排雷次数达到总共可以排的次数减去雷的个数,即退出循环,否则继续排雷,添加一个变量win,当win==ROW*COL-RAY,即退出循环

求周围雷综合和的函数getray

 

一个排查点的周围雷的个数如图,此排查点雷的个数为2,根据他们的坐标我们可以写出函数,得到雷的个数

 

得到雷的个数后我们需要将show数组中这一位改成这个值,我们可知

' 1 ' =1+ ' 0 '

所以可以写出count+’ 0 ‘

 

完整代码

game.h

#pragma once
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define RAY 10
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void init(char arr[ROWS][COLS], char ch);
void initboard(char mine[ROWS][COLS], char show[ROWS][COLS], int rows, int cols);
void printboard(char arr[ROWS][COLS], int rows, int cols);
void burry(char arr[ROWS][COLS], int rows, int cols);
void playboard(char mine[ROWS][COLS], char show[ROWS][COLS], int rows, int cols);
int  getray(char mine[ROWS][COLS], int x, int y);

test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void menu();
void game();
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);
	return 0;
}

void menu()
{
	printf("****************
");
	printf("***  1.play  ***
");
	printf("***  0.exit  ***
");
	printf("****************
");
}

void game()
{
	char mine[ROWS][COLS] = { 0 };
	char show[ROWS][COLS] = { 0 };
	//初始化区域
	initboard(mine, show, ROWS, COLS);
	//打印区域
	printboard(show, ROWS, COLS);
	//埋雷
	burry(mine, ROWS, COLS);
	//排雷
	playboard(mine,show, ROWS, COLS);
}

game.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void init(char arr[ROWS][COLS], char ch)
{
	int i = 0, j = 0;
	for (i = 0; i < ROWS; i++)
	{
		for (j = 0; j < COLS; j++)
		{
			arr[i][j] = ch;
		}
	}
}

void initboard(char mine[ROWS][COLS], char show[ROWS][COLS], int rows, int cols)
{
	init(mine, '0');
	init(show, '*');
}

void printboard(char arr[ROWS][COLS], int rows, int cols)
{ 
	printf("******扫雷*******
");
	int i = 0, j = 0;
	for (i = 0; i <= cols - 2; i++)
	{
		printf("%d ", i);
	}
	printf("
");
	for (i = 1; i <= rows-2; i++)
	{
		printf("%d ", i);
		for (j = 1; j <= cols-2; j++)
		{
			printf("%c ", arr[i][j]);
		}
		printf("
");
	}
}

void burry(char arr[ROWS][COLS], int rows, int cols)
{
	int count = RAY;
	while (count)
	{
		int x = rand() % ROW + 1;
		int y = rand() % COL + 1;
		if (arr[x][y] == '0')
		{
			arr[x][y] = '1';
			count--;
		}
	}
}

void playboard(char mine[ROWS][COLS], char show[ROWS][COLS], int rows, int cols)
{
	int x = 0, y = 0;
	int win = 0;
	while (win<ROW*COL-RAY)
	{
		printf("请输入要排查的坐标>");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= rows - 2 && y >= 1 && y <= cols - 2)
		{
			if (mine[x][y] == '1')
			{
				printf("很遗憾,你被炸死了
");
				printboard(mine, ROWS, COLS); 
				break;
			}
			else
			{
				int count1 = getray(mine,x,y);
				show[x][y] = count1 + '0';
				printboard(show, ROWS, COLS);
				win++;
			}
		}
		else
		{
			printf("坐标有误,请重新输入
");
		}
	}
	if (win == ROW * COL - RAY)
	{
		printf("恭喜你,排雷成功
");
		printboard(mine, ROWS, COLS);
	}
}

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

升级优化版(展开)

 代码

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void init(char arr[ROWS][COLS], char ch)
{
	int i = 0, j = 0;
	for (i = 0; i < ROWS; i++)
	{
		for (j = 0; j < COLS; j++)
		{
			arr[i][j] = ch;
		}
	}
}

void initboard(char mine[ROWS][COLS], char show[ROWS][COLS], int rows, int cols)
{
	init(mine, '0');
	init(show, '*');
}

void printboard(char arr[ROWS][COLS], int rows, int cols)
{ 
	printf("********扫雷*********
");
	int i = 0, j = 0;
	for (i = 0; i <= cols - 2; i++)
	{
		printf(" %d |", i);
	}
	printf("
----------------------------------------");
	printf("
");
	for (i = 1; i <= rows-2; i++)
	{
		printf(" %d |", i);
		for (j = 1; j <= cols-2; j++)
		{
			printf(" %c |", arr[i][j]);
		}
		printf("
");
		for (j = 0; j <= cols - 2; j++)
		{
			printf("----");
		}
		printf("
");
	}
}

void burry(char arr[ROWS][COLS], int rows, int cols)
{
	int count = RAY;
	while (count)
	{
		int x = rand() % ROW + 1;
		int y = rand() % COL + 1;
		if (arr[x][y] == '0')
		{
			arr[x][y] = '1';
			count--;
		}
	}
}

void playboard(char mine[ROWS][COLS], char show[ROWS][COLS], int rows, int cols)
{
	int x = 0, y = 0;
	int win = 0;
	while (win<ROW*COL-RAY)
	{
		printf("请输入要排查的坐标>");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= rows - 2 && y >= 1 && y <= cols - 2)
		{
			if (mine[x][y] == '1')
			{
				printf("很遗憾,你被炸死了
");
				printboard(mine, ROWS, COLS); 
				break;
			}
			else
			{
				open(mine, show, x, y);
				printboard(show, ROWS, COLS);
				win++;
			}
		}
		else
		{
			printf("坐标有误,请重新输入
");
		}
	}
	if (win == ROW * COL - RAY)
	{
		printf("恭喜你,排雷成功
");
		printboard(mine, ROWS, COLS);
	}
}

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

void open(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)
{
	if (x >= 1 && x <= ROWS - 2 && y >= 1 && y <= COLS - 2)
	{
		int count = getray(mine, x, y);
		if (count == 0)
		{
			show[x][y] = ' ';
			int i = 0, j = 0;
			for (i = x - 1; i <= x + 1; i++)
			{
				for (j = y - 1; j <= y + 1; j++)
				{
					if (show[i][j] == '*' && (i != x || j != y))
					{
						open(mine, show, i, j);
					}
				}

			}
		}
		else
		{
			show[x][y] = count + '0';
		}
	}
}
#pragma once
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define RAY 10
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void init(char arr[ROWS][COLS], char ch);
void initboard(char mine[ROWS][COLS], char show[ROWS][COLS], int rows, int cols);
void printboard(char arr[ROWS][COLS], int rows, int cols);
void burry(char arr[ROWS][COLS], int rows, int cols);
void playboard(char mine[ROWS][COLS], char show[ROWS][COLS], int rows, int cols);
int  getray(char mine[ROWS][COLS], int x, int y);
void open(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y);
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void menu();
void game();
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);
	return 0;
}

void menu()
{
	printf("****************
");
	printf("***  1.play  ***
");
	printf("***  0.exit  ***
");
	printf("****************
");
}

void game()
{
	char mine[ROWS][COLS] = { 0 };
	char show[ROWS][COLS] = { 0 };
	//初始化区域
	initboard(mine, show, ROWS, COLS);
	//打印区域
	printboard(show, ROWS, COLS);
	//埋雷
	burry(mine, ROWS, COLS);
	//排雷
	playboard(mine,show, ROWS, COLS);
}

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。