📄 挖地雷.txt
字号:
本程序通过tc2.0和tc3.0编译运行,请在主目录(tc.exe所在的目录)下添加文件out.xia,文件中加入如下内容。
999 999 999,xiajia
xiajia
xiajia
再进行编译运行。否则会有错误。
#include <graphics.h>
#include <math.h>
#include <stdio.h>
#include <dos.h>
union REGS regs;
int size=15;/*用于表示每个方块的大小(正方形的边长)*/
int pix,piy=50;/*pix,piy是矩阵的偏移量*/
char b[2]="1";/*用于显示方格周围的雷的个数*/
int pan[30][16]={0};/*用于记录盘面的情况:0:没有、9:有雷、1~8:周围雷的个数*/
int pan1[30][16]={0};/*pan1[][]纪录当前的挖雷情况,0:没有操作、1:打开了、2:标记了*/
int tt;/*纪录时间参数*/
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();
/*下面是主函数*/
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; /*x,y矩阵的大小*/
int sum=10; /*sum 盘面的雷的总数目,是个x,y的函数*/
int x1=0,y1=0; /*用于记录光标当前的位置*/
int sizel=10; /*脸的大小*/
char string3[4]="Big",string1[6]="Small",string2[7]="Normal";
struct time t1={0,0,0,0};
int co[3];
char name[3][20];
FILE * p;
Msinit(); /*鼠标初始化*/
registerbgidriver(EGAVGA_driver);
initgraph(&devices,&mode,"\\tc\\BGI"); /*图形模式初始化*/
if((p = fopen("out.xia", "r")) == NULL)
{printf("The file cannot open!\n");
exit(1);}
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);
pix=250-x*size/2;
bss: b[0]='1'; /*游戏开始和重来的切入点*/
k=0,tt=0;
for(i=0;i<30;i++) /*盘面初始化*/
for(j=0;j<16;j++)
{pan[i][j]=0;
pan1[i][j]=0;}
Setmouse(pix,piy,x,y);/*设置鼠标的活动范围*/
/*下面是程序的试验阶段的部分,技术成熟时要改变*/
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<x;i++)/*用于统计各点的周边情况*/
for(j=0;j<y;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<x && j-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<x && pan[i+1][j]==9) pan[i][j]++;
if(i-1>=0 && j+1<y && pan[i-1][j+1]==9) pan[i][j]++;
if(j+1<y && pan[i][j+1]==9) pan[i][j]++;
if(i+1<x && j+1<y && pan[i+1][j+1]==9) pan[i][j]++;
}
/*下面是一个试验阶段用于检验上面计算的正确性的小节
for(i=0;i<x;i++)
{for(j=0;j<y;j++)
printf("%d,",pan[i][j]);
printf("\n");}
getch();
exit(1);
通过实验了!*/
cleardevice();/*清屏*/
Draw(40,1,470,320);/*画底座*/
setcolor(1);/*显示提示信息*/
outtextxy(100,300," : Help.");
setcolor(4);
outtextxy(100,300,"H");
setcolor(1);
outtextxy(200,300," / : exit.");
setcolor(4);
outtextxy(200,300,"Q");
outtextxy(220,300,"ESC");
setcolor(1);
outtextxy(330,300," : cores.");
setcolor(4);
outtextxy(330,300,"R");
Facedraw(250,20,sizel,2);/*显示控制按钮*/
Draw(300,10,60,20);
setcolor(0);
outtextxy(309,15,string1);
Draw(360,10,60,20);
setcolor(0);
outtextxy(369,15,string2);
Draw(420,10,60,20);
setcolor(0);
outtextxy(434,15,string3);
for(i=0;i<x;i++)/*这一段用于描绘盘面*/
for(j=0;j<y;j++)
{Draw(i*size+pix,j*size+piy,size,size);}
Have(sum,70,20,x,y);/*各项的初始显示*/
k=0;
setfillstyle(1, 0);
bar(105,15,135,30);
setcolor(4);
outtextxy(110,20,"000");
/*下面这一段用于接收用户的控制,并做出反应*/
for(;;)
{
css:ams=Msread(&xms,&yms,&bms,t1,k);/*读取鼠标状态*/
/*鼠标状态发生变化时描绘原有情况*/
/*如果鼠标不在盘面上,就如下操作*/
if(y1<0) {if(x1<x/4)
Facedraw(250,20,sizel,2);
if(x1>=x/4 && x1<x/2)
{Draw(300,10,60,20);
setcolor(0);
outtextxy(309,15,string1);}
if(x1>=x/2 && x1<x*3/4)
{Draw(360,10,60,20);
setcolor(0);
outtextxy(369,15,string2);}
if(x1>=x*3/4)
{Draw(420,10,60,20);
setcolor(0);
outtextxy(434,15,string3);}
}
/*如果鼠标在盘面上*/
else{
if(ams==-1 && pan1[x1][y1]==0) Draw(x1*size+pix,y1*size+piy,size,size);
if(ams==-1 && pan1[x1][y1]==1) Draw1(x1,y1);
if(ams==-1 && pan1[x1][y1]==2)
{Draw(x1*size+pix,y1*size+piy,size,size);
setcolor(10);
circle(x1*size+pix+7,y1*size+piy+7,4);}
}
x1=(int)((xms-pix)/size);/*计算鼠标目前的位置*/
y1=(int)((yms-piy)/size);
if(y1<0){setcolor(4);
if(x1<x/4)
{rectangle(250-sizel-3,20-sizel-3,254+sizel,24+sizel);
if(bms!=0) goto bss;}
if(x1>=x/4 && x1<x/2)
{rectangle(300,10,359,30);
if(bms!=0) {x=9;y=9;sum=10;pix=250-x*size/2;goto bss;}}
if(x1>=x/2 && x1<x*3/4)
{rectangle(360,10,419,30);
if(bms!=0) {x=16;y=16;sum=40;pix=250-x*size/2;goto bss;}}
if(x1>=x*3/4)
{rectangle(420,10,479,30);
if(bms!=0) {x=30;y=16;sum=99;pix=250-x*size/2+25;goto bss;}}
goto css;}
if(ams==-1 && bms==1 && pan1[x1][y1]==0)/*单击鼠标左键*/
{if(k==0) {gettime(&t1); k=1;}
if(pan[x1][y1]!=9)
{Draw1(x1,y1);Open(x,y);}
else {Dead(sizel,x,y);
goto bss;}
}
if(ams==-1 && bms==2 && pan1[x1][y1]==0)
{setcolor(10);
circle(x1*size+pix+7,y1*size+piy+7,4);
pan1[x1][y1]=2;
Have(sum,70,20,x,y);}
else
if(ams==-1 && bms==2 && pan1[x1][y1]==2)
{Draw(x1*size+pix,y1*size+piy,size,size);
pan1[x1][y1]=0;
Have(sum,70,20,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<x && y1-1>=0 && pan1[x1+1][y1-1]==2) i++;
if(x1-1>=0 && pan1[x1-1][y1]==2) i++;
if(x1+1<x && pan1[x1+1][y1]==2) i++;
if(x1-1>=0 && y1+1<y && pan1[x1-1][y1+1]==2) i++;
if(y1+1<y && pan1[x1][y1+1]==2) i++;
if(x1+1<x && y1+1<y && pan1[x1+1][y1+1]==2) i++;
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); goto bss;}}
if(y1-1>=0 && pan1[x1][y1-1]!=2) {if(pan[x1][y1-1]!=9) Draw1(x1,y1-1);else {Dead(sizel,x,y);goto bss;}}
if(x1+1<x && 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);goto bss;}}
if(x1-1>=0 && pan1[x1-1][y1]!=2) {if(pan[x1-1][y1]!=9) Draw1(x1-1,y1);else {Dead(sizel,x,y);goto bss;}}
if(x1+1<x && pan1[x1+1][y1]!=2) {if(pan[x1+1][y1]!=9) Draw1(x1+1,y1);else {Dead(sizel,x,y);goto bss;}}
if(x1-1>=0 && y1+1<y && pan1[x1-1][y1+1]!=2) {if(pan[x1-1][y1+1]!=9) Draw1(x1-1,y1+1);else {Dead(sizel,x,y);goto bss;}}
if(y1+1<y && pan1[x1][y1+1]!=2) {if(pan[x1][y1+1]!=9) Draw1(x1,y1+1);else {Dead(sizel,x,y);goto bss;}}
if(x1+1<x && y1+1<y &&pan1[x1+1][y1+1]!=2) {if(pan[x1+1][y1+1]!=9) Draw1(x1+1,y1+1);else {Dead(sizel,x,y);goto bss;}}
Open(x,y);
}
}
if(ams=='q'||ams=='Q'|| ams==27 ) {fclose(p);exit(1);} /*退出*/
if(ams=='c'||ams=='C') goto bss; /*重来*/
if(ams=='h'||ams=='H') {Help();goto bss;}/*帮助文档*/
if(ams=='r'||ams=='R') {Coread();goto bss;}/*察看成绩*/
/*胜利条件*/
k1=0;
for(i=0;i<x;i++)
for(j=0;j<y;j++)
if(pan1[i][j]!=1) k1++;
if(k1==sum)
{
for(i=0;i<x;i++)
for(j=0;j<y;j++)
if(pan1[i][j]==0) {setcolor(10);circle(i*size+pix+7,j*size+piy+7,4);}
Facedraw(250,20,sizel,3);
if(x==9 && tt<co[0]) {j=0;co[0]=tt;i=0;}
if(x==16 && tt<co[1]) {j=1;co[1]=tt;i=0;}
if(x==30 && tt<co[2]) {j=2;co[2]=tt;i=0;}
if(i==0)
{Draw(10,10,300,55);
setcolor(4);
outtextxy(20,20,"Please input your name(0 - 19):");
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, 7);
bar(20,35,200,50);
setcolor(4);
outtextxy(20,40,name[j]);
}
if((p = fopen("out.xia", "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;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -