课程设计一共两个星期,扫雷要图形界面和鼠标,前一个星期基本啥也没看,合计学习下传说中的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中)……