数据结构扫雷游戏_第1页
数据结构扫雷游戏_第2页
数据结构扫雷游戏_第3页
数据结构扫雷游戏_第4页
数据结构扫雷游戏_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、/*模拟扫雷游戏 */#include <graphics.h>#include <math.h>#include <stdio.h>#include <dos.h>#include <stdlib.h>#include <conio.h>#include <alloc.h>union REGS regs;int size=15;/*用于表示每个方块的大小(正方形的边长)*/int pix,piy=50;/*pix,piy是矩阵的偏移量*/char b2="1"/*用于显示方格周围的雷的个数

2、*/int pan3016;/*用于记录盘面的情况:0:没有、9:有雷、18:周围雷的个数*/int pan13016;/*pan1纪录当前的挖雷情况,0:没有操作、1:打开了、2:标记了*/int tt;/*纪录时间参数*/int Eflags;/*用于标记鼠标按钮的有效性,0:有效,1:无效,2:这是鼠标的任意键等于重新开始*/int Msinit();void Draw(int x,int y,int sizex,int sizey);void Facedraw(int x,int y,int sizel,int k);void Dead(int sizel,int x,int y);v

3、oid Setmouse(int xmax,int ymax,int x,int y);int Msread(int *xp,int *yp,int *bup,struct time t1,int k);void Draw1(int x,int y);int Open(int x,int y);float Random();void Have(int sum,int x,int y,int xx,int yy);void Help();void Coread();void Ddraw2(int x,int y);/*下面是主函数*/main()int mode=VGAHI,devices=VG

4、A;/*图形模式初始化的变量*/char ams; /*鼠标操作中的标志变量*/int xms,yms,bms; /*鼠标的状态变量*/int i,j,k,k1=0; /*i,j,k是循环变量*/int x=9,y=9,flags=0; /*x,y矩阵的大小*/int sum=10; /*sum 盘面的雷的总数目,是个x,y的函数*/int x1=0,y1=0; /*用于记录光标当前的位置*/int x11=0,y11=0; /*暂时保存鼠标位置的值*/int sizel=10; /*脸的大小*/int cflags=1; /*这是菜单操作标志变量,没有弹出1,弹出0*/struct time

