现在的位置: 首页 > 综合 > 正文

课程设计扫雷(c语言)

2017年12月13日 ⁄ 综合 ⁄ 共 13438字 ⁄ 字号 评论关闭

课程设计一共两个星期,扫雷要图形界面和鼠标,前一个星期基本啥也没看,合计学习下传说中的api啊~~MFC啊~~~结果都木有成功……

后来发现了easyX……好东西啊!(其实就是把TC的图形库graphics转到了vc中)……

书面文件一律瞎编……

上代码:

#####################################################################################################################

/////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
#include<graphics.h>                                     //画图头文件
#include<conio.h>                                        //输入输出头文件
#define		USER_LBUTTONDOWN	101                      //宏定义鼠标左键
#define		USER_RBUTTONDOWN	102                      //宏定义鼠标右键
#define		USER_MBUTTONDOWN	103                      //宏定义鼠标滑轮
#pragma comment(lib,"Winmm.lib")                         //载入鼠标文件
#include<math.h>                                         //数学函数生成随机数
#include<memory.h>                                       //数组初始化
int a[50][50];                                           //数组雷
#include<time.h>                                         //计时
#include<stdio.h>                                        //_stprintf函数头文件
#include<string.h>                                       //字符串头文件
/////////////////////////////////////////////////////////////////////////
//全局变量///////////////////////////////////////////////////////////////
time_t first, second;
TCHAR m_time[33];
int flag=0;
int shengyu;
int high,wide,leishu;
float n,mn,p,q,yy;
int biaoji;
char shenglei[5];
FILE *fp;
int nandu;
struct besttime
{
	char name[7];
	float time;
	char t[5];
}zuih[4];
/////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////
int DispatchMessage(MOUSEMSG m, int opt);                //鼠标信息处理
void chuangkzh();                                        //窗口转换过程
int GetMessage(MOUSEMSG m);                              //获取鼠标信息
void kaishi();                                           //游戏开始界面
void kaishi2();                                          //中级界面开始
void kaishi3();                                          //高级界面开始
int chushi();                                            //游戏初始化菜单
int saolei();                                            //扫雷鼠标执行函数
int DispatchMessage2(MOUSEMSG m, int opt);               //游戏中鼠标处理
int saolz(MOUSEMSG m);                                   //扫雷中操作
void bulei();                                            //布雷函数
void panduan();                                          //判断是否为雷
int nanduxuanxiang();                                    //难度选项
int DispatchMessage3(MOUSEMSG m, int opt);               //鼠标信息处理(难度选项)
int zerodg(int x,int y);                                 //zero递归函数
void zuigaofen();                                        //最高分鼠标处理
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//主函数
void main()
{
	FILE *fp;
	int duru=0;
	fp=fopen("best.dat","rb+");
    for(int i=0;i<4;i++)
    if(fread(&zuih[i],sizeof(besttime),1,fp)!=1&&duru!=1)
	{
		duru=1;
		printf("file read error!\n");
	}
	else
		continue;
	fclose(fp);
	if(duru!=1)
	{
		initgraph(640,480);
		chushi();
		int opt,end=0;
		MOUSEMSG m;
		while(end!=1)
		{
			m = GetMouseMsg();
			opt = GetMessage(m);
			end=DispatchMessage(m, opt);
		}
		setfont(80,0,"黑体");
		for(int i=0;i<20;i++)
		{
			setcolor(WHITE);
			outtextxy(150,200,"再见");
			Sleep(25);
			setcolor(BLACK);
			outtextxy(150,200,"再见");
			Sleep(25);
		}
		mciSendString("stop mymusic", NULL, 0, NULL);
		mciSendString("close mymusic", NULL, 0, NULL);
		cleardevice();
		closegraph();
	}
}
///////////////////////////////////////////////////////////
//主菜单,选择难度
int chushi()
{
	
	initgraph(640,480);
	
	HCURSOR hcur = (HCURSOR)LoadImage(NULL, "c:\\鼠标.cur", IMAGE_CURSOR, 0, 0, LR_LOADFROMFILE);
	HWND hwnd = GetHWnd();							// 获取绘图窗口句柄
	SetClassLong(hwnd, GCL_HCURSOR, (long)hcur);	// 设置窗口类的鼠标样式
	
	setcolor(GREEN);
	setfont(80,0,"黑体");
	outtextxy(200,100,"扫  雷");
	setfont(30,0,"黑体");
	outtextxy(450,90,"R"); 
	setcolor(WHITE);
	setfont(20,0,"黑体");
	outtextxy(270,250,"1、新游戏");
	outtextxy(270,280,"2、最高分");
	outtextxy(270,310,"3、选  项");
	outtextxy(270,340,"4、帮  助");
	outtextxy(270,370,"5、退  出");
	outtextxy(500,410,"by:zmq  zzh");
	outtextxy(500,440,"v:2.0");
	mciSendString("open 背景音乐.mp3 alias mymusic", NULL, 0, NULL);
	mciSendString("play mymusic", NULL, 0, NULL);
	return 0;
}
//////////////////////////////////////////////////////////
//游戏开始界面,生成格子,着色
void kaishi()
{
	bulei();
	biaoji=0;
	if(wide<=16)
	{
		n=360/high;mn=360/wide;
		p=60+n*high;q=60+mn*wide;
		yy=0;
	}
	else
	{
		n=360/high;mn=360/16;
		yy=(wide-16)*mn;
		initgraph(640+yy,480);
	}
		p=60+n*high;q=60+mn*wide;
		shengyu=0;
		setlinestyle(PS_SOLID, NULL, 2);
		setcolor(BLUE);
		line(60,60,q,60);
		line(60,p,q,p);
		line(60,60,60,p);
		line(q,60,q,p);
	setfillstyle(RGB(0,0,150));
	floodfill(70,70,BLUE);
	setcolor(WHITE);
	for(float i=60;i<=p;i+=n)
		line(60,i,q,i);
	for(i=60;i<=q;i+=mn)
		line(i,60,i,p);
	setlinestyle(PS_SOLID, NULL, 10);
	setcolor(GREEN);
	line(500+yy,0,500+yy,480);
	setcolor(WHITE);
	setfont(20,0,"宋体");
	outtextxy(510+yy,100,"时  间:0");
	outtextxy(510+yy,200,"炸弹数:");
	outtextxy(530+yy,370,"左键开始");
	outtextxy(530+yy,410,"中键重玩");
	outtextxy(530+yy,450,"回主菜单");
	if(wide==9)
		outtextxy(590+yy,200,"10");
	if(wide==16)
		outtextxy(590+yy,200,"40");
	if(wide==30)
		outtextxy(590+yy,200,"99");
	saolei();

}
////////////////////////////////////////////////////////////////////////////
//鼠标信息处理(主菜单)
int DispatchMessage(MOUSEMSG m, int opt)
{
	switch(opt)
	{
		case USER_LBUTTONDOWN:
			// 左键
			if(m.x>=270&&m.x<=370&&m.y>=250&&m.y<=270)
			{
                flag=0;
				nandu=1;
				high=9;
				wide=9;
				leishu=10;
				chuangkzh();
				kaishi();
				return 0;
			}
			if(m.x>=270&&m.x<=370&&m.y>=280&&m.y<=300)
			{
                flag=0;
				chuangkzh();
				setcolor(GREEN);
				setfont(25,0,"楷体");
				outtextxy(150,350,"返回主菜单            重置");
				setfont(25,0,"黑体");
				setcolor(WHITE);
				outtextxy(200,150,"初级:");
				outtextxy(200,200,"中级:");
				outtextxy(200,250,"高级:");
				outtextxy(270,150,zuih[1].name);
				outtextxy(270,200,zuih[2].name);
				outtextxy(270,250,zuih[3].name);
				outtextxy(400,150,zuih[1].t);
				outtextxy(400,200,zuih[2].t);
				outtextxy(400,250,zuih[3].t);
				zuigaofen();
				
			}
			if(m.x>=270&&m.x<=370&&m.y>=310&&m.y<=330)
			{
				chuangkzh();
				setcolor(RED);
				setfont(30,0,"黑体");
				outtextxy(180,80,"一、初级【 9x 9】");
				outtextxy(180,180,"二、中级【16x16】");
				outtextxy(180,280,"三、高级【16x30】");
				outtextxy(220,380,"返回主菜单");
                nanduxuanxiang();
				return 0;
			}
			if(m.x>=270&&m.x<=370&&m.y>=340&&m.y<=360)
			{
				chuangkzh();
				setbkmode(TRANSPARENT);
				setfillstyle(WHITE);
				floodfill(15,15,WHITE);
				setcolor(BLUE);
				setfont(50,0,"黑体");
				outtextxy(245,50,"帮  助");
				setcolor(BLACK);
				setfont(20,0,"楷体");
				outtextxy(120,130,"1、请将《鼠标.cur》文件复制到c盘根目录下");
				outtextxy(120,160,"   再进行游戏,否则可能会影响鼠标效果。");
				outtextxy(120,190,"2、请将《背景音乐.mp3》同游戏的应用程");
				outtextxy(120,220,"   序员放在一起。可自己更改背景音乐(将音");
				outtextxy(120,250,"   乐改名后更换背景音乐即可)。");
				outtextxy(120,280,"3、游戏时请勿点击白色表格区域,否则可能会");
				outtextxy(120,310,"   导致失败等不确定情况。");
				outtextxy(120,340,"4、新手初次编程,游戏中存在漏洞请谅解。");
				outtextxy(120,370,"5、如有疑问可发送邮件到aszmq@163.com。");
				setcolor(YELLOW);
				setfont(40,0,"黑体");
				outtextxy(270,420,"游戏适度 沉溺伤身");
				setcolor(RED);
				setfont(40,0,"隶书");
				outtextxy(50,420,"返回");
				setbkmode(OPAQUE);
				int opt,tiaochu=0;
				MOUSEMSG m;
				while(1)
				{
					m = GetMouseMsg();
					opt = GetMessage(m);
					if(opt==USER_LBUTTONDOWN)
					if(m.x>=50&&m.x<=130&&m.y<=460&&m.y>=420)
					{
						chuangkzh();
						main();
					}
				}	
			}
			if(m.x>=270&&m.x<=370&&m.y>=370&&m.y<=390)
			{
				chuangkzh();
				return 1;
			}
			break;
		
	}
return 0;
}
//////////////////////////////////////////////////////////////////////////
//难度选项
int nanduxuanxiang()
{
	int opt,end=0;
	MOUSEMSG m;
	while(end!=1)
	{
		m = GetMouseMsg();
		opt = GetMessage(m);
		end=DispatchMessage3(m, opt);
	}
return 0;
}
///////////////////////////////////////////////////////////////////////////////
//鼠标信息处理(最高分)
void zuigaofen()
{
	int opt,end=0;
	MOUSEMSG m;
	while(end!=1)
	{
		m = GetMouseMsg();
		opt = GetMessage(m);
		if(opt==USER_LBUTTONDOWN)
		{
			if(m.x>=150&&m.x<=275&&m.y<=375&&m.y>=350)
			{
				chuangkzh();
				main();
			}
			if(m.x>=435&&m.x<=485&&m.y<=375&&m.y>=350)
			{
				strcpy(zuih[1].name,"wu");
                strcpy(zuih[1].t,"999");
                zuih[1].time=999;
                strcpy(zuih[2].name,"wu");
                strcpy(zuih[2].t,"999");
                zuih[2].time=999;
                strcpy(zuih[3].name,"wu");
                strcpy(zuih[3].t,"999");
                zuih[3].time=999;
				fp=fopen("best.dat","rb+");
				for(int i=0;i<4;i++)
				if(fwrite(&zuih[i],sizeof(besttime),1,fp)!=1)
				printf("file write error!\n");
				fclose(fp);
				chuangkzh();
				zuigaofen();
			}
			else
				zuigaofen();
		}
		else
				zuigaofen();
	}
}
///////////////////////////////////////////////////////////////////////////////
//鼠标处理信息(难度选项)
int DispatchMessage3(MOUSEMSG m, int opt)
{
		switch(opt)
	{
		case USER_LBUTTONDOWN:
			// 左键
			if(m.x>=180&&m.x<=400&&m.y>=80&&m.y<=110)
			{
				nandu=1;
				high=9;
				wide=9;
				leishu=10;
				chuangkzh();
				kaishi();
				return 1;
			}
			if(m.x>=180&&m.x<=400&&m.y>=180&&m.y<=210)
			{
				nandu=2;
				high=16;
				wide=16;
				leishu=40;
				chuangkzh();
				kaishi();
				return 1;
			}
			if(m.x>=180&&m.x<=400&&m.y>=280&&m.y<=310)
			{
				nandu=3;
				high=16;
				wide=30;
				leishu=99;
				chuangkzh();
				kaishi();
				return 1;
			}

			if(m.x>=220&&m.x<=420&&m.y>=380&&m.y<=410)
			{
				chuangkzh();
				main();
				return 0;
			}
	}
}

