扫雷小游戏(C语言实现)

举报
bug郭 发表于 2022/07/31 12:53:52 2022/07/31
【摘要】 写在前面我们已经写过了三子棋小游戏肯定没玩过瘾,我们再写个扫雷小游戏吧!@TOC 认识游戏相信大家对扫雷都不陌生!每台电脑必备的小游戏! 游戏规则就是在规定的时间将埋藏的地雷全部找到,即游戏胜利!胜利条件:你需要在不点错雷的情况下尽可能快的将所有的雷都标记出来,如果你点错,就得重新开始,所以扫雷也有一定的运气成分。简单说就是将所有不是雷的地方全部标记出来,剩下地雷,游戏胜利,如果标记点到了...

在这里插入图片描述

写在前面

我们已经写过了三子棋小游戏肯定没玩过瘾,我们再写个扫雷小游戏吧!

@TOC

认识游戏

相信大家对扫雷都不陌生!每台电脑必备的小游戏!
在这里插入图片描述

游戏规则

就是在规定的时间将埋藏的地雷全部找到,即游戏胜利!

胜利条件:你需要在不点错雷的情况下尽可能快的将所有的雷都标记出来,如果你点错,就得重新开始,所以扫雷也有一定的运气成分。

简单说
就是将所有不是雷的地方全部标记出来,剩下地雷,游戏胜利,如果标记点到了地雷,游戏失败!

如何找到不是地雷标记出来呢?
在这里插入图片描述
每点开一个小格子,如果是雷,就游戏结束,如果不是就会出现数字,出现的数字表示,周围一圈雷的个数!
在这里插入图片描述
2表示周围一圈的地雷数为2个。
根据这些数字即可将地雷全部排除走向胜利!

游戏框架

游戏框架和三子棋一样!

//游戏框架
	int input = 0;
	do 
	{
		menu();//菜单
		scanf("%d", &input); //选择
		switch (input)
		{
		case 1:game();
			break;
		case 0:printf("退出游戏\n");
			break;
		default:printf("输入错误,请重新输入\n");
			break;
		}
	} while (input);

我们写小游戏的框架基本上都是这样!

游戏实现

游戏的实现是我们这个游戏的重点内容!
我们如何才能将游戏实现呢?
先从原理入手!

  • 埋雷
    如何买雷呢?
    我们所玩的扫雷都是由许多小格子组成的矩阵!
    所以我们可以利用二维数组埋地雷!

  • 显示该点周围雷的个数
    周围雷数的计算,就是判断改点周围是非为雷,并且计算个数显示给玩家!

  • 判断游戏状态
    点到地雷说明游戏结束,将所有地雷找到,游戏胜利。

实现思想
用一个二维数组埋雷
另一个二维数组显示给玩家
在这里插入图片描述
当我们将雷弄成AxA的雷阵藏雷,会发现如果我们进行周围雷数的查找是会发生数组越界,所以我们可以创建(A+2)x(A+2)的雷阵,然后埋雷在AxA中!

void game()
{
	//初始化布雷数组—— > 初始化棋盘数组—— > 
	//设置地雷—— > 显示棋盘—— > 玩家扫雷
	//埋雷
	char mine[ROWS][COLS] = { 0 }; //雷区图
	char show[ROWS][COLS] = { 0 }; //玩家图
	//初始化棋盘
	InitBoard(mine, ROWS, COLS,'0');
	InitBoard(show, ROWS, COLS, '*');
	//设置地雷
	SetMine(mine, ROW, COL,MineCount);
	PrintBoard(show, ROW, COL);
	//玩家扫雷
	int count = ROW*COL-MineCount;
	while (CheckMine(mine,show, ROW, COL))
	{
		count--;
		PrintBoard(show, ROW, COL);
		if (count == 0)
		{
			printf("恭喜你,游戏胜利\n");
			PrintBoard(mine, ROW, COL);
			break;
		}
	}


}
//初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col, char x)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			board[i][j] = x;
		}
	}
	return ;
}

//打印棋盘
void PrintBoard(char board[ROW][COL], int row, int col)
{
	  int i = 0;
	  //打印列号
	  for (i = 0; i <= col; i++)
		  printf(" %d ", i);
	      printf("\n");
	for (i = 0; i < row; i++)
	{
		printf(" %d ", i+1);
		int j = 0;
		for (j = 0; j <col; j++)
		{
			printf(" %c ", board[i][j]);
		}
		printf("\n");
	}
	return;
}
//埋雷
void SetMine(char board[ROW][COL], int row, int col, int count)
{
	while (count)
	{
		int i = rand() % row;
		int j = rand() % col;
		if (board[i][j] == '0')
		{
			board[i][j] = '1';
			count--;
	    }
	}
}