5、 t1=0,0,0,0; /*时间结构体,头文件已定义*/int co3; /*暂时纪录历史纪录*/void far *Map; /*用于保存鼠标图片*/char name320; /*名字字符串,用于记录名字*/FILE * p; /*文件指针用于文件操作*/Msinit(); /*鼠标初始化*/*registerbgidriver(EGAVGA_driver);*/initgraph(&devices,&mode,"C:tc"); /*图形模式初始化*/*为图片指针分配内存*/if(Map=farmalloc(imagesize(0,0,20,20)=N

6、ULL)/*图片的大小是20*20*/printf("Memory ererr!n");printf("Press any key to out!n");exit(1);/*用于检验文件是否完整*/while(p = fopen("score.dat", "r") = NULL) /*如果不能打开就新建一个*/if(p = fopen("score.dat", "w") = NULL)/*如果不能新建就提示错误并推出*/printf("The file cannot

7、 open!n");printf("Presss any key to exit!n");getch();exit(1);/*写入初始内容*/fprintf(p,"%d %d %d,%sn%sn%sn",999,999,999,"xiajia","xiajia","xiajia");fclose(p); /*暂时读出历史纪录。并用co3纪录*/fscanf(p,"%d %d %d,",&co0,&co1,&co2);for(i=0;i<

8、3;i+)fscanf(p,"%sn",namei);fclose(p);Setmouse(1,1,615,460); /*设置鼠标的活动范围*/pix=250-x*size/2; /*计算地雷按钮矩阵的左边*/bss: b0='1' /*游戏开始和重来的切入点*/flags=0; /*测试中这个变量好像没有作用,但是为了逻辑的完整性暂时保留*/k=0;Eflags=0;tt=0;cleardevice();/*清屏*/setbkcolor(LIGHTCYAN);for(i=0;i<30;i+) /*盘面初始化*/for(j=0;j<16;j+)

9、panij=0;pan1ij=0;for(;) /*用于生成雷的盘面情况*/i=(int)(x*Random();j=(int)(y*Random();if(panij=0)panij=9;k=k+1;if(k=sum) break; for(i=0;i<x;i+)/*用于统计各点的周边情况*/for(j=0;j<y;j+)if(panij=0)/*只有没有雷的才需要处理*/if(i-1>=0 && j-1>=0 && pani-1j-1=9) panij+;if(j-1>=0 && panij-1=9) panij

10、+;if(i+1<x && j-1>=0 && pani+1j-1=9) panij+;if(i-1>=0 && pani-1j=9) panij+;if(i+1<x && pani+1j=9) panij+;if(i-1>=0 && j+1<y && pani-1j+1=9) panij+;if(j+1<y && panij+1=9) panij+;if(i+1<x && j+1<y && pan

11、i+1j+1=9) panij+;if(sum=10)/*画底座*/Draw(170,1,162,200);setcolor(1);outtextxy(175,5,"Game( )");setcolor(4);outtextxy(175,5," G");/*小*/elseif(sum=40)Draw(115,1,272,307);setcolor(1);outtextxy(120,5,"Game(G)");setcolor(4);outtextxy(120,5," G");/*中*/elseif(sum=99)Dr

12、aw(40,1,470,307);setcolor(1);outtextxy(45,5,"Game(G)");setcolor(4);outtextxy(45,5," G");/*大*/setcolor(1);/*显示提示信息*/outtextxy(100,350," : Help.");setcolor(4);outtextxy(100,350,"H");setcolor(1);outtextxy(200,350," / : exit.");setcolor(4);outtextxy(200,

13、350,"Q");outtextxy(220,350,"ESC");setcolor(1);outtextxy(330,350," : cores.");setcolor(4);outtextxy(330,350,"R");Facedraw(250,30,sizel,2);/*显示控制按钮,脸型*/for(i=0;i<x;i+)/*这一段用于描绘盘面*/for(j=0;j<y;j+)Draw(i*size+pix,j*size+piy,size,size);Have(sum,pix+20,30,x,y)

14、;/*各项的初始显示*/k=0;setfillstyle(1, 0);bar(460-pix,25,490-pix,40);setcolor(4);outtextxy(465-pix,30,"000");/*下面这一段用于接收用户的控制,并做出反应*/for(;)ams=Msread(&xms,&yms,&bms,t1,k);/*读取鼠标状态*/*下面一段用于保存并记录鼠标图片*/if(flags!=0)putimage(x11,y11,Map,COPY_PUT);x11=xms;y11=yms;flags=1;/*这里插入菜单操作*/if(xms&

15、gt;=pix-10 && xms<=pix+26 && yms>=2 && yms<=14 && bms=1) | ams='g' | ams='G')/*点中菜单的判断*/Draw(pix-10,14,100,88); /*画菜单*/cflags=0;setcolor(1);/*下面显示菜单项*/outtextxy(pix-4,19,"Restar(R)");setcolor(4);outtextxy(pix-4,19," R");set

16、color(1);/*下面显示菜单项*/outtextxy(pix-4,30,"Easy(E)");setcolor(4);outtextxy(pix-4,30," E");setcolor(1);/*下面显示菜单项*/outtextxy(pix-4,41,"Nomall(N)");setcolor(4);outtextxy(pix-4,41," N");setcolor(1);/*下面显示菜单项*/outtextxy(pix-4,52,"Hard(H)");setcolor(4);outtex

17、txy(pix-4,52," H");setcolor(1);/*下面显示菜单项*/outtextxy(pix-4,63,"Corse(C)");setcolor(4);outtextxy(pix-4,63," C");setcolor(1);/*下面显示菜单项*/outtextxy(pix-4,74,"Help(L)");setcolor(4);outtextxy(pix-4,74," L");setcolor(1);/*下面显示菜单项*/outtextxy(pix-4,85,"Qu

18、it(Q)");setcolor(4);outtextxy(pix-4,85," Q");bms=0;/*完成菜单的描绘*/*这里是为了完全实现鼠标控制才加入的内容*/if(Eflags=2 && (bms!=0 | ams!=-1)goto bss;/*下面实现菜单的功能,每一项响应一个菜单项*/if(cflags=0)if(xms>=pix-6 && xms<=pix+85 && yms>=17 && yms<=28 && bms=1)| (ams='

19、;r' | ams='R')/*下面依次响应菜单中各项*/cflags=1;goto bss;elseif(xms>=pix-6 && xms<=pix+85 && yms>=28 && yms<=39 && bms=1) | ams='e' | ams='E')cflags=1;x=9;y=9;sum=10;pix=250-x*size/2;goto bss;elseif(xms>=pix-6 && xms<=pix+85

20、 && yms>=39 && yms<=50 && bms=1) | ams='n' | ams='N')cflags=1;x=16;y=16;sum=40;pix=250-x*size/2;goto bss;elseif(xms>=pix-6 && xms<=pix+85 && yms>=50 && yms<=61 && bms=1) | ams='h' | ams='H')cfla