///////////////////////////////////////////////////////////////////////////
//鼠标信息处理(游戏中)
int DispatchMessage2(MOUSEMSG m, int opt)
{
		switch(opt)
	{
		case USER_LBUTTONDOWN:
			// 左键
			if(m.x>=530+yy&&m.x<=610+yy&&m.y>=450&&m.y<=470)
			{
				flag=0;

				chuangkzh();
				main();
			}
			if(m.x>=60&&m.x<=420+yy&&m.y>=60&&m.y<=420)
			{
				if(flag==0)
				{
					first=time(NULL);
					flag=1;
				}
				saolz(m);
			}
			break;
		case USER_MBUTTONDOWN:
			// 中键
			if(flag==0)
				{
					first=time(NULL);
					flag=1;
				}
  			if(flag==1)
			{
				second=time(NULL);
				_stprintf(m_time, _T("%.0lf"), difftime(second,first));
				setfont(20,0,"黑体");
				outtextxy(590+yy,100,m_time);
				if(leishu-biaoji<10&&leishu-biaoji>=0)
				{
					shenglei[0]=' ';
					_stprintf(shenglei+1, _T("%d"), leishu-biaoji);
				}
				else
				{
					_stprintf(shenglei, _T("%d"), leishu-biaoji);
				}
				outtextxy(590+yy,200,shenglei);
			}
			chuangkzh();
			kaishi();
			return 1;
			break;
		case USER_RBUTTONDOWN:
			
			int x,y;
			x=(m.x-60)/n+1;
			y=(m.y-60)/mn+1;
			if(m.x>=60&&m.x<=420+yy&&m.y>=60&&m.y<=420)
			if(a[x][y]!=-1)
			{
				setfillstyle(RED);floodfill(m.x,m.y,WHITE);
				biaoji++;
			}
			saolei();
			break;
	}
}

