搜档网
当前位置:搜档网 › C语言扫雷游戏源代码

C语言扫雷游戏源代码

C语言扫雷游戏源代码
C语言扫雷游戏源代码

/*

模拟扫雷游戏

*/

#include

#include

#include

#include

#include

#include

#include

union REGS regs;

int size=15;/*用于表示每个方块的大小(正方形的边长)*/

int pix,piy=50;/*pix,piy是矩阵的偏移量*/

char b[2]="1";/*用于显示方格周围的雷的个数*/

int pan[30][16];/*用于记录盘面的情况:0:没有、9:有雷、1~8:周围雷的个数*/

int pan1[30][16];/*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);

void 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=VGA;/*图形模式初始化的变量*/

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 t1={0,0,0,0}; /*时间结构体,头文件已定义*/

int co[3]; /*暂时纪录历史纪录*/

void far *Map; /*用于保存鼠标图片*/

char name[3][20]; /*名字字符串,用于记录名字*/

FILE * p; /*文件指针用于文件操作*/

Msinit(); /*鼠标初始化*/

/*registerbgidriver(EGAVGA_driver);*/

initgraph(&devices,&mode,"C:\\tc"); /*图形模式初始化*/

/*为图片指针分配内存*/

if((Map=farmalloc(imagesize(0,0,20,20)))==NULL)/*图片的大小是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 open!\n");

printf("Presss any key to exit!\n");

getch();

exit(1);

}

/*写入初始内容*/

fprintf(p,"%d %d %d,%s\n%s\n%s\n",999,999,999,"xiajia","xiajia","xiajia"); fclose(p);

}

/*暂时读出历史纪录。并用co[3]纪录*/

fscanf(p,"%d %d %d,",&co[0],&co[1],&co[2]);

for(i=0;i<3;i++)

fscanf(p,"%s\n",name[i]);

fclose(p);

Setmouse(1,1,615,460); /*设置鼠标的活动范围*/

pix=250-x*size/2; /*计算地雷按钮矩阵的左边*/

bss: b[0]='1'; /*游戏开始和重来的切入点*/

flags=0; /*测试中这个变量好像没有作用,但是为了逻辑的完整性暂时保留*/ k=0;

Eflags=0;

tt=0;

cleardevice();/*清屏*/

setbkcolor(LIGHTCYAN);

for(i=0;i<30;i++) /*盘面初始化*/

for(j=0;j<16;j++)

{

pan[i][j]=0;

pan1[i][j]=0;

}

for(;;) /*用于生成雷的盘面情况*/

{

i=(int)(x*Random());

j=(int)(y*Random());

if(pan[i][j]==0)

{

pan[i][j]=9;

k=k+1;

}

if(k==sum) break;

}