21、gs=1;x=30;y=16;sum=99;pix=250-x*size/2+25;goto bss;elseif(xms>=pix-6 && xms<=pix+85 && yms>=61 && yms<=72 && bms=1) | ams='c' | ams='C')cflags=1;Coread();elseif(xms>=pix-6 && xms<=pix+85 && yms>=72 && yms<

22、;=83 && bms=1) | ams='l' | ams='L')cflags=1;Help();elseif(xms>=pix-6 && xms<=pix+85 && yms>=83 && yms<=94 && bms=1) | ams='q' | ams='Q' | ams=27)cflags=1;fclose(p);closegraph();farfree(Map);exit(1);elseif(bms!=0)cfla

23、gs=1;goto bss;/*结束菜单功能的实现*/*在笑脸按钮处单击时重新开始*/if(cflags!=0 && xms >=250-sizel-2 && yms >= 30-sizel-2 && xms<=250+sizel+2 && yms<=30+sizel+2 && bms=1 )goto bss;if(Eflags=0 && cflags!=0 && xms-pix>=0 && yms-piy >=0 &&am

24、p; xms<pix+x*size && yms<piy+y*size )/*111判断*/x1=(int)(xms-pix)/size);/*计算鼠标目前的按钮位置*/y1=(int)(yms-piy)/size);if(ams=-1 && bms=1 && pan1x1y1=0)/*单击鼠标左键*/if(k=0)/*k这里判断是否是第一次按下.0:不计时,1:开始计时*/gettime(&t1);k=1;if(panx1y1!=9)Draw1(x1,y1);Open(x,y);elseDead(sizel,x,y);k=0

25、;if(ams=-1 && bms=2 && pan1x1y1=0)/*单击鼠标右键*/delay(100);setcolor(10);circle(x1*size+pix+7,y1*size+piy+7,4);pan1x1y1=2;Have(sum,pix+20,30,x,y);elseif(ams=-1 && bms=2 && pan1x1y1=2)/*单击鼠标右键*/delay(100);Draw(x1*size+pix,y1*size+piy,size,size);pan1x1y1=0;Have(sum,pix+20,30

26、,x,y);/*相当于鼠标右击*/if(ams=-1 && bms=3 && pan1x1y1=1)/*相当于鼠标双击,有效性判断*/i=0;if(x1-1>=0 && y1-1>=0 && pan1x1-1y1-1=2) i+;if(y1-1>=0 && pan1x1y1-1=2)i+;if(x1+1<x && y1-1>=0 && pan1x1+1y1-1=2) i+;if(x1-1>=0 && pan1x1-1y1=2) i+