核心代码

//查雷
int CheckMine(char mine[ROW][COL],char show[ROW][COL], int row, int col)
{
	printf("请输入你要扫雷的坐标:>");
	while (1)
	{
		int i = 0, j = 0;
		scanf("%d%d", &i, &j);
		if (i >=1 && i <= row && j >=1 && j <= col)
		{
			if (mine[i-1][j-1] != '1')
			{
				int  count=IsMineCount(mine,i-1,j-1);
				show[i-1][j-1] = count+'0';
				return 1;
			}
			else
			{
				printf("很遗憾,你被炸死了\n");
				PrintBoard(mine, ROW, COL);
				return 0;
			}
		}
	}
	
}
int  IsMineCount(char mine[ROW][COL], int x, int y)
{
	int count = 0;
	int i= 0;
	for (i = x - 1; i <= x + 1; i++)
	{  
		int j = 0;
		for (j = y - 1; j <=y + 1; j++)
		{
			if (mine[i][j] == '1')
			{
				count++;

			}
		}
	}
	return count;
}

效果展示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

全部代码

test.c文件

#define _CRT_SECURE_NO_WARNINGS 1 
#include"game.h"

void menu()
{
	printf("******************************\n");
	printf("**********    1.play    ******\n");
	printf("**********    0.exit    ******\n");
	printf("******************************\n");
	printf("Input(1/0):>");
}
void game()
{
	//初始化布雷数组—— > 初始化棋盘数组—— > 设置地雷
	//—— > 显示棋盘—— > 玩家扫雷
	//埋雷
	char mine[ROWS][COLS] = { 0 }; //雷区图
	char show[ROWS][COLS] = { 0 }; //玩家图
	//初始化棋盘
	InitBoard(mine, ROWS, COLS,'0');
	InitBoard(show, ROWS, COLS, '*');
	//设置地雷
	SetMine(mine, ROW, COL,MineCount);
	PrintBoard(show, ROW, COL);
	//玩家扫雷
	int count = ROW*COL-MineCount;
	while (CheckMine(mine,show, ROW, COL))
	{
		count--;
		PrintBoard(show, ROW, COL);
		if (count == 0)
		{
			printf("恭喜你,游戏胜利\n");
			break;
		}
	}
}

game.h文件

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


#define ROW 9  
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define MineCount 6
void InitBoard(char board[ROWS][COLS],int row,int col,char x);
void SetMine(char board[ROWS][COLS], int row, int col,int count);
void PrintBoard(char board[ROW][COL], int row, int col);
int  CheckMine (char mine[ROWS][COLS], char show[ROW][COL], int row, int col);
int IsMineCount(char mine[ROWS][COLS],int i, int j);

game.c文件

#include"game.h"

void InitBoard(char board[ROW][COL], int row, int col, char x)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			board[i][j] = x;
		}
	}
	return ;
}
void SetMine(char board[ROW][COL], int row, int col, int count)
{
	while (count)
	{
		int i = rand() % row;
		int j = rand() % col;
		if (board[i][j] == '0')
		{
			board[i][j] = '1';
			count--;
	    }
	}
}
void PrintBoard(char board[ROW][COL], int row, int col)
{
	  int i = 0;
	  //打印列号
	  for (i = 0; i <= col; i++)
		  printf(" %d ", i);
	      printf("\n");
	for (i = 0; i < row; i++)
	{
		printf(" %d ", i+1);
		int j = 0;
		for (j = 0; j <col; j++)
		{
			printf(" %c ", board[i][j]);
		}
		printf("\n");
	}
	return;
}
int CheckMine(char mine[ROW][COL],char show[ROW][COL], int row, int col)
{
	printf("请输入你要扫雷的坐标:>");
	while (1)
	{
		int i = 0, j = 0;
		scanf("%d%d", &i, &j);
		if (i >=1 && i <= row && j >=1 && j <= col)
		{
			if (mine[i-1][j-1] != '1')
			{
				int  count=IsMineCount(mine,i-1,j-1);
				show[i-1][j-1] = count+'0';
				return 1;
			}
			else
			{
				printf("很遗憾,你被炸死了\n");
				return 0;
			}
		}
	}
	
}
int  IsMineCount(char mine[ROW][COL], int x, int y)
{
	int count = 0;
	int i= 0;
	for (i = x - 1; i <= x + 1; i++)
	{  
		int j = 0;
		for (j = y - 1; j <=y + 1; j++)
		{
			if (mine[i][j] == '1')
			{
				count++;

			}
		}
	}
	return count;
}
持续更新.....

在这里插入图片描述

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。