用c语言实现小游戏《扫雷》(第一次不会死和展开函数)

用c语言实现小游戏《扫雷》(第一次不会死和展开函数)

先写代码了,欢迎测试BUG

game.h

#ifndef __GAME_H__
#define __GAME_H__
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>
#define ROW 10
#define COL 10
#define ROW1 ROW+2
#define COL1 COL+2
#define LEI 15  //可以自定义雷的数目

void init(char show[ROW1][COL1],char clei[ROW1][COL1],int row,int col);
void display(char arr[ROW1][COL1],int row,int col);//打印游戏界面
void _lei(char arr[ROW1][COL1],int row,int col);//布置雷
int playergo(char show[ROW1][COL1],char clei[ROW1][COL1],int row,int col);
int _swap(char clei[ROW1][COL1],int x,int y);//查看(x,y)周围几个雷
void open(char clei[ROW1][COL1],char show[ROW1][COL1],int x,int y);//展开函数
int getcount(char show[ROW1][COL1],int row,int col); //获取剩余‘*’的个数
void safe_LEI(char clei[ROW1][COL1],int x,int y); //第一次是LEI偷偷移走


#endif __GAME_H__

test.c

#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
menu()
{
	printf("****扫雷小游戏**************************\n");
	printf("***************1.play*******************\n");
	printf("***************0.exit*******************\n");
	printf("****************************************\n");

}
game()
{
	char show[ROW1][COL1] = {0};// 游戏面板数组
	char clei[ROW1][COL1] = {0};//	游戏内部含雷数组
	srand((unsigned int)time(NULL));//随机数

	init(show,clei,ROW1,COL1);//初始化两个数组;
	_lei(clei,ROW,COL);	// 布置雷
	display(show,ROW1,COL1);// 打印游戏面板
	/*display(clei,ROW1,COL1);*///可以查看雷布置的位置
	playergo(show,clei,ROW,COL); // 玩家开始玩游戏(内置游戏输赢判断)
		
}
int main()
{
	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);

	return 0;
}

只需要向四个方向递归就可以全部展开

void open(char clei[ROW1][COL1],char show[ROW1][COL1],int x,int y)

主要函数以及调用都在以下函数中

int  playergo(char show[ROW1][COL1],char clei[ROW1][COL1],int row,int col)

游戏函数
game.c

#include"game.h"
void init(char show[ROW1][COL1],char clei[ROW1][COL1],int row,int col)
{
	/*int i = 0;
	int j = 0;
	for(i=0; i<row; i++)
	{
		for(j=0; j<col; j++)
		{
			show[i][j] = '*';
			clei[i][j] = '0';

		}
	}*/
	//库函数数组初始化,头文件string.h
	memset(&show[0][0],'*', row*col*sizeof(show[0][0]));//游戏界面初始‘*’
	memset(&clei[0][0],'0', row*col*sizeof(clei[0][0]));//雷数组初始为‘0’

}

void display(char arr[ROW1][COL1],int row,int col)
{
		int i = 0;
		int j = 0;
	for(j=0; j<row-1; j++) //打印横坐标:
	{
		printf("%4d",j);
	}
		printf("\n");
	for(i=1; i<row-1; i++)
	{
		printf("%4d",i);	//打印纵坐标
		for(j=1; j<col-1; j++)
		{
			printf("%4c",arr[i][j]);
		}
		printf("\n");
	}
	printf("-------------------------------------------------------------------\n");

}
void _lei(char arr[ROW1][COL1],int row,int col)
{
	int lei = LEI;
	while(lei)
	{
		int x = rand()%row+1;
		int y = rand()%col+1;
		if(arr[x][y]=='0') //判断坐标位置是否有雷;
		{
			arr[x][y]='1';
			lei--;			//安排雷控制循环;
		}
	}
}
int  playergo(char show[ROW1][COL1],char clei[ROW1][COL1],int row,int col)
{
	int x = 0;
	int y = 0;
	int count = row*col;
	int ret = 0;

	while(count!=LEI)
	{
		printf("请输入坐标:>");
		scanf("%d%d",&x,&y);
		if(x<1||x>col||y<1||y>row)
		{
			printf("输入坐标有误!\n");
		}
		else
		{
				if(count==row*col&&clei[x][y]=='1') //判断第一次玩的条件,如果
				{
					safe_LEI(clei,x,y);  
				
				}

				if(clei[x][y]=='1')
				{
					printf("你被炸死了\n");
					display(clei,ROW1,COL1);
					return 0;
				}
				else
				{
				
					open(clei,show,x,y); // 判断是否连续展开;
					count=getcount(show,ROW,COL); //剩余‘*’数量,与LEI比较控制循环;
					display(show,ROW1,COL1);
					/*display(clei,ROW1,COL1);*/

				}
		}

	}
	display(clei,ROW1,COL1);
	printf("恭喜你,游戏胜利!\n");
	return 1;
}
void safe_LEI(char clei[ROW1][COL1],int x,int y)
{
	int count = 1;
	while(count)
	{
		if(clei[x][y]=='1')
		{
			int i = rand()%ROW+1;
			int j = rand()%COL+1;
			
			clei[x][y]='0';
			if(clei[i][j]=='0')
			{
				clei[i][j]='1';
				count--;
			}

		}
		else
			count--;
	
	}


}

int  _swap(char clei[ROW1][COL1],int x,int y)
{
	return clei[x-1][y]+clei[x-1][y-1]+clei[x][y-1]+clei[x+1][y-1]+clei[x+1][y]+
		clei[x+1][y+1]+clei[x][y+1]+clei[x-1][y+1]-('0'*8);

}
void open(char clei[ROW1][COL1],char show[ROW1][COL1],int x,int y)
{
		
	show[x][y] = _swap(clei,x,y)+'0';

	if(clei[x][y]=='0'&&_swap(clei,x,y)==0) //如果此坐标不是LEI,并且附近安全则展开;
	{
		
		//x+1,x-1,y+1,y-1时需要判断是否越界
		// ==‘*’表示未被展开,防止重复;
		if(clei[x+1][y]=='0'&&show[x+1][y]=='*'&&x+1<=ROW)//向下
		{
			show[x+1][y] = _swap(clei,x+1,y)+'0';
			if(_swap(clei,x+1,y)==0)
			{
				open(clei,show,x+1,y);
			}

		}
		if(clei[x-1][y]=='0'&&show[x-1][y]=='*'&&x-1>0)//向上
		{
			show[x-1][y] = _swap(clei,x-1,y)+'0';
			if(_swap(clei,x-1,y)==0)
			{
				open(clei,show,x-1,y);
			}

		}
		if(clei[x][y+1]=='0'&&show[x][y+1]=='*'&&y+1<=COL)//向右
		{
			show[x][y+1] = _swap(clei,x,y+1)+'0';
			if(_swap(clei,x,y+1)==0)
			{
				open(clei,show,x,y+1);
			}

		}
		if(clei[x][y-1]=='0'&&show[x][y-1]=='*'&&y-1>0)//向左
		{
			show[x][y-1] = _swap(clei,x,y-1)+'0';
			if(_swap(clei,x,y-1)==0)
			{
				open(clei,show,x,y-1);
			}

		}
	}


}
int getcount(char show[ROW1][COL1],int row,int col)
{
	int i = 0;
	int j = 0;
	int count = 0;
	for(i=1;i<=row;i++)
	{
		for(j=1;j<=col;j++)
		{
			if(show[i][j]=='*')
				count++;
		}
	}
	return count;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值