27、;if(x1+1<x && pan1x1+1y1=2) i+;if(x1-1>=0 && y1+1<y && pan1x1-1y1+1=2) i+;if(y1+1<y && pan1x1y1+1=2) i+;if(x1+1<x && y1+1<y && pan1x1+1y1+1=2) i+;if(i=panx1y1) /*有效*/if(x1-1>=0 && y1-1>=0 && pan1x1-1y1-1!=2) if(p

28、anx1-1y1-1!=9) Draw1(x1-1,y1-1);else Dead(sizel,x,y); k=0;if(y1-1>=0 && pan1x1y1-1!=2)if(panx1y1-1!=9)Draw1(x1,y1-1);else Dead(sizel,x,y);k=0;if(x1+1<x && y1-1>=0 && pan1x1+1y1-1!=2) if(panx1+1y1-1!=9) Draw1(x1+1,y1-1);else Dead(sizel,x,y);k=0;if(x1-1>=0 &&

29、; pan1x1-1y1!=2) if(panx1-1y1!=9) Draw1(x1-1,y1);else Dead(sizel,x,y);k=0;if(x1+1<x && pan1x1+1y1!=2) if(panx1+1y1!=9) Draw1(x1+1,y1);else Dead(sizel,x,y);k=0;if(x1-1>=0 && y1+1<y && pan1x1-1y1+1!=2) if(panx1-1y1+1!=9)Draw1(x1-1,y1+1);else Dead(sizel,x,y);k=0;if(y1+1

30、<y && pan1x1y1+1!=2)if(panx1y1+1!=9) Draw1(x1,y1+1);else Dead(sizel,x,y);k=0;if(x1+1<x && y1+1<y &&pan1x1+1y1+1!=2) if(panx1+1y1+1!=9) Draw1(x1+1,y1+1);else Dead(sizel,x,y);k=0;Open(x,y);/*胜利条件*/k1=0;for(i=0;i<x;i+)for(j=0;j<y;j+)if(pan1ij!=1) k1+;if(k1=sum)for

31、(i=0;i<x;i+)for(j=0;j<y;j+)if(pan1ij=0) setcolor(10);circle(i*size+pix+7,j*size+piy+7,4);Facedraw(250,30,sizel,3);if(x=9 && tt<co0) j=0;co0=tt;i=0;if(x=16 && tt<co1) j=1;co1=tt;i=0;if(x=30 && tt<co2) j=2;co2=tt;i=0;if(i=0)Draw(10,10,300,55);setcolor(4);outtextx

32、y(20,15,"You break the corse!");outtextxy(20,25,"Please input your name(0 - 19):");setfillstyle(1, 14);bar(20,35,200,50);for(i=0;i<19;i+)nameji=getch();if(nameji=8) i=i-2;if(nameji=13) nameji='0'break;nameji+1='0'setfillstyle(1, 14);bar(20,35,200,50);setcolor(1

33、);outtextxy(20,40,namej);if(p = fopen("score.dat", "w") = NULL)printf("The file cannot open!n");exit(1);fprintf(p,"%d %d %d,",co0,co1,co2);for(i=0;i<3;i+)fprintf(p,"%sn",namei);fclose(p);Coread();getch();goto bss;/*结束111的判断*/*下面是一些快捷功能键的定义*/if(ams

34、='q'|ams='Q'| ams=27 ) fclose(p);closegraph();farfree(Map);exit(1); /*退出主程序的唯一出口*/if(ams='c'|ams='C') goto bss; /*重来*/if(ams='h'|ams='H') Help();k=0; /*帮助文档*/if(ams='r'|ams='R') Coread();k=0; /*察看成绩*/getimage(xms,yms,xms+20,yms+20,Map);

35、Ddraw2(xms,yms);delay(10);/*结束鼠标循环读取的死循环*/*+主函数结束+*/*这个函数用于实现鼠标的初始化*/int Msinit()int recored;regs.x.ax=0;int86 (0x33, & regs, & regs);recored=regs.x.ax;if(recored=0)printf("Mouse not found or Mouse driver not installed.n");return 0;elsereturn recored;/*下面这个子程序是完成描绘一个按钮*/void Draw(i

36、nt x,int y,int sizex,int sizey)/* x, y为左上角坐标sizex,sizey为长和宽*/int sizx=sizex-1;int sizy=sizey-1;setcolor(15);/*这里最好用白色*/line(x,y,x+sizx-1,y);line(x,y+1,x+sizx-2,y+1);line(x,y,x,y+sizy-1);line(x+1,y,x+1,y+sizy-2);setcolor(8);/*这里最好用深灰色*/line(x+1,y+sizy,x+sizx,y+sizy);line(x+2,y+sizy-1,x+sizx,y+sizy-1)