//////////////////////////////////////////////////////
//窗口变化的简单动画效果
void chuangkzh()
{
	int lr=0;
	int i=0,j=640+yy;
	setlinestyle(PS_SOLID, NULL, 5);
	while(i!=j)
	{
			setcolor(WHITE);
			line(i+5,0,i+5,480);
			setcolor(BLACK);
			line(i,0,i,480);
			Sleep(2);
			setcolor(WHITE);
			line(j-5,0,j-5,480);
			setcolor(BLACK);
			line(j,0,j,480);
			Sleep(8);
			i++;
			j--;
	}
	setcolor(BLACK);
	line(j+6,0,j+6,480);
	line(i-4,0,i-4,480);
	setlinestyle(PS_SOLID, NULL, 1);
}

///////////////////////////////////////////////
// 获取鼠标信息
int GetMessage(MOUSEMSG m)
{
	//鼠标循环
	switch(m.uMsg)
	{
		case WM_LBUTTONDOWN:
			return USER_LBUTTONDOWN;
		case WM_RBUTTONDOWN:
			return USER_RBUTTONDOWN;
		case WM_MBUTTONDOWN:
			return USER_MBUTTONDOWN;
		default:
			if(flag==1)
			{
				second=time(NULL);
				_stprintf(m_time, _T("%.0lf"), difftime(second,first));
				setfont(20,0,"黑体");
				outtextxy(590+yy,100,m_time);
				if(leishu-biaoji<10&&leishu-biaoji>=0)
				{
					shenglei[0]=' ';
					_stprintf(shenglei+1, _T("%d"), leishu-biaoji);
				}
				else
				{
					_stprintf(shenglei, _T("%d"), leishu-biaoji);
				}
				outtextxy(590+yy,200,shenglei);
			}
			break;
	}
	return 0;
}

