扫雷游戏的制作(简易版)

一.大致思路

1、我们得有一个9*9的棋盘;

2、我们在棋盘上布置10颗雷;

3、搜索周围的雷,并且排查雷;

4、判断输赢;

二.编写程序

1.头文件与宏定义

#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include<stdbool.h>
#define MINE_COUNT 10//地雷数量
#define ROW 9
#define COL 9//棋盘大小
#define ROWS ROW+2
#define COLS COL+2
int setp = ROW * COL - MINE_COUNT;
int flag = 1;
#pragma warning (disable:6031)

2.菜单制作

void Menu()
{
	printf("******************\n");
	printf("******1.Play******\n");
	printf("******0.Exit******\n");
	printf("******************\n");
}

制作一个简易的菜单,告诉玩家应该怎么使用

3.主函数的编写


int main()
{
	srand((unsigned int)time(NULL));//产生真正的随机数
	int input = 1;
	while (input != 0)
	{
		Menu();
		printf("请输入选项:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			system("cls");
			game();
			break;
		case 0:
			system("pause");
			system("cls");
			printf("已成功退出游戏!");
			break;
		default:
			system("pause");
			system("cls");
			printf("输入有误,请重新输入!");
			break;
		}
	}
	return 0;
}

4.子函数的声明

void Hide_board(char a[][COLS], int x, int y, char set);//初始化棋盘
void Show_board(char a[][COLS], int x, int y);//打印棋盘
void Set_mine(char mine[][COLS], int x, int y, int count);//布置雷
void Find_mine(char show[][COLS], char mine[][COLS], int x, int y);//排查雷
int get_mine(char show[][COLS], char mine[][COLS], int x, int y);//得到雷的数量
bool is_mine(char mine[][COLS], int m, int n);//判断下m,n是否为雷
bool is_find(char show[][COLS], int m, int n);//判断是否被排查过
void surprise(char mine[][COLS], char show[][COLS], int x, int y, int m, int n);//展开一片

 5.初始化棋盘与打印棋盘

void Hide_board(char a[][COLS], int x, int y, char set)
{
	for (int i = 1; i <= x; i++)
	{
		for (int j = 1; j <= y; j++)
		{
			a[i][j] = set;
		}
	}
}
void Show_board(char a[][COLS], int x, int y)
{
	for (int i = 0; i <= x; i++)
	{
		if (i < 10)
			printf("%d ", i);
		else
		{
			printf("%c", 'A' + i - 10);
		}
	}
	putchar('\n');
	for (int j = 0; j <= x; j++)
	{
		printf("--");
	}
	putchar('\n');
	for (int i = 1; i <= y; i++)
	{
		if (i < 10)
			printf("%d|", i);
		else
		{
			printf("%c|", 'A' + i - 10);
		}
		for (int j = 1; j <= x; j++)
		{
			printf("%c ", a[i][j]);
		}
		putchar('\n');
	}
}

 6.布置雷

void Set_mine(char mine[][COLS], int x, int y, int count)
{
	int m = 0;
	int n = 0;

	while (count)
	{
		m = rand() % x + 1;
		n = rand() % y + 1;
		if (mine[m][n] == ' ')
		{
			mine[m][n] = '*';
			count--;
		}
	}
}

7.排查雷

void Find_mine(char show[][COLS], char mine[ROWS][COLS], int x, int y)
{
	int m = 0;
	int n = 0;
	char ch = 0;
	int win = 0;
	while (scanf("%d %d %c", &m, &n, &ch) != EOF)//无空格报错
	{
		if (m >= 1 && m <= x && n >= 1 && n <= y)
		{
			if (!is_find(show, m, n))
			{
				if (show[m][n] == '!' && 'Y' == ch)
				{
					show[m][n] = '@';
					printf("取消标记成功!\n");
					system("cls");
					Show_board(show, x, y);
					break;
				}
				if ('Y' == ch)
				{
					show[m][n] = '!';
					printf("标记成功!\n");
					system("pause");
					system("cls");
					Show_board(show, x, y);
					break;
				}
				else
				{
					if (is_mine(mine, m, n))
					{
						printf("你被雷炸死了\n\a\a\a");
						show[m][n] = '*';
						flag = 0;
						system("pause");
						system("cls");
						Show_board(show, x, y);
						break;
					}
					else
					{
						surprise(mine, show, x, y, m, n);
						system("pause");
						system("cls");
						Show_board(show, x, y);
						break;
					}
				}
			}
			else
			{
				printf("坐标已经排查过,请重新输入:\n");
			}
		}
		else
		{
			printf("坐标非法,请重新输入!\n");
		}
	}
}

8.得到雷的数量

 


int get_mine(char show[][COLS], char mine[][COLS], int m, int n)
{
	int count = 0;
	if (mine[m - 1][n - 1] == '*')
		count++;
	if (mine[m - 1][n] == '*')
		count++;
	if (mine[m - 1][n + 1] == '*')
		count++;
	if (mine[m][n - 1] == '*')
		count++;
	if (mine[m][n + 1] == '*')
		count++;
	if (mine[m + 1][n - 1] == '*')
		count++;
	if (mine[m + 1][n] == '*')
		count++;
	if (mine[m + 1][n + 1] == '*')
		count++;
	return count;
}

9. 判断下m,n是否为雷以及判断是否被排查过


bool is_mine(char mine[][COLS], int m, int n)
{
	if (mine[m][n] == ' ')
		return false;
	return true;
}

bool is_find(char show[][COLS], int m, int n)
{
	if (show[m][n] == '@' || show[m][n] == '!')
		return false;
	return true;
}

10.展开一片的实现

void surprise(char mine[][COLS], char show[][COLS], int x, int y, int m, int n)
{
	if (!(m >= 1 && m <= x && n >= 1 && n <= y))
		return;
	if (is_mine(mine, m, n) || is_find(show, m, n))
		return;
	setp--;
	int count = get_mine(show, mine, m, n);
	show[m][n] = count + '0';
	if (count == 0)
	{
		surprise(mine, show, x, y, m - 1, n - 1);
		surprise(mine, show, x, y, m - 1, n);
		surprise(mine, show, x, y, m - 1, n + 1);
		surprise(mine, show, x, y, m, n - 1);
		surprise(mine, show, x, y, m, n + 1);
		surprise(mine, show, x, y, m + 1, n - 1);
		surprise(mine, show, x, y, m + 1, n);
		surprise(mine, show, x, y, m + 1, n + 1);
	}
}

 11.Play玩法的实现

void game()
{
	char mine[ROWS][COLS] = { 0 };
	char show[ROWS][COLS] = { 0 };
	Hide_board(mine, ROW, COL, ' ');//初始化
	Hide_board(show, ROW, COL, '@');//初始化
	Set_mine(mine, ROW, COL, MINE_COUNT);//布置雷
	//display_board(mine, ROW, COL);//开透视
	Show_board(show, ROW, COL);//展示棋盘(给玩家看);
	setp = ROW * COL - MINE_COUNT;
	flag = 1;//重置一下,开始新的游戏
	while (setp && flag)
	{
		printf("请输入你要排查的位置:\n");
		Find_mine(show, mine, ROW, COL);
	}
	if (!setp)
	{
		system("cls");
		printf("挑战成功\a\a\a\a\n");
	}
	else if (!flag)
	{
		system("cls");
		printf("挑战失败\a\a\a\n");
	}
	Show_board(show, ROW, COL);//展示棋盘(给玩家看);
	for (int j = 0; j <= COL; j++)
	{
		printf("--");
	}
	putchar('\n');
	Show_board(mine, ROW, COL);
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值