扫雷

扫雷
 纯C语言实现





在这里下载程序以及源代码和素材文件:
http://pan.baidu.com/s/1stb8S    在文件夹中找到“扫雷安装.exe”

附上源代码:
===============================分==========割===========线================================


#include<stdio.h>
#include<time.h>
//本程序使用了EGE图形库
#include<graphics.h>
//地雷个数
#define NUM 40  
int map[20][20];//用于保存地雷阵,9表示地雷,0~8表示周围地雷的个数
int ui[20][20];//用于保存显示的界面,0表示未翻开,1表示翻开,2表示插上了小红旗
long timer,timer2;
int life,isnew;
PIMAGE LEI;//地雷
PIMAGE SHOW_0;//未翻开的方块
PIMAGE SHOW_1;//翻开的方块
PIMAGE SHOW_FLAG;//小红旗

int makemap(int num);//初始化地雷阵
int draw(void);绘制图形
int dataup(void);//更新数据,响应鼠标操作
void showother(int x,int y);//翻开空白方块旁边挨着的空白方块
int main ()
{
int x,y;
srand((int)time(NULL));
initgraph(600,700);
LEI=newimage();
SHOW_0=newimage();
SHOW_1=newimage();
SHOW_FLAG=newimage();
getimage(LEI,"lei.png");
getimage(SHOW_0,"show_0.png");
getimage(SHOW_1,"show_1.png");
getimage(SHOW_FLAG,"show_flag.png");
setfillcolor(LIGHTGRAY);

while(1){
bar(80,600,600,700);
setcolor(LIGHTBLUE);
setfont(50,0,"宋体");
xyprintf(80,600,"Made By:Blue Sky");
setfont(20,0,"宋体");
xyprintf(80,650,"共%d个地雷找到它们并按右键插上小红旗",NUM);
life=1;isnew=1;
makemap(NUM);
for(y=0;y<20;y++)
for(x=0;x<20;x++)ui[y][x]=0;
setbkcolor(LIGHTGRAY);
draw();
timer=clock(); 
while(life)
{
timer2=clock();
setfont(-80,0,"");
setcolor(RED);
xyprintf(0,600,"%d",(timer2-timer)/1000);
dataup();
if(life==0){
for(y=0;y<20;y++)
for(x=0;x<20;x++)ui[y][x]=1;
draw();
break;
}
if(isnew)
draw();
if(life==2)break;
}
setfont(50,0,"宋体");
setcolor(RED);
bar(80,600,600,700);
if(life==2)xyprintf(80,600,"太牛了!你赢了!"); 
if(life==0)xyprintf(80,600,"噢!你挂了!"); 
setfont(30,0,"宋体");
xyprintf(80,650,"(按空格再来一局!其他键退出)");
if(getch()!=VK_SPACE)break;
} 
delimage(SHOW_1);
delimage(SHOW_0);
delimage(LEI);
closegraph();
}

int makemap(int num)
{
int x,y,n=0;
int i,j;
for(y=0;y<20;y++)
for(x=0;x<20;x++)map[y][x]=0;
for(;n<num;){
n=0;
x=rand()%20;
y=rand()%20;
map[y][x]=9;
for(y=0;y<20;y++)
for(x=0;x<20;x++)
if(map[y][x]==9)n++;
}

for(y=0;y<20;y++)
for(x=0;x<20;x++)
{
if(map[y][x]!=9)
for(i=y-1;i<=y+1;i++)
for(j=x-1;j<=x+1;j++)
if(i>=0&&i<20&&j>=0&&j<20)
if(map[i][j]==9)map[y][x]++;
}
return 0;
}

int draw(void)
{
int x,y;
for(y=0;y<20;y++)
for(x=0;x<20;x++){
if(ui[y][x]==1){
if(map[y][x]==9)
putimage(x*30,y*30,LEI);
else{
putimage(x*30,y*30,SHOW_1);
if(map[y][x]!=0){
if(map[y][x]==1)setcolor(BLUE);
else if(map[y][x]==2)setcolor(GREEN);
else if(map[y][x]<6)setcolor(RED);
else setcolor(RED);
setfont(-25,0,"楷体");
xyprintf(x*30+10,y*30+3,"%d",map[y][x]);
}
}
}
else if (ui[y][x]==2)putimage(x*30,y*30,SHOW_FLAG);
else putimage(x*30,y*30,SHOW_0);
}
isnew =0;
}

int dataup(void){
int x,y,n=0;
mouse_msg mous;
if(mousemsg())
mous= getmouse();
x=(int)mous.x/30;
y=(int)mous.y/30;
if(mous.is_up()){
if(mous.x<600){
if(mous.is_left())
showother(x,y);
if(mous.is_right()){
if(ui[y][x]==0)
ui[y][x]=2;
else if(ui[y][x]==2)ui[y][x]=0;
}
//修复右键点击已经翻开的方块仍然出现小红旗的BUG 
/* 原错误代码
if(mous.is_right()){
if(ui[y][x]!=2)
ui[y][x]=2;
else ui[y][x]=0;
}
*/ 
 
isnew =1;
}
}
for(y=0;y<20;y++)
for(x=0;x<20;x++)
if(ui[y][x]==2)
if(map[y][x]==9)n++;
if(n==NUM)life=2;
}

void showother(int x,int y){
int i,j;
ui[y][x]=1;
if(map[y][x]==9){life=0;return;} 
if(map[y][x]==0){
for(i=y-1;i<=y+1;i++)
for(j=x-1;j<=x+1;j++)
{
if(i>=0&&i<20&&j>=0&&j<20)
if(ui[i][j]==0){
ui[i][j]==1;
if(ui[i][j]==0)showother(j,i);
}
} 
}
}


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值