C语言扫雷(初级篇)附源码以及可执行文件

本文详细描述了一个基于C语言实现的9x9扫雷游戏,涉及初始化棋盘、随机埋雷、展示棋盘以及检测玩家坐标周围雷的数量。作者探讨了随机生成雷位的方法,包括使用time(NULL)进行伪随机数生成,并提及了如何通过坐标计算探测周围雷的情况。
摘要由CSDN通过智能技术生成

声明:本文章为本人学习感悟等,如有谬误,请指正,不胜感激。

0 作为非雷,1作为雷

棋盘9*9  (实际上你需要11*11的,因为位于边框的格子进行附近位置的雷扫描时需要)

玩家看到的 9*9 的棋盘,未选中的地方是 * 字符

需要:俩棋盘,一个存储0 和 1 ;一个给玩家看(展示是否踩雷,以及没踩雷时该位置周围八格有多少雷

使用:char类型的2维数组(方便数字和符号共存,即’0’和’*’)

需要写的函数:

1.初始化俩二维数组;mine初始化先全为’0’,show初始化全为’*’

2.随机埋下雷,雷的个数自己决定

3.打印棋盘

4.玩家输入坐标,如果没踩到雷,显示该坐标周围八格里面有几颗雷

初步思考时不明白的地方:

  1. 如何随机生成位置
  2. 除了暴力探测周围八格的方法外,是否有更好的方法进行探测

学习得知:

  1. (1)用rand和srand进行伪随机

最简单的方法就是利用系统时间了(几乎所有的人都这么做),因为时间的数值随时间变化而变化,运行两次,一般不会出现前一次和后一次相同的局面,time(NULL)会返回一个表示当前系统时间的整数(它在time.h中

  1. 可能有人知道C语言中的随机函数random,可是random函数并不是ANSI C标准,所以说,random函数不能在gcc,vc等编译器下编译通过。我们可以自己编一个在·

  1. 还是暴力好  
  1. 通过坐标的加减,探测选中坐标周围八格是否有雷
  2. 把坐标周围格子里的数字加起来,得到几就是几个雷

Tips:可以用循环,也可以单纯暴力的加上周围的八个数字

game.h

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

#define ROW 9   //要改扫雷游戏大小,只需要改ROW COL就可以了 (方便更改)
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define MINENUM 20

void initialization(char show[ROWS][COLS]);
void plantingbombs(char mine[ROWS][COLS]);
void showmap(char show[ROWS][COLS]);
int detectbombs(char mine[ROWS][COLS], int x, int y);


game.cpp

#define _CRT_SECURE_NO_WARNINGS 1

#include"game.h"

void menu()
{
	printf("---------------\n");
	printf("---开始游戏----\n");
	printf("---游玩请按1---\n");
	printf("---退出请按2---\n");
	printf("---------------\n");
}

void initialization(char show[ROWS][COLS],char mine[ROWS][COLS])   //初始化show数组
{
	for (int i = 0; i < ROWS; i++)
	{
		for (int j = 0; j < COLS; j++)
		{
			show[i][j] = '*';
		}
	}

	for (int i = 0; i < ROWS; i++)
	{
		for (int j = 0; j < COLS; j++)
		{
			mine[i][j] = '0';
		}
	}
}

void plantingbombs(char mine[ROWS][COLS]) //放置炸弹
{
	srand((unsigned int)time(0));
	int count = MINENUM;

	while (count)
	{
		int i = rand() % 10;
		int j = rand() % 10;
		if (i>=1&&i<=ROW&&j>=1&&j<=COL)
		if (mine[i][j] == '0')  //防止在同一位置布置雷  
		{
			mine[i][j] = '1';
		}
		else
			mine[i][j] = '0';
		count--;
	}
}

void showmap(char show[ROWS][COLS])  //显示局面
{
	printf("-----MINESWEEPER-----\n");
	for (int o = 0; o < ROWS-1; o++)
	{ 
		printf("%d ", o);
	}
	printf("\n");
	for (int i = 1; i <= ROW; i++)
	{
		printf("%d ", i);
		for (int j = 1; j <= COL; j++)
		{
			printf("%c ", show[i][j]);
		}
		printf("\n");
	}
}

int detectbombs(char mine[ROWS][COLS], int x, int y)  //检测玩家选中位置周围八格炸弹数
{
	int counter = 0;
	for (int i = x - 1; i <= x + 1; i++)
	{
		for (int j = y - 1; j <= y + 1; j++)
		{
			counter +=( mine[i][j] - '0');    //'1'-'0'=1   字符1减去字符0 得到数字1
		}
	}
	return counter;
}

void game()
{
	//用char 数组的原因: 方便存储‘0’和‘*’
	char mine[ROWS][COLS] = { 0 };   //实际上存储雷区与非雷区的二维数组
	char show[ROWS][COLS] = { 0 };   //给玩家看的二维数组
	int countee = MINENUM;
	
	initialization(show,mine);
	plantingbombs(mine);
	//showmap(mine);   测试用
	showmap(show);

	while (countee)
	{
		int x = 0;
		int y = 0;
		int won = (ROW*COL) - MINENUM;
		printf("请输入坐标:\n");
		scanf("%d%d", &x, &y);
		if (mine[x][y] == '1')
		{
			printf("game over ,you lost\n");
			break;
		}
		if (mine[x][y] != '1')
		{
			int a = detectbombs(mine, x, y);
			show[x][y] = (a+'0');
			showmap(show);
			won--;
		}
		if (won == 0)
		{
			printf("congratulations!\n");
			break;
		}
	}

}

start.cpp

#define _CRT_SECURE_NO_WARNINGS 1


#include"game.h"

void menu();
void game();
void initialization(char show[ROWS][COLS]);
void plantingbombs(char mine[ROWS][COLS]);
void showmap(char show[ROWS][COLS]);
int detectbombs(char mine[ROWS][COLS], int x, int y);

int main()
{
	menu();
	int input = 0;
	scanf("%d", &input);
	switch (input)
	{
	case 1:
			game();
			break;

	case 2:
				break;
	}
	system("pause");
	return 0;
}

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值