/////////////////////////////////////////////////////////////////////////
//布雷函数
void bulei()
{
	int x,y;
	memset(a,0,sizeof(a));
	srand( (unsigned)time( NULL )*5 );
	for(int i=1;i<=leishu;i++)
	{

		x=rand()%wide+1;
		y=rand()%high+1;
		if(a[x][y]!=0)
		{
			i--;
			continue;
		}
		else
			a[x][y]=1000;
	}
	for(i=1;i<=wide;i++)
		for(int j=1;j<=high;j++)
		{
			if(a[i][j]==1000)
				continue;
			else
			{
				a[i][j]=a[i-1][j-1]+a[i-1][j]+a[i-1][j+1]+a[i][j-1]+a[i][j+1]+a[i+1][j-1]+a[i+1][j]+a[i+1][j+1];
				a[i][j]/=1000;
			}
		}
	
}

/////////////////////////////////////////////////////////////////////////
//判断是否为雷函数
void panduan()
{	
	int C=255;
	char s[10];
	zuih[0].time=difftime(second,first);
	setfont(150,0,"黑体");
	if(shengyu==high*wide-leishu)
	{
		chuangkzh();
		for(int i=0;i<128;i++)
		{
			setcolor(RGB(C,0,0));
			outtextxy(170+yy/2,200,"胜利");
			C-=8;
			if(C<=0)
				C=255;
			Sleep(20);
		}
		if(zuih[0].time<zuih[nandu].time)
		InputBox(zuih[0].name,8,"最高分\n输入用户名※英文字母※");
		strcpy(zuih[nandu].name,zuih[0].name);
		zuih[nandu].time=zuih[0].time;
		_stprintf(zuih[nandu].t, _T("%.0lf"), zuih[nandu].time);
		fp=fopen("best.dat","rb+");
		fseek(fp,nandu*sizeof(besttime),0);
		fwrite(&zuih[nandu],sizeof(besttime),1,fp);
		fclose(fp);
		flag=0;
		chuangkzh();
		kaishi();
	}
	else
	{
		chuangkzh();
		for(int i=0;i<128;i++)
		{
			setcolor(RGB(C,0,0));
			outtextxy(170+yy/2,200,"失败");
			C-=8;
			if(C<=0)
				C=255;
			Sleep(20);
		}
		flag=0;
		chuangkzh();
		kaishi();
	}
}

