C语言实现扫雷游戏

目录

一、编写思路🍋🍋

1、整体框架🔹🔹

2、初始化函数🔹🔹

3、打印函数🔹🔹

4、设置雷函数 🔹🔹

5、统计雷函数🔹🔹

6、扫雷函数🔹🔹

二、整体代码 🍋🍋

1、game.h🔹🔹

2、game.c🔹🔹

3、test.c🔹🔹


一、编写思路🍋🍋

1、整体框架🔹🔹

对于扫雷游戏,需要实现两个功能:扫雷和退出游戏,这里需要首先需要利用do—while循环和switch语句来实现,先实现程序的整体框架,再逐步地实现具体的功能。

int main()
{
	int option=0;
	do
	{
		menu();
		printf("请输入:");
		scanf("%d",&option);
		switch (option)
		{
		case 1:
			printf("扫雷游戏\n");
			break;
		case 0:
			printf("退出成功!\n");
			break;
		default:
			printf("你的输入有误,请重新输入:");
		}

	} while (option);
	return 0;
}

效果演示: 

2、初始化函数🔹🔹

在扫雷游戏中,我们需要设计两个二维数组,一个用来存放雷(雷的位置用‘1’表示,非雷用‘0’表示),另一个用来进行扫雷,初始全为‘*’,但是由于在对存放雷的数组进行扫雷时,容易越界,我们就将存放雷的数组的行数和列数各加2来解决。初始化函数利用两层for循环。

void init(char arr[ROW][COL], int row, int col, char ch)
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			arr[i][j] = ch;
		}
	}
}

3、打印函数🔹🔹

扫雷过程中,我们同样需要将扫雷的效果展示到屏幕上,利用双层for循环进行打印。

void print(char arr[ROW][COL], int row, int col)
{
	for (int i = 0; i <= COL; i++)
	{
		printf("%d ", i);
	}
	printf("\n");
	for (int i =0; i < row; i++)
	{
		printf("%d ", i + 1);
		for (int j = 0; j < col; j++)
		{
			printf("%c ", arr[i][j]);
		}
		printf("\n");
	}
}

效果演示: 

4、设置雷函数 🔹🔹

 我们需要在存放雷的数组中随机生成n个雷,将对应坐标的元素设为‘1’。

void set_bomb(char arr[ROW][COL], int row, int col)
{
	srand((unsigned)time(NULL));
	int count = BOMB;
	while (count)
	{
		int x = rand() % row+1;
		int y = rand() % col + 1;
		if (arr[x][y] == '0')
		{
			arr[x][y] = '1';
			count--;
		}

	}
}

效果演示:

5、统计雷函数🔹🔹

统计需要由用户指定一个坐标,然后程序在存放雷的数组中统计其周围的8个坐标中元素为‘1’的个数。

void cout_bomb(char arr[ROW][COL], int x, int y)
{
	return (arr[x - 1][y] +
		arr[x - 1][y - 1] +
		arr[x][y - 1] +
		arr[x + 1][y - 1] +
		arr[x + 1][y] +
		arr[x + 1][y + 1] +
		arr[x][y + 1] +
		arr[x - 1][y + 1] - 8 * '0');
}

6、扫雷函数🔹🔹

 扫雷函数利用用户指定的坐标,如果该坐标不是雷,则计算周围雷的个数存放到扫雷数组中,直到排查出所有非雷的坐标为成功,游戏结束,否则“炸死”,游戏结束。

