【C语言--趣味游戏系列】--低配版扫雷游戏

前言:

学习很苦,游戏来补,扫雷游戏想必大家都玩过,今天为大家带来一款低配版扫雷游戏

在这里插入图片描述
网页版扫雷游戏:http://www.minesweeper.cn/

一、扫雷游戏规则介绍

扫雷游戏规则很简单,只要排查出所有的雷,即为成功。游戏界面由许多方格组成,而部分方格中存放着地雷。而随着游戏难度的提高,它的方格数量和雷区数量也会随之提升。初级难度一般是9*9的方格,存放10颗雷。
**玩法:**当玩家点击一个方格,他会出现两种结果,要么是被雷炸死,要么他就会出现一个数字,这个数字代表的是他周围雷的个数。如果什么都没有,则周围没有雷。
在这里插入图片描述

eg: 这个数字是2,则它的周围就有2个雷

二、扫雷游戏设计思路

1.文件夹创建

首先咱们要创建3个文件夹:

  • test.c----游戏测试逻辑
  • game.c----游戏中函数的实现
  • game.h----游戏需要的数据类型和函数声明
    在这里插入图片描述

2.功能说明

  • 要在界面上打印“开始游戏”和“退出游戏”;
  • 开始游戏后,就要出现游戏界面,咱们打印的是9*9的棋盘,然后布置10个雷;
  • 排查雷:如果这个位置不是雷,则要出现周围雷的个数;如果是雷,则结束游戏,当10个雷全部排查完,则游戏结束

3.分析设计

扫雷过程中,布置的雷和排查出的雷的信息都需要存储,所以我们需要一定的数据结构来存储这些信息。
(1)我们需要创建两个二维i数组,一个存放布置好的雷(“1”为雷,“0”为非雷),一个存放排查出的雷的信息这样可以避免产生混淆和打印上的困难;
(2)因为我们需要99的棋盘,所以数组要打印成1111的,防止越界

三、扫雷游戏的实现

(1) test.c

#define _CRT_SECURE_NO_WARNINGS

#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];//存放排查出的雷的信息
	//初始化棋盘
	//mine数组最开始全部是‘0’
	//show数组最开始全都是‘*’
	InitBoard(mine, ROWS, COLS, '0');
	InitBoard(show, ROWS, COLS, '*');
	//打印棋盘
	//DisplayBoard(mine,ROW,COL);
	DisplayBoard(show, ROW, COL);
	//布置雷
	SetMine(mine, ROW, COL);
	//DisplayBoard(mine,ROW,COL);
	//排查雷
	FindMine(mine, show, ROW, COL);



}
int main()
{
	int input = 0;
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,请重新选择\n");
		}
	} while (input);
	return 0;
}

(2) 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 cols);

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

//排查雷
void FineMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);;

(3) game.c

#define _CRT_SECURE_NO_WARNINGS
#pragma once
#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 <= col; i++)
	{
		printf("%d ", i);
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);
		int j = 0;
		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)
{
	//布置10个雷
	//生成随机坐标,布置雷
	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][y - 1] + mine[x + 1][y- 1] + mine[x + 1][y] + mine[x + 1][y + 1] + mine[x][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
			{
				//这个坐标是否被排查
				if (show[x][y] == '*')
				{
					//该位置不是雷,就统计这个坐标周围有几个雷
					int count = GetMineCount(mine, x, y);
					show[x][y] = count + '0';
					DisplayBoard(show, ROW, COL);
					win++;
				}
				else
				{
					printf("该坐标被排查过,请重新排查\n");
				}
			}
		}
		else
		{
			printf("非法坐标,重新输入\n");
		}
	}
	if (win == row * col - EASY_COUNT)
	{
		printf("恭喜你,排雷成功\n");
		DisplayBoard(mine, ROW, COL);
	}
}

(4) 执行结果

在这里插入图片描述
总结:

OK啊,今天的扫雷游戏就写到这里了,毕竟是低配版。感觉写得不错的佬们,别忘了留下你们的关注和三连哦!!!大佬们的支持就是博主前进的动力,一起加油呀!!!

评论 228
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值