C语言扫雷游戏源代码

  • 格式:doc
  • 大小:72.00 KB
  • 文档页数:20

/*

模拟扫雷游戏

*/

#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);/*显示控制按钮,脸型*/