for(i=0;i

for(j=0;j

{

if(pan[i][j]==0)/*只有没有雷的才需要处理*/

{

if(i-1>=0 && j-1>=0 && pan[i-1][j-1]==9) pan[i][j]++;

if(j-1>=0 && pan[i][j-1]==9) pan[i][j]++;

if(i+1=0 && pan[i+1][j-1]==9) pan[i][j]++;

if(i-1>=0 && pan[i-1][j]==9) pan[i][j]++;

if(i+1

if(i-1>=0 && j+1

if(j+1

if(i+1

}

}

if(sum==10)/*画底座*/

{

Draw(170,1,162,200);

setcolor(1);

outtextxy(175,5,"Game( )");

setcolor(4);

outtextxy(175,5," G");

}/*小*/

else

if(sum==40)

{

Draw(115,1,272,307);

setcolor(1);

outtextxy(120,5,"Game(G)");

setcolor(4);

outtextxy(120,5," G");

}/*中*/

else

if(sum==99)

{

Draw(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,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

for(j=0;j

{

Draw(i*size+pix,j*size+piy,size,size);

}

Have(sum,pix+20,30,x,y);/*各项的初始显示*/

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>=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");

setcolor(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);

outtextxy(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,"Quit(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=='r' || ams=='R'))/*下面依次响应菜单中各项*/

{

cflags=1;

goto bss;

}

else

if((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;

}

else

if((xms>=pix-6 && xms<=pix+85 && 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;

}

else

if((xms>=pix-6 && xms<=pix+85 && yms>=50 && yms<=61 && bms==1) || ams=='h' || ams=='H')

{

cflags=1;

x=30;

y=16;

sum=99;

pix=250-x*size/2+25;

goto bss;

}

else

if((xms>=pix-6 && xms<=pix+85 && yms>=61 && yms<=72 && bms==1) || ams=='c' || ams=='C')

{

cflags=1;

Coread();

}

else

if((xms>=pix-6 && xms<=pix+85 && yms>=72 && yms<=83 && bms==1) || ams=='l' || ams=='L')

{

cflags=1;

Help();

}

else

if((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);

}

else

if(bms!=0)

{

cflags=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 && xms

{

x1=(int)((xms-pix)/size);/*计算鼠标目前的按钮位置*/

y1=(int)((yms-piy)/size);

if(ams==-1 && bms==1 && pan1[x1][y1]==0)/*单击鼠标左键*/

{

if(k==0)/*k这里判断是否是第一次按下.0:不计时,1:开始计时*/

{

gettime(&t1);

k=1;

}

if(pan[x1][y1]!=9)

{

Draw1(x1,y1);

Open(x,y);

}

else

{

Dead(sizel,x,y);

k=0;

}

}

if(ams==-1 && bms==2 && pan1[x1][y1]==0)/*单击鼠标右键*/

{

delay(100);

setcolor(10);

circle(x1*size+pix+7,y1*size+piy+7,4);

pan1[x1][y1]=2;

Have(sum,pix+20,30,x,y);

}

else

if(ams==-1 && bms==2 && pan1[x1][y1]==2)/*单击鼠标右键*/ {

delay(100);

Draw(x1*size+pix,y1*size+piy,size,size);

pan1[x1][y1]=0;

Have(sum,pix+20,30,x,y);

}/*相当于鼠标右击*/

if(ams==-1 && bms==3 && pan1[x1][y1]==1)

{/*相当于鼠标双击,有效性判断*/

i=0;

if(x1-1>=0 && y1-1>=0 && pan1[x1-1][y1-1]==2) i++;

if(y1-1>=0 && pan1[x1][y1-1]==2)i++;

if(x1+1=0 && pan1[x1+1][y1-1]==2) i++;

if(x1-1>=0 && pan1[x1-1][y1]==2) i++;

if(x1+1

if(x1-1>=0 && y1+1

if(y1+1

if(x1+1

if(i==pan[x1][y1]) /*有效*/

{

if(x1-1>=0 && y1-1>=0 && pan1[x1-1][y1-1]!=2)

{

if(pan[x1-1][y1-1]!=9)

Draw1(x1-1,y1-1);

else

{

Dead(sizel,x,y);

k=0;

}

}

if(y1-1>=0 && pan1[x1][y1-1]!=2)

{

if(pan[x1][y1-1]!=9)

Draw1(x1,y1-1);

else

Dead(sizel,x,y);

k=0;

}

}

if(x1+1=0 && pan1[x1+1][y1-1]!=2) {

if(pan[x1+1][y1-1]!=9)

Draw1(x1+1,y1-1);

else

{

Dead(sizel,x,y);

k=0;

}

}

if(x1-1>=0 && pan1[x1-1][y1]!=2)

{

if(pan[x1-1][y1]!=9)

Draw1(x1-1,y1);

else

{

Dead(sizel,x,y);

k=0;

}

}

if(x1+1

{

if(pan[x1+1][y1]!=9)

Draw1(x1+1,y1);

else

{

Dead(sizel,x,y);

k=0;

}

}

if(x1-1>=0 && y1+1

if(pan[x1-1][y1+1]!=9)

Draw1(x1-1,y1+1);

else

{

Dead(sizel,x,y);

k=0;

}

if(y1+1

{

if(pan[x1][y1+1]!=9)

Draw1(x1,y1+1);

else

{

Dead(sizel,x,y);

k=0;

}

}

if(x1+1

{

if(pan[x1+1][y1+1]!=9)

Draw1(x1+1,y1+1);

else

{

Dead(sizel,x,y);

k=0;

}

}

Open(x,y);

}

}

/*胜利条件*/

k1=0;

for(i=0;i

for(j=0;j

if(pan1[i][j]!=1) k1++;

if(k1==sum)

{

for(i=0;i

for(j=0;j

if(pan1[i][j]==0)

{

setcolor(10);circle(i*size+pix+7,j*size+piy+7,4); }

Facedraw(250,30,sizel,3);

if(x==9 && tt

if(x==16 && tt

if(x==30 && tt

if(i==0)

{

Draw(10,10,300,55);

setcolor(4);

outtextxy(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++)

{

name[j][i]=getch();

if(name[j][i]==8) i=i-2;

if(name[j][i]==13) {name[j][i]='\0';break;}

name[j][i+1]='\0';

setfillstyle(1, 14);

bar(20,35,200,50);

setcolor(1);

outtextxy(20,40,name[j]);

}

if((p = fopen("score.dat", "w")) == NULL)

{

printf("The file cannot open!\n");

exit(1);

}

fprintf(p,"%d %d %d,",co[0],co[1],co[2]);

for(i=0;i<3;i++)

fprintf(p,"%s\n",name[i]);

fclose(p);

Coread();

}

getch();

goto bss;

}

}/*结束111的判断*/

/*下面是一些快捷功能键的定义*/

if(ams=='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);

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;

}

else

return recored;

}

/*下面这个子程序是完成描绘一个按钮*/

void Draw(int 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);

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为要描述的脸型,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);/*画两个差表示眼睛*/ 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-sizel*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+sizel,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

for(j=0;j

if(pan[i][j]==9)

{

circle(i*size+pix+7,j*size+piy+7,4);

}/*用红色的圆圈标记有雷的方块*/

Facedraw(250,30,sizel,1);

Eflags=1;

}

/*下面的函数用于实现设置鼠标的移动范围*/

/*xmax,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,& regs);

}

/*下面这个函数用于实现鼠标的读取*/

/*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 ttt[4]="000";

do

{

if(kbhit()) return getch();

regs.x.ax=3;

int86(0x33,& regs,& 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;

ttt[0]=(tt-tt%100)/100+48;

ttt[1]=(tt%100-tt%10)/10 +48;

ttt[2]=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,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-1,y*size+size+piy-1);

setlinestyle(0, 0, 1);

if(pan[x][y]!=0)/*没有雷的话不做显示*/

{

b[0]=pan[x][y]+48;

if(pan[x][y]!=7)/*防止字的颜色和背景颜色相同*/

setcolor(pan[x][y]);

else setcolor(9);

outtextxy (x*size+pix+3,y*size+piy+3,b);

}

pan1[x][y]=1;/*在pan1[][]中标记这一点的挖雷情况*/

}

/*自开函数*/

int Open(int x,int y)/*函数中引入pan2[][]的目的是为了增加自开的效率,但是还是有不足之处*/

{

int i,j,k;

int pan2[30][16]={0};/*pan2[][],临时纪录盘面的自开情况,0没有自开过,1:已经自开过(30 这里有危险的技术性问题!!!)*/

for(;;)

{

k=0;/*是一个标记变量*/

for(i=0;i

for(j=0;j

{

if (pan[i][j]==0 && pan1[i][j]==1 && pan2[i][j]==0)/*如果满足下面条件,没有雷,已经打开,没有自开过就继续*/

{

pan2[i][j]=1;/*标记自开过*/

k=k+1;

/*开周围的点*/

if(i-1>=0 && j-1>=0 && pan1[i-1][j-1]==0) Draw1(i-1,j-1); /*左上方*/

if(j-1>=0 && pan1[i][j-1]==0) Draw1(i,j-1); /*上方*/

if(i+1=0 && pan1[i+1][j-1]==0) Draw1(i+1,j-1); /*右上方*/

if(i-1>=0 && pan1[i-1][j]==0) Draw1(i-1,j); /*左方*/

if(i+1

if(i-1>=0 && j+1

if(j+1

if(i+1

}

}

if(k==0) return 0;/*没有新的自开点时退出*/

}

}

float Random()/*随即数生成函数,加入了时间变量目的在于加强它的随机性*/

{float aa;

int i,j;

struct time t;

gettime(&t);

i=t.ti_min+t.ti_hour+t.ti_sec+t.ti_hund;

for(j=0;j

rand();

aa=rand()/32767.0;

return aa;/*返回产生的随机数(0-1)*/

}

/*下面是一个显示剩余雷数目的函数*/

void Have(int sum,int x,int y,int xx,int yy)/*游戏中雷的总数目不能多余99颗,sum 为雷的总数目,x,y为显示的地点*/

{

int i,j,k=0;

char a[3]="1";

for(i=0;i

for(j=0;j

{if (pan1[i][j]==2) k++;}/*统计一共标记了多少*/

k=sum-k;/*剩下了多少*/

if(k<0) k=0;

a[0]=(k-(k%10))/10+48;/*字符转换*/

a[1]=k%10+48;

setfillstyle(1, 0);

bar(x-5,y-5,x+20,y+10);/*在原点涂黑*/

setcolor(4);

outtextxy(x,y,a);/*显示数目*/

}

/*下面是帮助函数*/

void Help()

{

Draw(40,1,560,160);

setcolor(1);

outtextxy(300,10,"Help");

setcolor(4);

outtextxy(50,30,"Welcome to play this game. The mouse is supplied.");

outtextxy(50,40,"Please press left button of the mouse where there is no boom."); outtextxy(50,50,"If you think there is a boom please press right button.");

outtextxy(50,60,"You can choose the size of the game with press the right buttons.");

Java语言 扫雷游戏完整源代码

import javax.swing.ImageIcon; public class Block { String name; //名字,比如"雷"或数字int aroundMineNumber; //周围雷的数目 ImageIcon mineIcon; //雷的图标 boolean isMine=false; //是否是雷 boolean isMark=false; //是否被标记 boolean isOpen=false; //是否被挖开 public void setName(String name) { https://www.sodocs.net/doc/49662805.html,=name; } public void setAroundMineNumber(int n) { aroundMineNumber=n; } public int getAroundMineNumber() { return aroundMineNumber; } public String getName() { return name; } public boolean isMine() { return isMine; } public void setIsMine(boolean b) { isMine=b; } public void setMineIcon(ImageIcon icon){ mineIcon=icon; } public ImageIcon getMineicon(){ return mineIcon; }

public boolean getIsOpen() { return isOpen; } public void setIsOpen(boolean p) { isOpen=p; } public boolean getIsMark() { return isMark; } public void setIsMark(boolean m) { isMark=m; } } import java.util.*; import javax.swing.*; public class LayMines{ ImageIcon mineIcon; LayMines() { mineIcon=new ImageIcon("mine.gif"); } public void layMinesForBlock(Block block[][],int mineCount){ int row=block.length; int column=block[0].length; LinkedList list=new LinkedList(); for(int i=0;i0){ int size=list.size(); // list返回节点的个数 int randomIndex=(int)(Math.random()*size);

Java扫雷游戏源代码

import java.awt.BorderLayout; import java.awt.Container; import java.awt.Font; import java.awt.GridLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JPanel; import javax.swing.Timer; public class ScanLei1 extends JFrame implements ActionListener{ private static final long serialVersionUID = 1L; private Container contentPane; private JButton btn; private JButton[] btns; private JLabel b1; private JLabel b2; private JLabel b3; private Timer timer; private int row=9; private int col=9; private int bon=10; private int[][] a; private int b; private int[] a1; private JPanel p,p1,p2,p3; public ScanLei1(String title){ super(title); contentPane=getContentPane(); setSize(297,377); this.setBounds(400, 100, 400, 500); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); timer =new Timer(1000,(ActionListener) this); a = new int[row+2][col+2]; initGUI(); } public void initGUI(){ p3=new JPanel();

扫雷游戏设计代码(VB完善版)

扫雷游戏VB设计实现最终界面如下:

显然只需完成三个窗体的设计即可,具体设计界面和代码如下: 一、主窗体(form10)设计界面:

主窗体(form10)的代码: Dim d(11, 11) As Integer Dim k As Integer Dim v(100) As Integer '定义全局变量' Private Sub Command1_Click(Index As Integer) Timer1.Enabled = True '当点击任意一个命令按钮时(即开始游戏),则启动计时器' i = Index \ 10 + 1 j = Index Mod 10 + 1 '将二维数组的元素与命令按钮一一对应' If d(i, j) = 1 Then '判断是否点到地雷' Timer1.Enabled = False '关闭计时器,游戏结束' For i = 1 To 10 For j = 1 To 10 n = 10 * (i - 1) m = j - 1 If d(i, j) = 1 Then

Command1.Item(m + n).Picture = LoadPicture(App.Path & "\2.jpg") '在按钮上显示地雷图片' End If Form1.Show '弹出子窗体1(判断输赢)' Next j Next i Else If v(Index) = Index + 1 Then '判断是否插上红旗或是问号图片' Command1.Item(Index).Picture = LoadPicture() '清除图片' Command1.Item(Index).Caption = f(i, j) '调用函数,显示周围地雷数' Command1.Item(Index).Enabled = False '将按钮设为不可用' Label7.Caption = Val(Label7.Caption) + 1 v(Index) = 0 End If h = s(i, j) '调用函数,显示周围的情况(边界)' For Y = 0 To 99 If v(Y) = Y + 1 Then Command1.Item(Y).Enabled = True '如果是按钮插上了红旗则将按钮设置为可用' End If Next Y End If

C语言扫雷源代码

C语言扫雷源代码.txt如果背叛是一种勇气,那么接受背叛则需要更大的勇气。爱情是块砖, 婚姻是座山。砖不在多,有一块就灵;山不在高,守一生就行。 #include #include #include #include /*鼠标信息宏定义*/ #define WAITING 0xff00 #define LEFTPRESS 0xff01 #define LEFTCLICK 0xff10 #define LEFTDRAG 0xff19 #define RIGHTPRESS 0xff02 #define RIGHTCLICK 0xff20 #define RIGHTDRAG 0xff2a #define MIDDLEPRESS 0xff04 #define MIDDLECLICK 0xff40 #define MIDDLEDRAG 0xff4c #define MOUSEMOVE 0xff08 struct { int num;/*格子当前处于什么状态,1有雷,0已经显示过数字或者空白格子*/ int roundnum;/*统计格子周围有多少雷*/ int flag;/*右键按下显示红旗的标志,0没有红旗标志,1有红旗标志*/ }Mine[10][10]; int gameAGAIN=0;/*是否重来的变量*/ int gamePLAY=0;/*是否是第一次玩游戏的标志*/ int mineNUM;/*统计处理过的格子数*/ char randmineNUM[3];/*显示数字的字符串*/ int Keystate; int MouseExist; int MouseButton; int MouseX; int MouseY; int up[16][16],down[16][16],mouse_draw[16][16],pixel_save[16][16]; void MouseMath()/*计算鼠标的样子*/ {int i,j,jj,k; long UpNum[16]={ 0x3fff,0x1fff,0x0fff,0x07ff, 0x03ff,0x01ff,0x00ff,0x007f, 0x003f,0x00ff,0x01ff,0x10ff,

扫雷游戏Java源代码详解

扫雷游戏Java源代码 import java.awt.BorderLayout; import java.awt.Container; import java.awt.Font; import java.awt.GridLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JPanel; import javax.swing.Timer; public class ScanLei1 extends JFrame implements ActionListener{ private static final long serialVersionUID = 1L; private Container contentPane; private JButton btn; private JButton[] btns; private JLabel b1; private JLabel b2; private JLabel b3; private Timer timer; private int row=9; private int col=9; private int bon=10; private int[][] a; private int b; private int[] a1; private JPanel p,p1,p2,p3; public ScanLei1(String title){ super(title); contentPane=getContentPane();

扫雷游戏的设计与开发1

扫雷游戏的设计与开发 摘要 本论文研究的是以Visual Basic 6.0为开发环境,设计并开发一款扫雷游戏,其功能类似于Windows操作系统自带的扫雷游戏。论文首先介绍了制作游戏的整体思路及整个游戏设计的流程规划,然后介绍了雷区的布置及地雷随机产生的实现方法;重点介绍了在游戏过程中各事件的处理,其中又以鼠标事件和清除未靠近地雷区方块这两方面最为最要,鼠标事件是利用鼠标所发出的信息了解使用者的意图,进而做出相对应的动作,而清除未靠近地雷区方块由于引进了“递归”这个概念而使其简单化。 本次设计只是完成了扫雷游戏的基本功能,在细节方面仍有待以后完善。 关键词:扫雷;Visual Basic 6.0;事件;递归

The Design and Development of Mine Game Abstract What my thesis research for is basic on the develop environment of Visual Basic 6.0 , design and develop a mine game,its function is similar to the mine games of the Windows Operating System .The thesis has introduced the layout of mined areas and the method of how to create the mines at random. It use vairies of components in Visual Basic 6.0 and the combination of some simple calculations; the thesis lays emphasis on introducing the processing of each event in the game. Among these events ,the mouse event and the event of clearance of the area which isn’t close to the mine field are much more important.The theory of mouse event is that the intention of user is learned by the information sent out by the mouse and then the program runs according to the information .The other event is simplified by the introduction of the concept of recursion. This design has been completed the basic function of mine game. The details still need to be improved. Key words: Mine game, Visual Basic 6.0, Affairs, Recursion

简版扫雷代码

#include #include #include #define MAX 100 //最大范围为100x100 struct place{ int show;//显示状态(-1为不显示,0为显示@,1为显示status ) char status;//身份(数字为周围8位地雷数,*为地雷,#号为边界标志) }; /*显示函数*/ void print_all(place mine_area[][MAX+2]){ for(int i=0;i<=MAX+1;i++){ for(int j=0;j<=MAX+1;j++){ if(mine_area[i][j].status<=8) printf("%d",mine_area[i][j].status+48); else if(mine_area[i][j].status=='#') printf("#"); else if(mine_area[i][j].status=='*') printf("*"); printf(":%d ",mine_area[i][j].show); } printf("\n"); } } void print_all(place mine_area[][MAX+2],int length,int width){ for(int i=0;i

扫雷游戏程序设计课程设计报告

课 程 设 计 扫雷游戏程序设计 2013 年 11 月 5 日 设计题目 学 号专业班级 学生姓名 指导教师

合肥工业大学课程设计任务书

一. 设计任务 (1)鼠标左击排雷,右击插小旗,打问号; (2)方格里面的数字表示方格周围的雷数; (3)能够显示未标记雷数和游戏用时; (4)雷区上面的小脸可以变化,显示微笑,惊讶,痛苦,胜利。在任何情况下单击小脸可以重新开始游戏; (5)可进行游戏难度的设定:包括预定义的难度级别(雷区行数,列数和雷数),和自行定义雷区行数,列数和雷数的功能; (6)排行榜功能,扫雷成功时候,根据游戏用时更新排行榜。 二. 具体设计 (一)、设计思路 扫雷游戏是很经典也很有趣的一款游戏,这次的游戏程序设计要求设计出功能与原游戏相近的一款游戏,首先定义变量和类要画出游戏方格以及位图,设计游戏等级,等级越高方格越多雷数也越多;然后设置随机布雷以保证每次重新开始游戏都有不同的雷区地图;另外定义鼠标左击扫雷,左击标记周围埋雷情况,右击奇数次排雷偶数次取消上次排雷,以及扫雷第一次左击不能扫到雷。

(二)、设计表示: 1、鼠标左击排雷,右击插小旗,打问号; 2、方格里面的数字表示方格周围的雷数; 3、能够显示未标记雷数和游戏用时; 4、雷区上面的小脸可以变化,显示微笑,惊讶,痛苦,胜利。在任何情况下单击小脸可以重新开始游戏; 5、可进行游戏难度的设定:包括预定义的难度级别(雷区行数,列数和雷数); 6、任何时候开始游戏第一次点击不会扫到雷。 由于时间等原因未完成功能: 排行榜和自行定义雷区行数,列数和雷数功能。 (四)、详细设计 1、添加位图 前十二幅是在雷区的,后四幅是按钮。为了便于加载,必须各自保证其连续性。 分别表示游戏进行的状态、结果胜利或触雷。

扫雷算法+c#实现代码

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Drawing; namespace MySweep { public class MapDraw { #region 私有字段 //定义扫雷地图的左上角坐标 private Point _leftTop = new Point(30, 30); //定义每个格子的宽度和高度 private int _rowHeight = 23; private int _colWidth = 23; //绘制地图背景 private Bitmap _bmgBg = new Bitmap("Images/背景.jpg"); //绘制地图格子 private Bitmap _bmgPiece = new Bitmap("Images/8.jpg"); #endregion #region 公有屬性 public Point _LeftTop { get { return _leftTop; } set { _leftTop = value; } } public int _RowHeight { get { return _rowHeight; } set { _rowHeight = value; } } public int _ColWidth { get { return _colWidth; } set { _colWidth = value; } } #endregion //定义类成员方法绘制扫雷地图 public void DrawMap(Graphics g)

VB做扫雷游戏

编号 南京航空航天大学 毕业论文 题目用VB实现一个简单的游戏 学生姓名 学号 学院 专业 班级 指导教师

南京航空航天大学 本科毕业设计(论文)诚信承诺书本人郑重声明:所呈交的毕业设计(论文)(题目:)是本人在导师的指导下独立进行研究所取得的成果。尽本人所知,除了毕业设计(论文)中特别加以标注引用的内容外,本毕业设计(论文)不包含任何其他个人或集体已经发表或撰写的成果作品。 作者签名:年月日 (学号):

用VB实现一个简单的游戏 摘要 当前,随着计算机应用及网络的的深入普及,越来越多的政府部门、厂矿企业、学校等单位及个人都拥有了自己的计算机,计算机不仅在工作方面给人们以很大的帮助,还给人们带来了多种的娱乐享受.,操作系统自带的游戏也起到了很大的娱乐作用,而且它的开发成本小,所以小游戏的开发在这种形势下就应运而生,它的开发主要采用VC++ ,VB 等编程语言. 本设计采用VB编写,VB一直以来被认为有以下优缺点:优点是上手快、开发效率高;缺点是能力有限,运行效率低.这正是有些软件把VB做为首选语言,而有些软件肯定不会用VB做的原因.而很多VC,DELPHI的程序员都认为VB里搞开发不自由.的确,简单和功能强大这两者本身就是一对矛盾. 扫雷游戏是操作系统中的一个主要的益智类游戏. 用户对鼠标进行操作,单击鼠标左键为踩雷,单击鼠标左键在标记,疑问,空白三种状态中循环,同时单击鼠标左右键为踩单击点在内的周围九格内所有没有标记为已标记的所有格子.同时程序从你单击第一次时开始计时,到胜利或引爆地雷终结.结束后单击开始按钮重新开始游戏.这款游戏实现了开发人类大脑思维的目的. 关键词VB,扫雷游戏

C语言扫雷游戏源代码

/* 模拟扫雷游戏 */ #include #include #include #include #include #include #include union REGS regs; int size=15;/*用于表示每个方块的大小(正方形的边长)*/ int pix,piy=50;/*pix,piy是矩阵的偏移量*/ char b[2]="1";/*用于显示方格周围的雷的个数*/ int pan[30][16];/*用于记录盘面的情况:0:没有、9:有雷、1~8:周围雷的个数*/ int pan1[30][16];/*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); void 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=VGA;/*图形模式初始化的变量*/ char ams; /*鼠标操作中的标志变量*/ int xms,yms,bms; /*鼠标的状态变量*/ int i,j,k,k1=0; /*i,j,k是循环变量*/

c语言扫雷程序代码

#include #include #include #include #define Map_list 6 #define Map_line 6 void map_printf(int x,int y,int b[][Map_list]) { int i,j; for(i=0;i0&&b[i][j]<9) printf(" %d",b[i][j]); } printf("\n"); } } void Move(int x,int y) { HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE); COORD pos= {x, y}; SetConsoleCursorPosition(hOut, pos); } int kb_cursor() { int a=getch(); char input[2]; if(a<0) { input[0]=a; input[1]=getch(); } else {

input[1]=a; } return input[1]; } void HideCursor() { CONSOLE_CURSOR_INFO cursor_info = {1, 0}; SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info); } void printf_0(int b[][Map_list],int x,int y) { int i,j,n; if(x==0&&y==0) { n=0; for(i=0;i<2;i++) for(j=0;j<2;j++) if(b[x+i][y+j]==11) n++; if(n==0) { for(i=0;i<2;i++) for(j=0;j<2;j++) { if(b[x+i][x+j]==10) { b[x+i][y+j]=0; printf_0(b,x+i,y+j); } } } else b[x][y]=n; } else if(x==0&&y0) { n=0; for(i=0;i<2;i++) for(j=-1;j<2;j++) if(b[x+i][y+j]==11) n++; if(n!=0) b[x][y]=n; else for(i=0;i<2;i++)

用C#写的扫雷程序源代码

初学C#一周,老师布置了个用C#编写仿Windows扫雷游戏的作业,我用了三天才弄出来,分享出来自我满足一下。程序是用vs 2008 控制台应用程序编的。界面有点粗糙,基本的功能倒是实现了。 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace saolei { class Program { //说明方向键控制方向,空格键显示,按R标记地雷 static int rl = 0; //rl横坐标 static int ud = 0; //ud纵坐标 static int level = 0; //游戏难度 static int Win = 0; //根据难度赋值,用来判断是否完成游戏 static string[,] LendMine = new string[9, 9];//二维数组表示游戏界面,横纵各9格 static string[,] LendMine2 = new string[16, 16];//横纵各16格 static Random rnd = new Random(); static bool b = true; static void Main(string[] args) { Console.Write("请选择难度(1简单,2中级):"); level = int.Parse(Console.ReadLine()); switch (level) { case 1: Level1(); Win = 71; break; case 2: Level2(); Win = 216; break; default: break; } #region绘制界面 switch (level) { case 1: for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { Console.Write("H"); } Console.WriteLine(); } break; case 2:

扫雷游戏的功能特点开始

本文从分析Windows扫雷游戏的功能特点开始,应用面向对象的可视化编程语言Visual C++给出了个功能模块的具体实现方法,并提供了编写小游戏程序的一般方法和Visual C++的一些使用技巧。 首先分析扫雷的最基本功能。 点击鼠标左键于未知区域,如果未知区域有雷,游戏停止,显示所有的地雷。如果没雷,则显示周围雷数,如果周围没雷,则再查看周围八个区域是否有雷直到有雷为止并显示,这其实是一个递归过程。 点击鼠标右键于未知区域,则将其置为有雷而不管是否真的有雷。可选择初、中、高三级并可自定义雷数和区域大小。 雷区上部左侧显示总雷数减被标明有雷区域的数目。 雷区上部中间位置显示一按钮用于开局和显示鼠标动作的结果。 雷区上部右侧显示扫雷的时间。 将雷全部扫清后,则显示一对话框将你的姓名记入排行榜。以时间排序。 为完成上述功能,应用Visual C++的具体技术细节如下: 1. 应用AppW izard创建基于SDI的应用程序CBombApp,去除打印和状态条支持,在资源编辑器中修改菜单和相应的加速键,使其与Windows扫雷游戏一致。具体为开局(ID-GAME-BEGIN)、初级(ID-GAME-JUNIOR)、中级(ID-GAME-MIDDLE)、高级(ID-GAME-SENIOR)、自定义 (ID-GAME-CUSTOM)、颜色(ID-GAME-COLOR)、英雄榜(ID-GAME-SORT)、退出 (ID-GAME-EXIT)、帮助(ID-HELP)。 2. 在资源编辑器中对应于雷区的每个小区域的13个属性。用画笔或其他绘图工具绘制出相对应的13个10乘10的16色小位图,三个对应于小人表情的20乘20的16色小位图,供更换颜色时使用的一套与前16个对应的单色位图,显示时间和雷数的0~9十个数字位图(底色为黑色)。 定制CUSTOMER对话框,内含三个静态文本控件和三个编辑控件,三个编辑控件分别对应成员m_iRowNum,m_iColumnNum,m_iBombNum。该对话框用于定制雷数,行列数,其相应的MFC类为CCustomer。定制SORT对话框,内含九个静态文本控件,其中六个显示排行榜的姓名和时间,其对应的MFC类为CSort。定制INPUT对话框,内含一个静态文本控件和一个编辑控件,编辑控件用于在游戏成功结束时输入姓名,其对应的MFC类为CInput。 3. 定义类Bomb,封装每颗雷的相关属性。 Class Bomb { public: int isbomb;//决定初始时是否是雷 bool issel; //判断区域是否被处理过且周围有雷 bool isdone;//判断递归时是否被处理过

java课程设计(扫雷游戏)

成绩评定表

课程设计任务书

目录 1.设计目的----------------------------------------------------------------------------- 4 2.总体设计----------------------------------------------------------------------------- 4 2.1设计需求------------------------------------------------------------------------------------------ 4 2.2程序功能模块图----------------------------------------------------------------------------------- 4 3.关键技术----------------------------------------------------------------------------- 7 4.程序流程----------------------------------------------------------------------------- 8 5.主要源代码-------------------------------------------------------------------------- 8 6.运行结果及结论------------------------------------------------------------------- 27 7.参考文献--------------------------------------------------------------------------- 29

VB扫雷小游戏编程代码

VB扫雷小游戏 一.编程目的 二.编程思路 1.新建command_up和label_down控件 2.用load加载控件 3.根据雷区的X、Y、以及难度进行随机布雷。 4.统计每一个label周围雷的数量并作为label的caption。 5.在单击command的时候显示label 6.在右击command的时候进行标记 7.在label上左右键同时按下的时候检查已标记雷的数量与label显示的数量是否一致。三.界面设计 四.代码设计 Dim Start_Time, End_Time Dim Area_X%, Area_Y%, Area%, Area_List() Dim Current_Mine% Dim Difficulty# Dim Continue_Flag%, Success_Flag%, LeftAndRight_Flag% Dim Near_List Dim Mine_Count Private Sub Command_End_Click() End End Sub Private Sub Delete_Item(List(), Index As Integer) Dim i%

For i = LBound(List) + Index - 1 To UBound(List) - 1 List(i) = List(i + 1) Next i '防止100%的困难度 If UBound(List) > LBound(List) Then ReDim Preserve List(LBound(List) To UBound(List) - 1) End Sub Private Sub Command_retry_Click() '卸载 For i = 1 To Area Unload Label_Down(i) Unload Command_Up(i) Next i Command_Start.Caption = "开始游戏" Call Command_Start_Click End Sub Private Sub Command_Up_Click(Index As Integer) Success_Flag = 1 If Continue_Flag = 1 Then If Timer1.Enabled = False Then Call Command_Start_Click If Label_Down(Index).Caption = "X" Then Success_Flag = 0 Continue_Flag = 0 For i = 1 To Area If Command_Up(i).Visible = True And Command_Up(i).Caption = "X" And Label_Down(i).BackColor = vbRed Then '标记雷正确 Command_Up(i).Picture = LoadPicture(App.Path + "\pictures\mine_correct.gif", , , Command_Up(i).Width, Command_Up(i).Height) Command_Up(i).Visible = True Label_Down(i).Visible = True ElseIf Command_Up(i).Visible = True And Command_Up(i).Caption = "X" And Label_Down(i).BackColor = vbGreen Then '标记雷错误 Command_Up(i).Picture = LoadPicture(App.Path + "\pictures\mine_wrong.gif", , , Command_Up(i).Width, Command_Up(i).Height) Command_Up(i).Visible = True Label_Down(i).Visible = True Else Command_Up(i).Visible = False Label_Down(i).Visible = True End If Next i

C语言扫雷源代码

C语言扫雷源代码

#include #include #include #include /*鼠标信息宏定义*/ #define WAITING 0xff00 #define LEFTPRESS 0xff01 #define LEFTCLICK 0xff10 #define LEFTDRAG 0xff19 #define RIGHTPRESS 0xff02 #define RIGHTCLICK 0xff20 #define RIGHTDRAG 0xff2a #define MIDDLEPRESS 0xff04 #define MIDDLECLICK 0xff40 #define MIDDLEDRAG 0xff4c #define MOUSEMOVE 0xff08 struct { int num;/*格子当前处于什么状态,1有雷,0已经显示过数字或者空白格子*/

int roundnum;/*统计格子周围有多少雷*/ int flag;/*右键按下显示红旗的标志,0没有红旗标志,1有红旗标志*/ }Mine[10][10]; int gameAGAIN=0;/*是否重来的变量*/ int gamePLAY=0;/*是否是第一次玩游戏的标志*/ int mineNUM;/*统计处理过的格子数*/ char randmineNUM[3];/*显示数字的字符串*/ int Keystate; int MouseExist; int MouseButton; int MouseX; int MouseY; int up[16][16],down[16][16],mouse_draw[16][16 ],pixel_save[16][16]; void MouseMath()/*计算鼠标的样子*/ {int i,j,jj,k;

java_扫雷游戏课程设计报告

Java课程设计报告 姓名 学号 院系 班级 专业 1.设计内容及要求 1.1 扫雷游戏的基本要求 Windows 2000/XP系统提供的扫雷游戏是一个很有趣的游戏。本章的课程设计使用Java语言编写一个与其类似的扫雷游戏。具体要求如下: (1) 扫雷游戏分为初级、中级和高级三个级别,扫雷英雄榜存储每个级别的最好成绩,即挖出全部的地雷且用时最少者。单击游戏菜单可以选择“初级”、“中级”和“高级”或“查看英雄版”。 (2) 选择级别后将出现相应级别的扫雷区域,这是用户使用鼠标左键单击雷区中任何一个方块便启动计时器。 (3) 用户要揭开某个方块,可单击它。若所揭方块下有泪,用户便输了这一局,若所揭方块下五雷,则显示一个数字,该数字代表方块的周围的8个方块中共有多少颗雷。

(4) 如果用户认为某个方块下埋着雷,单击右键可以在方块上标识一个用户认为是雷的图标,即给出一个扫雷标记。用户每标记出一个扫雷标记(无论用户的标记是否正确),程序将显示的剩余雷数减少一个。 (5) 扫雷胜利后(用时最少者),程序弹出保存成绩的对话框。 (6)用户可以选择标记疑问的方块,用可以勾选游戏菜单下的标记(或者用快捷键alt+G 然后M)即可,此时双击右键并可出现“?”标记。另有颜色选项,当用户勾选此项时,游戏将以最低图像像素来显示。 (7)如果用户需要即使提示声,并可选中声音选项,此时将听到计时的卡塔声。当用户点中雷时,将有爆炸声产生,胜利时,将有凯旋的旋律播放,此时企鹅出现欢悦表情。 1.2 需实现的主要功能 (1)用户可以自定义级别并且可以任意输入雷数; (2)具有计时功能,即显示用户完成移动盘子所花费的时间; (3)用户可以选择是否有音效; (4)自动保存扫雷英雄榜; 2.需求分析 2.1 扫雷棋盘的布局设计 系统的整体布局为:CardLayout布局, 采用了菜单、按钮、面板…等组件,菜单主要包括开始,选择级别,标记,扫雷英雄榜,退出,按钮的功能是重新开始新的游戏。 2.2 雷区的设计 MineArea类是javax.swing包中Jpanel容器的子类,实现了ActionListener 和MouseListener接口,所创建的对象:mineArea是MineGame类中最重要的成员之一,作为一个容器添加到MineGame窗口的中心。标明MineArea类的主要成员变量、方法以及和MineGame类之间组合关系的UML图如图2-1所示。

相关主题