c语言课程设计经典例题扫雷.docx
- 文档编号:6531482
- 上传时间:2023-01-07
- 格式:DOCX
- 页数:28
- 大小:23.30KB
c语言课程设计经典例题扫雷.docx
《c语言课程设计经典例题扫雷.docx》由会员分享,可在线阅读,更多相关《c语言课程设计经典例题扫雷.docx(28页珍藏版)》请在冰豆网上搜索。
c语言课程设计经典例题扫雷
扫雷源代码,完美运行
/*
模拟扫雷游戏
*/
#include
#include
#include
#include
#include
#include
#include
unionREGSregs;
intsize=15;/*用于表示每个方块的大小(正方形的边长)*/
intpix,piy=50;/*pix,piy是矩阵的偏移量*/
charb[2]="1";/*用于显示方格周围的雷的个数*/
intpan[30][16];/*用于记录盘面的情况:
0:
没有、9:
有雷、1~8:
周围雷的个数*/
intpan1[30][16];/*pan1[][]纪录当前的挖雷情况,0:
没有操作、1:
打开了、2:
标记了*/
inttt;/*纪录时间参数*/
intEflags;/*用于标记鼠标按钮的有效性,0:
有效,1:
无效,2:
这是鼠标的任意键等于重新开始*/
intMsinit();
voidDraw(intx,inty,intsizex,intsizey);
voidFacedraw(intx,inty,intsizel,intk);
voidDead(intsizel,intx,inty);
voidSetmouse(intxmax,intymax,intx,inty);
intMsread(int*xp,int*yp,int*bup,structtimet1,intk);
voidDraw1(intx,inty);
intOpen(intx,inty);
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");
printf("Pressanykeytoout!
\n");
exit
(1);
}
/*用于检验文件是否完整*/
while((p=fopen("score.dat","r"))==NULL)/*如果不能打开就新建一个*/
{
if((p=fopen("score.dat","w"))==NULL)/*如果不能新建就提示错误并推出*/
{
printf("Thefilecannotopen!
\n");
printf("Presssanykeytoexit!
\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 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)) { gotobss; } /*下面实现菜单的功能,每一项响应一个菜单项*/ if(cflags==0) { if((xms>=pix-6&&xms<=pix+85&&yms>=17&&yms<=28&&bms==1)||(ams=='r'||ams=='R'))/*下面依次响应菜单中各项*/ { cflags=1; gotobss; } 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; gotobss; } 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; gotobss; } 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; gotobss; } 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; gotobss; } }/*结束菜单功能的实现*/ /*在笑脸按钮处单击时重新开始*/ if(cflags! =0&&xms>=250-sizel-2&&yms>=30-sizel-2&&xms<=250+sizel+2&&yms<=30+sizel+2&&bms==1) { gotobss; } 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 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 =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 =2) { if(pan[x1+1][y1]! =9) Draw1(x1+1,y1); else { Dead(sizel,x,y); k=0; } } if(x1-1>=0&&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 =2) { if(pan[x1][y1+1]! =9) Draw1(x1,y1+1); else { Dead(sizel,x,y); k=0; } } if(x1+1 =2) { 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,"Youbreakthecorse! "); outtextxy(20,25,"Pleaseinputyourname(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("Thefilecannotopen! \n"); exit (1); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 课程设计 经典 例题 扫雷