c语言实现扫雷(简易版,控制台)

通过graphic库实现图像输出,加载图片。我的思路比较直接,通过大量的数组记录数据,没次鼠标点击在判断数据最后实现。当然还有许多功能未能完善。

代码:

//扫雷初级
//9*9,9个雷
//2016.3.1
//
//



#include
#include
#include
#include
#include



/****************************使用到的数据类型**************************/
int Array[9][9]={0};		//地图数据记录数组,记录横纵坐标;
POINT Array2[9];			//位置记录数组,记录地雷
int Judge1=0;				//判断变量,记录标示个数
int Judge2=0;				//判断变量,记录找出的地雷个数
bool flag=true;				//判断标示,记录是否踩到地雷
bool flag1=true;			//空白区域是否全部开启的判断
bool flag2[9][9]={false};	//记录九宫格中开启的位置,未开启为true
/*****************************函数声明*****************************/
void InitGraph();					//初始化图形
void InitData();					//初始化扫雷的记录数据
void Statistics();			//扫雷数据统计
void MouseMessageDeal();			//鼠标信息处理
void BlankDeal(int x,int y);		//无数据区域的处理
void Mine(int x,int y);				//地雷区域的处理
void MineCountDeal(int x,int y,int n);	//地雷数量记录区域的处理
void RightButtonDeal(int x,int y,int n);	//鼠标右击的处理
void WinFinish();							//胜利时的结束界面
void FailFinish();							//失败时的结束界面
void Game();								//扫雷游戏






/****************函数定义*************************/



//初始化界面;
void InitGraph()
{
	//init the graph;
	initgraph(225,225);
	setbkcolor(BLACK);
	cleardevice();

	int i=0,j=0;
	IMAGE img;
	loadimage(&img,"res\\blank.bmp");
	for(i=0;i<9;i++)
		for(j=0;j<9;j++)
			putimage(i*25,j*25,&img);
}//InitGraph;



//初始化数据,生成地雷位置,记录数字标示(标志附近地雷个数)
void InitData()
{
	int i=0;
	int x=0,y=0;
	for(i=0;i<9;)
	{
		x=rand()%9;
		y=rand()%9;
		if(Array[x][y]==0)
		{
			Array2[i].x=x;
			Array2[i].y=y;
			Array[x][y]=9;
			i++;
		}
	}
	Statistics();
}


//统计并地雷数量
void Statistics()
{
	int i=0;
	int x=0,y=0;
	for(i=0;i<9;i++)
	{
		for(x=Array2[i].x-1;x<=Array2[i].x+1;x++)
			for(y=Array2[i].y-1;y<=Array2[i].y+1;y++)
				Array[x][y]++;
	}
	for(i=0;i<9;i++)
	{

		Array[Array2[i].x][Array2[i].y]=9;
	}
	
}



//处理鼠标信息
void MouseMessageDeal()
{
	MOUSEMSG m;
	int x=0,y=0;
	while(Judge2<=10&&flag==true)	//通过Judge2判断是否找完所有的,flag判断是否踩到地雷
	{
		m=GetMouseMsg();
		x=m.x/25;y=m.y/25;
		if(m.uMsg== WM_LBUTTONDOWN)
		{
			if(Array[x][y]<10||(Array[x][y]>=20&&Array[x][y]<=29))
			{
					switch(Array[x][y])
				{
					case 0:BlankDeal(x,y);break;
					case 20:BlankDeal(x,y);break;
					case 9:Mine(x,y);break;
					case 29:Mine(x,y);break;
					default:MineCountDeal(x,y,Array[x][y]);
				}
			}
		}
		if(m.uMsg==WM_RBUTTONDOWN)
				if(flag2[x][y]==false)
					RightButtonDeal(x,y,Array[x][y]);	
	}
	if(Judge2==11)
		WinFinish();
	if(flag==false)
		FailFinish();
}




