实例介绍
【实例简介】emmm,正常的扫雷游戏
【实例截图】
【实例截图】
【核心代码】
1 c扫雷小游戏 #include <graphics.h> #include <stdlib.h> #include <dos.h> #define LEFTPRESS 0xff01 #define LEFTCLICK 0xff10 #define LEFTDRAG 0xff19 #define MOUSEMOVE 0xff08 int num[10][10];/*范围*/ int p[10][10];/*统计雷的数组*/ int loop;/*重新来的标志*/ int again=0;/*是否重来的变量*/ int scorenum;/*一开始统计有几个雷*/ char score[3];/*输出一共有几个地雷*/ int Keystate; int MouseExist; int MouseButton; int MouseX; int MouseY; /*鼠标光标形状定义*/ typedef struct { unsigned int shape[32]; char hotx; char hoty; }SHAPE; /*箭头型*/ SHAPE ARROW={ { 0x3fff,0x1fff,0x0fff,0x07ff, 0x03ff,0x01ff,0x00ff,0x007f, 0x003f,0x00ff,0x01ff,0x10ff, 0x30ff,0xf87f,0xf87f,0xfc3f, 0x0000,0x7c00,0x6000,0x7000, 0x7800,0x7c00,0x7e00,0x7f00, 0x7f80,0x7e00,0x7c00,0x4600, 0x0600,0x0300,0x0300,0x0180 }, 0,0, }; /*鼠标光标显示*/ void MouseOn() { _AX=0x01; geninterrupt(0x33); } /*鼠标光标掩示*/ void MouseOff()/*鼠标光标隐藏*/ { _AX=0x02; geninterrupt(0x33); } void MouseSetXY(int x,int y)/*设置当前位置*/ { _CX=x; _DX=y; _AX=0x04; geninterrupt(0x33); } int LeftPress()/*左键按下*/ { _AX=0x03; geninterrupt(0x33); return(_BX&1); } void MouseGetXY()/*得到当前位置*/ { _AX=0x03; geninterrupt(0x33); MouseX=_CX; MouseY=_DX; } begain()/*游戏开始画面*/ { int i,j; loop: cleardevice(); MouseOn(); MouseSetXY(180,30); MouseX=180; MouseY=30; scorenum=0; setfillstyle(SOLID_FILL,7); bar(190,60,390,290); setfillstyle(SOLID_FILL,8); for(i=100;i<300;i =20)/*画格子*/ for(j=200;j<400;j =20) bar(j-8,i 8,j 8,i-8); setcolor(7); setfillstyle(SOLID_FILL,YELLOW);/*画脸*/ fillellipse(290,75,10,10); setcolor(YELLOW); setfillstyle(SOLID_FILL,0); fillellipse(285,75,2,2); fillellipse(295,75,2,2); setcolor(0); bar(287,80,293,81); randomize(); for(i=0;i<10;i ) for(j=0;j<10;j ) { num[i][j]=random(7) 10;/*用10代表地雷算了*/ if(num[i][j]==10) scorenum ; } sprintf(score,"%d",scorenum); setcolor(1); settextstyle(0,0,2); outtextxy(210,70,score); scorenum=100-scorenum;/*为了后面判断胜利*/ } gameove()/*游戏结束画面*/ { int i,j; setcolor(0); for(i=0;i<10;i ) for(j=0;j<10;j ) if(num[i][j]==10)/*是地雷的就显示出来*/ { setfillstyle(SOLID_FILL,RED); bar(200 j*20-8,100 i*20-8,200 j*20 8,100 i*20 8); setfillstyle(SOLID_FILL,0); fillellipse(200 j*20,100 i*20,7,7); } } int tongji(int i,int j)/*计算有几个雷*/ { int x=0;/*10代表地雷*/ if(i==0&&j==0) { if(num[0][1]==10) x ; if(num[1][0]==10) x ; if(num[1][1]==10) x ; } else if(i==0&&j==9) { if(num[0][8]==10) x ; if(num[1][9]==10) x ; if(num[1][8]==10) x ; } else if(i==9&&j==0) { if(num[8][0]==10) x ; if(num[9][1]==10) x ; if(num[8][1]==10) x ; } else if(i==9&&j==9) { if(num[9][8]==10) x ; if(num[8][9]==10) x ; if(num[8][8]==10) x ; } else if(j==0) { if(num[i][j 1]==10) x ; if(num[i 1][j]==10) x ; if(num[i-1][j]==10) x ; if(num[i-1][j 1]==10) x ; if(num[i 1][j 1]==10) x ; } else if(j==9) { if(num[i][j-1]==10) x ; if(num[i 1][j]==10) x ; if(num[i-1][j]==10) x ; if(num[i-1][j-1]==10) x ; if(num[i 1][j-1]==10) x ; } else if(i==0) { if(num[i 1][j]==10) x ; if(num[i][j-1]==10) x ; if(num[i][j 1]==10) x ; if(num[i 1][j-1]==10) x ; if(num[i 1][j 1]==10) x ; } else if(i==9) { if(num[i-1][j]==10) x ; if(num[i][j-1]==10) x ; if(num[i][j 1]==10) x ; if(num[i-1][j-1]==10) x ; if(num[i-1][j 1]==10) x ; } else { if(num[i-1][j]==10) x ; if(num[i-1][j 1]==10) x ; if(num[i][j 1]==10) x ; if(num[i 1][j 1]==10) x ; if(num[i 1][j]==10) x ; if(num[i 1][j-1]==10) x ; if(num[i][j-1]==10) x ; if(num[i-1][j-1]==10) x ; } return(x); } funcheck(int i,int j)/*开始找无雷*/ { scorenum--; if(p[i][j]==0&&num[i][j]!=10) { setfillstyle(SOLID_FILL,7);/*显示无雷区*/ bar(200 j*20-7,100 i*20-7,200 j*20 7,100 i*20 7); num[i][j]=-1; } else if(p[i][j]!=0) { sprintf(score,"%d",p[i][j]);/*输出雷数*/ setcolor(RED); outtextxy(195 j*20,95 i*20,score); num[i][j]=-1; return ; } if(i!=0&&num[i-1][j]!=-1&&num[i-1][j]!=10)/*第归开始*/ funcheck(i-1,j); if(i!=0&&j!=9&&num[i-1][j 1]!=-1&&num[i-1][j 1]!=10) funcheck(i-1,j 1); if(j!=9&&num[i][j 1]!=-1&&num[i][j 1]!=10) funcheck(i,j 1); if(j!=9&&i!=9&&num[i 1][j 1]!=-1&&num[i 1][j 1]!=10) funcheck(i 1,j 1); if(i!=9&&num[i 1][j]!=-1&&num[i 1][j]!=10) funcheck(i 1,j); if(i!=9&&j!=0&&num[i 1][j-1]!=-1&&num[i 1][j-1]!=10) funcheck(i 1,j-1); if(j!=0&&num[i][j-1]!=-1&&num[i][j-1]!=10) funcheck(i,j-1); if(i!=0&&j!=0&&num[i-1][j-1]!=-1&&num[i-1][j-1]!=10) funcheck(i-1,j-1); } playgame()/*游戏过程*/ {int i,j,numx; for(i=0;i<10;i ) for(j=0;j<10;j ) p[i][j]=tongji(i,j);/*把标记有几个雷的数字都存放起来*/ while(!kbhit()) { if(LeftPress())/*左键盘按下*/ { MouseGetXY(); if(MouseX>280&&MouseX<300&&MouseY>65&&MouseY<85)/*重新来*/ { MouseOff(); again=1; break; } if(MouseX>190&&MouseX<390&&MouseY>90&&MouseY<290)/*是否在游戏范围内*/ { j=(MouseX-190)/20;/*x坐标*/ i=(MouseY-90)/20;/*y坐标*/ if(num[i][j]!=-1) { if(num[i][j]==10)/*中雷*/ { MouseOff(); gameove();/*失败*/ break; } else/*非中雷*/ { MouseOff(); numx=tongji(i,j); if(numx==0)/*周围没地雷*/ funcheck(i,j);/*开始找无雷*/ else/*有地雷*/ { sprintf(score,"%d",numx);/*输出雷数*/ setcolor(RED); outtextxy(195 j*20,95 i*20,score); scorenum--; } MouseOn(); num[i][j]=-1; if(scorenum<1)/*胜利了*/ { setcolor(11); settextstyle(0,0,2); outtextxy(230,30,"YOU WIN!"); break; } } } } } } } main() {int gd=DETECT,gr; registerbgidriver(EGAVGA_driver); initgraph(&gd,&gr,"c:\\tc"); loop: begain(); playgame();/*具体游戏*/ if(again)/*游戏中重新开始*/ { again=0; goto loop; } MouseOn(); while(!kbhit())/*重新来*/ { if(LeftPress()) { MouseGetXY();/*失败后重新来*/ if(MouseX>280&&MouseX<300&&MouseY>65&&MouseY<85) goto loop; } } MouseOff(); closegraph(); }
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论