[C/C++]C语言实现扫雷小游戏

win10系统取消了经典的扫雷游戏,闲来无事,用C语言写了一个简单扫雷小游戏。希望大家多多指正。

设计目标:通过C语言实现扫雷小游戏,能够判断胜负以及简单的人机交互。

成果如图:

代码:

game.h

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

#define ROW 11				//展示时比实际数组小2,也就是一圈
#define COL 11

#define ROWS ROW + 2		//数组的实际大小
#define COLS COL + 2

#define Difficulty  10		//雷的数量

void InitBoard(char board[ROWS][COLS], int rows, int cols, char object);			//初始化数组

void PrintBoard(char board[ROWS][COLS], int rows, int cols);						//打印棋盘

void Setmine(char board[ROWS][COLS], int row, int col);		//布雷

void clear(char show[ROWS][COLS], char mine[ROWS][COLS], int rows, int 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 object) 				//初始化数组
{
	int i = 0;
	int j = 0;
	
	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < cols; j++)
		{
			board[i][j] = object;							
		}
	}
}

void PrintBoard(char board[ROWS][COLS], int row, int col)								//打印棋盘,只打印中间11行11列,外面一圈只用计算
{
	int i = 1;
	int j = 1;

	printf("------------扫雷游戏----------------\n");
	for (i = 1; i <= col; i++)
	{
		printf("%d  ", i);
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		for (j = 1; j <= col; j++)
		{
			printf("%c  ", board[i][j]);
		}
		printf("\n");
	}
	printf("------------扫雷游戏----------------\n");

}

void Setmine(char board[ROWS][COLS], int row, int col)		//布雷
{
	int x, y, i;

	for (i = 1; i < Difficulty; i++)
	{
		x = rand() % row + 1;	//产生0到row的row+1个随机,所以需要加1 
		y = rand() % col + 1;
		if (board[x][y] == '0')
		{
			board[x][y] = '1';
		}

	}

}

int win(char show[ROWS][COLS], char mine[ROWS][COLS], int row, int col)		//检查是否胜利,无未开拓元素即为胜利。
{
	int i = 1;
	int j = 1;

	for (i = 1; i < row; i++)
	{
		for (j = 1; j < col; j++)
		{
			if (show[i][j] == '*' && mine[i][j] != '1')
			{
				return 0;
			}
		}
	}

	return 1;
}
  
/*附近的雷数*/
int GetMineCont(char mine[ROWS][COLS],int x,int y)		// int+'0' 就是int转char 
{
	return mine[x - 1][y - 1] + mine[x][y - 1] + mine[x + 1][y - 1] +
		mine[x - 1][y + 1] + mine[x][y + 1] + mine[x + 1][y + 1] +
		mine[x - 1][y] + mine[x + 1][y] - 8 * '0';									//8个char型相加减去8个‘0’,就是char转int
}

void clear(char show[ROWS][COLS], char mine[ROWS][COLS], 
					int rows, int cols, int row, int col)	//扫雷
{
	int x,y,count,a,key;
	key = 0;
	while (1)
	{
		printf("请输入坐标(用空格隔开):\n");
		scanf("%d%d", &x, &y);
		if (x > 0 && x < row + 1 && y>0 && y < col + 1)
		{

			if (mine[x][y] == '1')		//是否踩雷
			{
				count = 1;
				break;
			}
			else
			{
				key++;
				if (key == row * col - Difficulty)	//判断是否已经排出来row * col - Difficulty个安全格
				{
					count == 0;
					break;
				}
				a = GetMineCont(mine, x, y);		//附近的雷数
				show[x][y] = a + '0';				//附近的雷数

				PrintBoard(show, ROW, COL);
			}


		}
		else
		{
			printf("非法坐标重新输入\n");
		}

	}
	if (count == 1)
	{
		printf("**************踩雷喽************\n");
		PrintBoard(mine, ROW, COL);
	}
	else if(count == 0)
	{
		printf("**************赢了呦************\n");
		PrintBoard(mine, ROW, COL);
	}
}

test.c

#define _CRT_SECURE_NO_WARNINGS 1

#include"game.h"

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

void game()
{
	char mine[ROWS][COLS];			//存放有无雷的信息
	char show[ROWS][COLS];			//用于与用户交互

	InitBoard(mine, ROWS, COLS, '0');	//用0初始化雷
	InitBoard(show, ROWS, COLS, '*');	//用*初始化

	PrintBoard(show, ROW, COL);		//打印棋盘

	Setmine(mine, ROW, COL);		//在mine中放布雷信息,布雷区域为除外圈,所以只传输ROW

	clear(show, mine, ROWS, COLS, ROW, COL);

}

int main()
{
	int input = 0;
	srand((unsigned)time(NULL));

	do 
	{
		menu();
		printf("请选择----->");
		scanf("%d", &input);
		switch (input)
		{
			case 1:
				game();
				break;
			case 0:
				break;
			default:
				printf("无效输入,请重新输入\n");
				break;
		}
	} while (input);
	return 0;
}

谢谢大家看到这里!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值