//////////////////////////////////////////////////////////////////////////
//扫雷执行函数
int saolei()
{
	if(shengyu==high*wide-leishu)
		panduan();
	int opt,end=0;
	MOUSEMSG m;
	while(1)
	{
		if(flag==1)
		{
			second=time(NULL);
			_stprintf(m_time, _T("%.0lf"), difftime(second,first));
			setfont(20,0,"黑体");
			outtextxy(590+yy,100,m_time);
			if(leishu-biaoji<10&&leishu-biaoji>=0)
				{
					shenglei[0]=' ';
					_stprintf(shenglei+1, _T("%d"), leishu-biaoji);
				}
				else
				{
					_stprintf(shenglei, _T("%d"), leishu-biaoji);
				}
				outtextxy(590+yy,200,shenglei);
		}
		if(MouseHit())
		{
			while(end!=1)
			{
				m = GetMouseMsg();
				int x,y;
				x=(m.x-60)/n+1;
				y=(m.y-60)/mn+1;
				if(a[x][y]==-1)
					saolei();
				opt = GetMessage(m);
				end=DispatchMessage2(m, opt);
			}
		}
	}
return 0;
}

///////////////////////////////////////////////////////////////////////////
//扫雷中操作
int saolz(MOUSEMSG m)
{
	
	int x,y,zero=0;
	int x1,y1;
	x=(m.x-60)/n+1;
	y=(m.y-60)/mn+1;
	if(a[x][y]==-1)
		saolei();
	setfillstyle(BLACK);
	floodfill((x-1)*n+63,(y-1)*mn+63,WHITE);
	setfont(n-2,0,"黑体");
	switch(a[x][y])
	{
		case 0:a[x][y]=-1;shengyu++;zerodg(x,y);break;
		case 1:setcolor(WHITE);outtextxy((x-1)*n+60+n/4,(y-1)*mn+61,"1");shengyu++;break;
		case 2:setcolor(WHITE);outtextxy((x-1)*n+60+n/4,(y-1)*mn+61,"2");shengyu++;break;
		case 3:setcolor(WHITE);outtextxy((x-1)*n+60+n/4,(y-1)*mn+61,"3");shengyu++;break;
		case 4:setcolor(WHITE);outtextxy((x-1)*n+60+n/4,(y-1)*mn+61,"4");shengyu++;break;
		case 5:setcolor(WHITE);outtextxy((x-1)*n+60+n/4,(y-1)*mn+61,"5");shengyu++;break;
		case 6:setcolor(WHITE);outtextxy((x-1)*n+60+n/4,(y-1)*mn+61,"6");shengyu++;break;
		case 7:setcolor(WHITE);outtextxy((x-1)*n+60+n/4,(y-1)*mn+61,"7");shengyu++;break;
		case 8:setcolor(WHITE);outtextxy((x-1)*n+60+n/4,(y-1)*mn+61,"8");shengyu++;break;
		default:setfillstyle(RED);floodfill(m.x,m.y,WHITE);panduan();break;
	}
	a[x][y]=-1;
	saolei();
	return 0;
}