37、;line(x+sizx-1,y+1,x+sizx-1,y+sizy);line(x+sizx,y+2,x+sizx,y+sizy);setcolor(7);/*这里最好用灰色*/putpixel(x,y+sizy,3);putpixel(x+1,y+sizy-1,3);putpixel(x+sizx,y,3);putpixel(x+sizx-1,y+1,3);setfillstyle(1, 7);/*这里最好用灰色,设置填充模式*/bar(x+2,y+2,x+sizx-2,y+sizy-2);/*下面是一些画图程序*/*形参x,y笑脸的中心坐标,sizel脸的大小(半径),k为要描述的脸型,

38、1:哭、2:平常、3:笑*/void Facedraw(int x,int y,int sizel,int k)Draw(x-sizel-3,y-sizel-3,2*(sizel+4),2*(sizel+4);/*画一个按钮*/setcolor(14);setfillstyle(1, 14);pieslice(x, y, 0, 360, sizel);/*画一个黄色的圆面*/setfillstyle(1, 0);setcolor(0);if(k=1)/*失败*/line(x-sizel*7/20,y-sizel*7/20,x-sizel*3/20,y-sizel*3/20);/*画两个差表示眼

39、睛*/line(x-sizel*7/20,y-sizel*3/20,x-sizel*3/20,y-sizel*7/20);line(x+sizel*3/20,y-sizel*7/20,x+sizel*7/20,y-sizel*3/20);line(x+sizel*3/20,y-sizel*3/20,x+sizel*7/20,y-sizel*7/20);arc(x,y+sizel,20,160, sizel/2);if(k=2)/*平常*/bar(x-sizel*7/20,y-sizel*7/20,x-sizel*3/20,y-sizel*3/20);bar(x+sizel*3/20,y-siz

40、el*7/20,x+sizel*7/20,y-sizel*3/20);arc(x,y,200,340, sizel*3/4);if(k=3)/*成功*/bar(x-sizel/2,y-sizel/2,x-sizel*3/20,y-sizel*3/20);bar(x+sizel*3/20,y-sizel/2,x+sizel/2,y-sizel*3/20);line(x-sizel*3/20,y-sizel/2,x+sizel*3/20,y-sizel/2);line(x-sizel/2,y-sizel*5/20,x-sizel,y);line(x+sizel/2,y-sizel*5/20,x+s

41、izel,y);arc(x,y,200,340, sizel*3/4); /*嘴巴*/*死亡后的处理程序*/*x,y要判断的点的坐标,sizel为脸的大小*/void Dead(int sizel,int x,int y)int i,j;/*循环变量*/setcolor(4);for(i=0;i<x;i+)for(j=0;j<y;j+)if(panij=9)circle(i*size+pix+7,j*size+piy+7,4);/*用红色的圆圈标记有雷的方块*/Facedraw(250,30,sizel,1);Eflags=1;/*下面的函数用于实现设置鼠标的移动范围*/*xmax

42、,ymax为左上角的坐标x,y矩阵的大小*/void Setmouse(int xmax,int ymax,int x,int y)int left,right,top,buttom;/*这四个变量用于确定移动的左上角和右下角*/left=xmax;right=x;top=ymax;buttom=y;regs.x.ax=7;regs.x.cx=left;regs.x.dx=right;int86(0x33,& regs,& regs);regs.x.ax=8;regs.x.cx=top;regs.x.dx=buttom;int86(0x33,& regs,& r

43、egs);/*下面这个函数用于实现鼠标的读取*/*xp,yp,bup分别为鼠标的位置和按键情况,t1,k是时间现实参数,t1为开始时间,k为开始标记*/int Msread(int *xp,int *yp,int *bup,struct time t1,int k)int x0=*xp,y0=*yp,bu0=*bup;int xnew,ynew,ch;int tt1=0;/*用于记录时间差*/struct time t2;char ttt4="000"doif(kbhit() return getch();regs.x.ax=3;int86(0x33,& regs,

44、& regs);xnew=regs.x.cx;ynew=regs.x.dx;*bup=regs.x.bx;/*下面用于显示时间*/if(k=1)/*如果已经开始就计算时间差*/gettime(&t2);tt1=(t2.ti_hour- t1.ti_hour)*3600 + (t2.ti_min- t1.ti_min)*60 + t2.ti_sec - t1.ti_sec;/*有待改进*/if(tt1<=999 && tt!=tt1)/*当时间差有改变时,才显示*/tt=tt1;ttt0=(tt-tt%100)/100+48;ttt1=(tt%100-tt%

45、10)/10 +48;ttt2=tt%10+48;setfillstyle(1, 0);bar(460-pix,25,490-pix,40);setcolor(4);outtextxy(465-pix,30,ttt);while(xnew=x0&&ynew=y0&&*bup=bu0);*xp=xnew;*yp=ynew;return -1;/*键盘无输入时返回-1,其次返回键盘值*/void Draw1(int x,int y)/*这个函数用于在x,y的位置描绘开后的情况*/setfillstyle(1, 7);bar(x*size+pix,y*size+piy

46、,x*size+size+pix-1,y*size+size+piy-1);/*在四个角上画上点标记*/*putpixel(x*size+pix,y*size+piy,8);putpixel(x*size+size+pix-1,y*size+size+piy-1,8);putpixel(x*size+pix,y*size+size+piy-1,8);putpixel(x*size+size+pix-1,y*size+piy,8);*/setcolor(8);setlinestyle(1, 0, 1);rectangle(x*size+pix,y*size+piy,x*size+size+pix

47、-1,y*size+size+piy-1);setlinestyle(0, 0, 1);if(panxy!=0)/*没有雷的话不做显示*/b0=panxy+48;if(panxy!=7)/*防止字的颜色和背景颜色相同*/setcolor(panxy);else setcolor(9);outtextxy (x*size+pix+3,y*size+piy+3,b);pan1xy=1;/*在pan1中标记这一点的挖雷情况*/*自开函数*/int Open(int x,int y)/*函数中引入pan2的目的是为了增加自开的效率,但是还是有不足之处*/int i,j,k;int pan23016=0

48、;/*pan2,临时纪录盘面的自开情况,0没有自开过,1:已经自开过(30 这里有危险的技术性问题!)*/for(;)k=0;/*是一个标记变量*/for(i=0;i<x;i+)for(j=0;j<y;j+)if (panij=0 && pan1ij=1 && pan2ij=0)/*如果满足下面条件,没有雷,已经打开,没有自开过就继续*/pan2ij=1;/*标记自开过*/k=k+1;/*开周围的点*/if(i-1>=0 && j-1>=0 && pan1i-1j-1=0) Draw1(i-1,j-1);

49、/*左上方*/if(j-1>=0 && pan1ij-1=0) Draw1(i,j-1); /*上方*/if(i+1<x && j-1>=0 && pan1i+1j-1=0) Draw1(i+1,j-1); /*右上方*/if(i-1>=0 && pan1i-1j=0) Draw1(i-1,j); /*左方*/if(i+1<x && pan1i+1j=0) Draw1(i+1,j); /*右方*/if(i-1>=0 && j+1<y && pan1i-1j+1=0) Draw1(i-1,j+1); /*左下方*/if(j+1<y && pan1ij+1=0) Draw1(i,j+1); /*下方*/if(i+1<x && j+1<y && pan1i+1j+1=0) Draw1(i+1,j+1); /*右下方*/if(k=0) return 0;/*没有新的自开点时退出*/float Random()/*随即数生成函数,加入了时间变量目的在于加强它的随机性*/float aa;int i,j;str

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论