//无雷区域处理函数
//遍历查早将所有无雷区域及无数字标示区域掀开
void BlankDeal(int x,int y)
{
	IMAGE img;
	loadimage(&img,"res//0.bmp");
	putimage(x*25,y*25,&img);flag2[x][y]=true;
	if(flag1==false)			//判断无类区域是否已经掀开
	{
		return ;
	}
	x=0;y=0;
	for(x=0;x<9;x++)	
	{
		for(y=0;y<9;y++)
		{
			if(Array[x][y]==0)
			{
				putimage(x*25,y*25,&img);
				flag2[x][y]=true;
			}
		}
		flag1=false;
	}
}



//地雷区域处理
void Mine(int x,int y)
{
	IMAGE img;
	loadimage(&img,"res//blood.bmp");
	putimage(x*25,y*25,&img);
	flag=false;
	getch();
}


//地雷计数区域处理
//通过Array[][]输出图像表示附近地雷数量
void MineCountDeal(int x,int y,int n)
{
	IMAGE img;
	if(n<10)
		switch(n)
		{
			case 1:loadimage(&img,"res//1.bmp");break;
			case 2:loadimage(&img,"res//2.bmp");break;
			case 3:loadimage(&img,"res//3.bmp");break;
			case 4:loadimage(&img,"res//4.bmp");break;
			case 5:loadimage(&img,"res//5.bmp");break;
			case 6:loadimage(&img,"res//6.bmp");break;
			case 7:loadimage(&img,"res//7.bmp");break;
			case 8:loadimage(&img,"res//8.bmp");break;
		}
	if(n>10&&n<=19)
		switch(n-10)
		{
			case 1:loadimage(&img,"res//1.bmp");break;
			case 2:loadimage(&img,"res//2.bmp");break;
			case 3:loadimage(&img,"res//3.bmp");break;
			case 4:loadimage(&img,"res//4.bmp");break;
			case 5:loadimage(&img,"res//5.bmp");break;
			case 6:loadimage(&img,"res//6.bmp");break;
			case 7:loadimage(&img,"res//7.bmp");break;
			case 8:loadimage(&img,"res//8.bmp");break;
		}
	putimage(x*25,y*25,&img);
	flag2[x][y]=true;
}




//鼠标右击处理函数
//通过价格Array数组中的数据加十循环实现标示,问号,及回到隐藏状态
//函数开始地雷为数字9,右击鼠标后标示图标数字加10,再次右击后问号图标加10,地三次右击后恢复隐藏状态数字减20
void RightButtonDeal(int x,int y,int n)
{
	IMAGE img;
	if(Judge1>11)
		return;
	if(n>=0&&n<=9)
	{
		Judge1++;
		if(n==9) 
		Judge2++;
		n+=10;
		loadimage(&img,"res//flag.bmp");
		putimage(x*25,y*25,&img);
		Array[x][y]=n;
		return;
	}
	if(n>=10&&n<=19)
	{
		Judge1--;
		if(n==19)  Judge2--;
		n+=10;
		loadimage(&img,"res//ask.bmp");
		putimage(x*25,y*25,&img);
		Array[x][y]=n;
		return;
	}
	if(n>=20&&n<=29)
	{
		n-=20;
		loadimage(&img,"res//blank.bmp");
		putimage(x*25,y*25,&img);
		Array[x][y]=n;
		return;
	}
}



//扫雷成功
void WinFinish()
{
	cleardevice();
	outtextxy(80,80,"game over");
	outtextxy(70,100,"you are win");
	getch();
	closegraph();
}


void FailFinish()
{
	cleardevice();
	outtextxy(80,80,"game over");
	outtextxy(70,100,"you are fail");
	getch();
	closegraph();
}




void Game()
{
	InitData();
	InitGraph();
	MouseMessageDeal();	
}



int main()
{
	srand((unsigned)time(NULL));
	Game();
	return 0;
}


效果: c语言实现扫雷(简易版,控制台)_第1张图片


你可能感兴趣的:(C语言)