////////////////////////////////////////////////////////////////////////////////////////////////
//zero递归
int zerodg(int x,int y)
{
	for(int j=y-1;j<y+2;j++)
			for(int i=x-1;i<x+2;i++)
			if(i==x&&j==y||j<1||i<1||i>wide||j>high)
				continue;
			else
			{
				//Sleep(50);
				setfillstyle(BLACK);
				floodfill((i-1)*n+63,(j-1)*mn+63,WHITE);
				switch(a[i][j])
					{
						case 0:a[i][j]=-1;shengyu++;zerodg(i,j);break;
						case 1:setcolor(WHITE);outtextxy((i-1)*n+60+n/4,(j-1)*mn+61,"1");shengyu++;break;
						case 2:setcolor(WHITE);outtextxy((i-1)*n+60+n/4,(j-1)*mn+61,"2");shengyu++;break;
						case 3:setcolor(WHITE);outtextxy((i-1)*n+60+n/4,(j-1)*mn+61,"3");shengyu++;break;
						case 4:setcolor(WHITE);outtextxy((i-1)*n+60+n/4,(j-1)*mn+61,"4");shengyu++;break;
						case 5:setcolor(WHITE);outtextxy((i-1)*n+60+n/4,(j-1)*mn+61,"5");shengyu++;break;
						case 6:setcolor(WHITE);outtextxy((i-1)*n+60+n/4,(j-1)*mn+61,"6");shengyu++;break;
						case 7:setcolor(WHITE);outtextxy((i-1)*n+60+n/4,(j-1)*mn+61,"7");shengyu++;break;
						case 8:setcolor(WHITE);outtextxy((i-1)*n+60+n/4,(j-1)*mn+61,"8");shengyu++;break;
						case -1:break;
					}
				a[i][j]=-1;
				
			}
			return 0;
}

课程设计一共两个星期,扫雷要图形界面和鼠标,前一个星期基本啥也没看,合计学习下传说中的api啊~~MFC啊~~~结果都木有成功……

后来发现了easyX……好东西啊!(其实就是把TC的图形库graphics转到了vc中)……

抱歉!评论已关闭.