C语言扫雷游戏源代码文档格式.docx
《C语言扫雷游戏源代码文档格式.docx》由会员分享,可在线阅读,更多相关《C语言扫雷游戏源代码文档格式.docx(33页珍藏版)》请在冰点文库上搜索。
floatRandom();
voidHave(intsum,intx,inty,intxx,intyy);
voidHelp();
voidCoread();
voidDdraw2(intx,inty);
/*下面是主函数*/
main()
{
intmode=VGAHI,devices=VGA;
/*图形模式初始化的变量*/
charams;
/*鼠标操作中的标志变量*/
intxms,yms,bms;
/*鼠标的状态变量*/
inti,j,k,k1=0;
/*i,j,k是循环变量*/
intx=9,y=9,flags=0;
/*x,y矩阵的大小*/
intsum=10;
/*sum盘面的雷的总数目,是个x,y的函数*/
intx1=0,y1=0;
/*用于记录光标当前的位置*/
intx11=0,y11=0;
/*暂时保存鼠标位置的值*/
intsizel=10;
/*脸的大小*/
intcflags=1;
/*这是菜单操作标志变量,没有弹出1,弹出0*/
structtimet1={0,0,0,0};
/*时间结构体,头文件已定义*/
intco[3];
/*暂时纪录历史纪录*/
voidfar*Map;
/*用于保存鼠标图片*/
charname[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("
Memoryererr!
\n"
Pressanykeytoout!
exit
(1);
}
/*用于检验文件是否完整*/
while((p=fopen("
score.dat"
"
r"
))==NULL)/*如果不能打开就新建一个*/
if((p=fopen("
w"
))==NULL)/*如果不能新建就提示错误并推出*/
Thefilecannotopen!
Presssanykeytoexit!
getch();
/*写入初始内容*/
fprintf(p,"
%d%d%d,%s\n%s\n%s\n"
999,999,999,"
xiajia"
"
fclose(p);
/*暂时读出历史纪录。
并用co[3]纪录*/
fscanf(p,"
%d%d%d,"
&
co[0],&
co[1],&
co[2]);
for(i=0;
i<
3;
i++)
%s\n"
name[i]);
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);
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;
x;
i++)/*用于统计各点的周边情况*/
for(j=0;
y;
if(pan[i][j]==0)/*只有没有雷的才需要处理*/
if(i-1>
=0&
&
j-1>
pan[i-1][j-1]==9)pan[i][j]++;
if(j-1>
pan[i][j-1]==9)pan[i][j]++;
if(i+1<
x&
pan[i+1][j-1]==9)pan[i][j]++;
pan[i-1][j]==9)pan[i][j]++;
pan[i+1][j]==9)pan[i][j]++;
j+1<
y&
pan[i-1][j+1]==9)pan[i][j]++;
if(j+1<
pan[i][j+1]==9)pan[i][j]++;
pan[i+1][j+1]==9)pan[i][j]++;
if(sum==10)/*画底座*/
Draw(170,1,162,200);
setcolor
(1);
outtextxy(175,5,"
Game()"
setcolor(4);
G"
}/*小*/
else
if(sum==40)
Draw(115,1,272,307);
outtextxy(120,5,"
Game(G)"
}/*中*/
if(sum==99)
Draw(40,1,470,307);
outtextxy(45,5,"
}/*大*/
/*显示提示信息*/
outtextxy(100,350,"
:
Help."
H"
outtextxy(200,350,"
/:
exit."
Q"
outtextxy(220,350,"
ESC"
outtextxy(330,350,"
cores."
R"
Facedraw(250,30,sizel,2);
/*显示控制按钮,脸型*/
i++)/*这一段用于描绘盘面*/
Draw(i*size+pix,j*size+piy,size,size);
Have(sum,pix+20,30,x,y);
/*各项的初始显示*/
setfillstyle(1,0);
bar(460-pix,25,490-pix,40);
outtextxy(465-pix,30,"
000"
/*下面这一段用于接收用户的控制,并做出反应*/
)
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;
/*下面显示菜单项*/
outtextxy(pix-4,19,"
Restar(R)"
R"
outtextxy(pix-4,30,"
Easy(E)"
E"
outtextxy(pix-4,41,"
Nomall(N)"
N"
outtextxy(pix-4,52,"
Hard(H)"
H"
outtextxy(pix-4,63,"
Corse(C)"
C"
outtextxy(pix-4,74,"
Help(L)"
L"
outtextxy(pix-4,85,"
Quit(Q)"
Q"
bms=0;
}/*完成菜单的描绘*/
/*这里是为了完全实现鼠标控制才加入的内容*/
if(Eflags==2&
(bms!
=0||ams!
=-1))
gotobss;
/*下面实现菜单的功能,每一项响应一个菜单项*/
if(cflags==0)
=pix-6&
=pix+85&
=17&
=28&
bms==1)||(ams=='
r'
R'
))/*下面依次响应菜单中各项*/
cflags=1;
=39&
e'
E'
x=9;
y=9;
sum=10;
=50&
n'
N'
x=16;
y=16;
sum=40;
=61&
h'
H'
x=30;
sum=99;
pix=250-x*size/2+25;
=72&
c'
C'
Coread();
=83&
l'
L'
Help();
=94&
q'
Q'
||ams==27)
closegraph();
farfree(Map);
if(bms!
}/*结束菜单功能的实现*/
/*在笑脸按钮处单击时重新开始*/
if(cflags!
xms>
=250-sizel-2&
yms>
=30-sizel-2&
=250+sizel+2&
=30+sizel+2&
bms==1)
if(Eflags==0&
cflags!
xms-pix>
yms-piy>
pix+x*size&
piy+y*size)/*111判断*/
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);
Dead(sizel,x,y);
bms==2&
pan1[x1][y1]==0)/*单击鼠标右键*/
delay(100);
setcolor(10);
circle(x1*size+pix+7,y1*size+piy+7,4);
pan1[x1][y1]=2;
pan1[x1][y1]==2)/*单击鼠标右键*/
Draw(x1*size+pix,y1*size+piy,size,size);
pan1[x1][y1]=0;
}/*相当于鼠标右击*/
bms==3&
pan1[x1][y1]==1)
{/*相当于鼠标双击,有效性判断*/
i=0;
if(x1-1>
y1-1>
pan1[x1-1][y1-1]==2)i++;
if(y1-1>
pan1[x1][y1-1]==2)i++;
if(x1+1<
pan1[x1+1][y1-1]==2)i++;
pan1[x1-1][y1]==2)i++;
pan1[x1+1][y1]==2)i++;
y1+1<
pan1[x1-1][y1+1]==2)i++;
if(y1+1<
pan1[x1][y1+1]==2)i++;
pan1[x1+1][y1+1]==2)i++;
if(i==pan[x1][y1])/*有效*/
pan1[x1-1][y1-1]!
=2)
if(pan[x1-1][y1-1]!
=9)
Draw1(x1-1,y1-1);
else
pan1[x1][y1-1]!
=2)
if(pan[x1][y1-1]!
Draw1(x1,y1-1);
pan1[x1+1][y1-1]!
if(pan[x1+1][y1-1]!
Draw1(x1+1,y1-1);
pan1[x1-1][y1]!
if(pan[x1-1][y1]!
Draw1(x1-1,y1);
pan1[x1+1][y1]!
if(pan[x1+1][y1]!
Draw1(x1+1,y1);
pan1[x1-1][y1+1]!
if(pan[x1-1][y1+1]!
Draw1(x1-1,y1+1);
pan1[x1][y1+1]!
if(pan[x1][y1+1]!
Draw1(x1,y1+1);
pan1[x1+1][y1+1]!
if(pan[x1+1][y1+1]!
Draw1(x1+1,y1+1);
/*胜利条件*/
k1=0;
if(pan1[i][j]!
=1)k1++;
if(k1==sum)
if(pan1[i][j]==0)
circle(i*size+pix+7,j*size+piy+7,4);
Facedraw(250,30,sizel,3);
if(x==9&
tt<
co[0]){j=0;
co[0]=tt;
i=0;
}
if(x==16&
co[1]){j=1;
co[1]=tt;
if(x==30&
co[2]){j=2;
co[2]=tt;
if(i==0)
Draw(10,10,300,55);
outtextxy(20,15,"
Youbreakthecorse!
"
outtextxy(20,25,"
Pleaseinputyourname(0-19):
setfillstyle(1,14);
bar(20,35,200,50);
19;
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]='
outtextxy(20,40,name[j]);
))==NULL)
%d%d