void minesweeper(char mine[ROW][COL], char show[ROW][COL], int row, int col)
{
	int x = 0, y = 0;
	int win = 0;
	while (win < ROW * COL - BOMB)
	{
	printf("请输入要排查雷的坐标:");
		scanf("%d%d", &x, &y);
		if (x< row &&x>=1&& y < col&&y>=1)
		{
			if (show[x][y] == '*')
					{
						if (mine[x][y] == '0')
						{
							show[x][y] = cout_bomb(mine, x, y)+'0';
							win++;
							print(show, ROW, COL);
						}
						else
						{
							printf("您已炸死,游戏结束\n");
							print(mine, row, col);
							break;
						}
					}
					else
					{
						printf("该位置已经排查过\n");
					}
		}
		else
		{
			printf("输入坐标不合法\n");
		}
		
	}
	if (win == ROW * COL - BOMB)
	{
		printf("排雷成功,游戏结束!\n");
	}

}

 效果演示:

二、整体代码 🍋🍋

1、game.h🔹🔹

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 9
#define COL 9
#define ROWS 9+2
#define COLS 9+2
#define BOMB 10
void menu();
void init(char arr[ROW][COL], int row, int col, char ch);
void print(char arr[ROW][COL], int row, int col);
void set_bomb(char arr[ROW][COL], int row, int col);
int cout_bomb(char arr1[ROW][COL], char arr2[ROW][COL], int row, int col);
void minesweeper(char mine[ROW][COL], char show[ROW][COL], int row, int col);

2、game.c🔹🔹

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void menu()
{
	printf("*********************************************\n");
	printf("*******          1.开始扫雷       ***********\n");
	printf("*******          0.退出游戏       ***********\n");
	printf("*********************************************\n");
}
void init(char arr[ROW][COL], int row, int col, char ch)
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			arr[i][j] = ch;
		}
	}
}
void print(char arr[ROW][COL], int row, int col)
{
	for (int i = 0; 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 ", arr[i][j]);
		}
		printf("\n");
	}
}
void set_bomb(char arr[ROW][COL], int row, int col)
{
	srand((unsigned)time(NULL));
	int count = BOMB;
	while (count)
	{
		int x = rand() % row+1;
		int y = rand() % col + 1;
		if (arr[x][y] == '0')
		{
			arr[x][y] = '1';
			count--;
		}

	}
}
int cout_bomb(char arr[ROW][COL], int x, int y)
{
	return (arr[x - 1][y] +
		arr[x - 1][y - 1] +
		arr[x][y - 1] +
		arr[x + 1][y - 1] +
		arr[x + 1][y] +
		arr[x + 1][y + 1] +
		arr[x][y + 1] +
		arr[x - 1][y + 1] - 8 * '0');
}
void minesweeper(char mine[ROW][COL], char show[ROW][COL], int row, int col)
{
	int x = 0, y = 0;
	int win = 0;
	while (win < ROW * COL - BOMB)
	{
	printf("请输入要排查雷的坐标:");
		scanf("%d%d", &x, &y);
		if (x< row &&x>=1&& y < col&&y>=1)
		{
			if (show[x][y] == '*')
					{
						if (mine[x][y] == '0')
						{
							show[x][y] = cout_bomb(mine, x, y)+'0';
							win++;
							print(show, ROW, COL);
						}
						else
						{
							printf("您已炸死,游戏结束\n");
							print(mine, row, col);
							break;
						}
					}
					else
					{
						printf("该位置已经排查过\n");
					}
		}
		else
		{
			printf("输入坐标不合法\n");
		}
		
	}
	if (win == ROW * COL - BOMB)
	{
		printf("排雷成功,游戏结束!\n");
	}

}

3、test.c🔹🔹

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void game()
{
	char mine[ROWS][COLS] = { 0 };
	char show[ROWS][COLS] = { 0 };
	init(mine, ROWS, COLS, '0');
	init(show, ROWS, COLS, '*');
	set_bomb(mine, ROW, COL);
	//print(mine, ROW, COL);
	print(show, ROW, COL);
	minesweeper(mine, show, ROW, COL);
}
int main()
{
	int option=0;
	do
	{
		menu();
		printf("请输入:");
		scanf("%d",&option);
		switch (option)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出成功!\n");
			break;
		default:
			printf("你的输入有误,请重新输入:");
		}

	} while (option);
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

过✪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值