📄 saolei.c
字号:
/*********************************
作者:HungryAnt
姓名:孙麟
E-mail:ljsunlin@126.com
QQ:517377100
blog:http://hi.baidu.com/zhongji/blog
*********************************/
#include<stdio.h>
#include<graphics.h>
#include<dos.h>
int m_poly[8]={0,0,5,7,0,9,0,0};/*鼠标*/
int m_now_poly[8]={0,0,5,7,0,9,0,0};
int re[10][6];/*储存鼠标经过前的像素颜色*/
int m_s[93-40+1][52-2+1];
int n1=-1,n2=-1;
int hard=1;/*0:易 1:中 2: 难*/
int count=40;/*地雷数量*/
int mx=16,my=16;/*地图宽高*/
char map[16][30];/*0位存放是否有地雷,1有0无,1位存放是否打开,1打开0没有打开,2位表示是否插旗,1有0无*/
int ha_x=320-120,ha_y=240-100;/*游戏栏*/
int dead=0;/*1:死亡 2:生*/
int score=0;
void menu_window();
char sao16S[]={
/* 以下是 '扫' 的 16点阵宋体 字模,32 byte */
0x10,0x00,0x10,0x00,0x11,0xFC,0x10,0x04,
0xFE,0x04,0x10,0x04,0x14,0x04,0x18,0xFC,
0x30,0x04,0xD0,0x04,0x10,0x04,0x10,0x04,
0x11,0xFC,0x50,0x00,0x20,0x00,0x00,0x00,
};
char lei16S[]={
/* 以下是 '雷' 的 16点阵宋体 字模,32 byte */
0x1F,0xF8,0x01,0x00,0x7F,0xFE,0x41,0x04,
0x1D,0x70,0x01,0x00,0x1D,0x70,0x01,0x00,
0x3F,0xF8,0x21,0x08,0x21,0x08,0x3F,0xF8,
0x21,0x08,0x21,0x08,0x3F,0xF8,0x20,0x08,
};
char you12S[]={
/* 以下是 '游' 的 12点阵宋体 字模,24 byte */
0x91,0x00,0x49,0xE0,0x3E,0x00,0x93,0xE0,
0x5C,0x40,0x54,0x80,0x55,0xE0,0x94,0x80,
0x94,0x80,0xA4,0x80,0x4D,0x80,0x00,0x00,
};
char xi12S[]={
/* 以下是 '戏' 的 12点阵宋体 字模,24 byte */
0x02,0x80,0xF2,0x40,0x12,0x40,0x13,0xE0,
0x9E,0x00,0x52,0x40,0x22,0x80,0x31,0x00,
0x49,0x20,0x42,0xA0,0x8C,0x60,0x00,0x00,
};
char kai12S[]={
/* 以下是 '开' 的 12点阵宋体 字模,24 byte */
0x00,0x40,0x7F,0xE0,0x11,0x00,0x11,0x00,
0x11,0x00,0xFF,0xE0,0x11,0x00,0x11,0x00,
0x11,0x00,0x21,0x00,0xC1,0x00,0x00,0x00,
};
char ju12S[]={
/* 以下是 '局' 的 12点阵宋体 字模,24 byte */
0x3F,0xC0,0x20,0x40,0x3F,0xC0,0x20,0x00,
0x3F,0xE0,0x20,0x20,0x2F,0x20,0x29,0x20,
0x4F,0x20,0x49,0x20,0x80,0xC0,0x00,0x00,
};
char tui12S[]={
/* 以下是 '退' 的 12点阵宋体 字模,24 byte */
0x8F,0xC0,0x48,0x40,0x4F,0xC0,0x08,0x40,
0xCF,0xC0,0x48,0x00,0x4B,0x40,0x48,0x80,
0x4E,0x40,0xB0,0x00,0x8F,0xE0,0x00,0x00,
};
char chu12S[]={
/* 以下是 '出' 的 12点阵宋体 字模,24 byte */
0x04,0x00,0x44,0x40,0x44,0x40,0x44,0x40,
0x7F,0xC0,0x04,0x00,0x44,0x40,0x44,0x40,
0x44,0x40,0x44,0x40,0x7F,0xC0,0x00,0x00,
};
char nan12S[]={
/* 以下是 '难' 的 12点阵宋体 字模,24 byte */
0x02,0x80,0x02,0x80,0xF7,0xE0,0x14,0x80,
0x9F,0xE0,0x54,0x80,0x24,0x80,0x27,0xE0,
0x54,0x80,0x94,0x80,0x07,0xE0,0x00,0x00,
};
char du12S[]={
/* 以下是 '度' 的 12点阵宋体 字模,24 byte */
0x02,0x00,0x7F,0xE0,0x48,0x80,0x7F,0xE0,
0x48,0x80,0x4F,0x80,0x40,0x00,0x5F,0x80,
0x45,0x00,0x87,0x00,0xB8,0xE0,0x00,0x00,
};
char yi12S[]={
/* 以下是 '易' 的 12点阵宋体 字模,24 byte */
0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,
0x3F,0x80,0x10,0x00,0x3F,0xC0,0xC9,0x40,
0x12,0x40,0x64,0x40,0x19,0x80,0x00,0x00,
};
char zhong12S[]={
/* 以下是 '中' 的 12点阵宋体 字模,24 byte */
0x04,0x00,0x04,0x00,0x7F,0xC0,0x44,0x40,
0x44,0x40,0x44,0x40,0x7F,0xC0,0x04,0x00,
0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,
};
void drawmat(char *mat,int matsize,int x,int y,int color){/*点阵字显示函数*/
int i,j,k,n;
n=(matsize-1)/8+1;/*有几个字符位*/
for(j=0;j<matsize;j++)/*行*/
for(i=0;i<n;i++)
for(k=0;k<8;k++)
if(mat[j*n+i]&0x80>>k)
putpixel(x+i*8+k,y+j,color);
}
void game_over(){
int x,y;
setcolor(BLACK);
for(y=0;y<my;y++)
for(x=0;x<mx;x++)
if(map[y][x]&1){
setfillstyle(SOLID_FILL,LIGHTGRAY);
bar(ha_x+2+x*10,ha_y+2+y*10,ha_x+2+x*10+8,ha_y+2+y*10+8);
circle(ha_x+2+x*10+4,ha_y+2+y*10+4,3);/*地雷图*/
setfillstyle(SOLID_FILL,BLACK);
floodfill(ha_x+2+x*10+4,ha_y+2+y*10+4,BLACK);/*黑色填充*/
}
}
void win(){
setviewport(0,0,639,479,0);
settextstyle(0,0,3);
setcolor(WHITE);
outtextxy(216,211,"you win!!!");/****************显示you win****************/
setcolor(GREEN);
outtextxy(215,210,"you win!!!");/****************显示you win****************/
}
void box_open(int x,int y,int control){/*方格被打开,control用于判断是否是鼠标点击打开,1表示鼠标点击,0表示自动*/
int sum=0;
char num[2];
if(map[y][x]>>2&1 && control)return;/*标记过,点击无效*/
if(map[y][x]>>1&1)return;/*检查是否被打开过*/
map[y][x]+=1<<1;
setfillstyle(SOLID_FILL,LIGHTGRAY);
bar(ha_x+2+x*10,ha_y+2+y*10,ha_x+2+x*10+8,ha_y+2+y*10+8);
if(map[y][x]&1==1){/*踩到地雷,游戏失败*/
game_over();
dead=1;/*死亡*/
return;
}
score++;/*加分*/
if(score==mx*my-count){
win();
dead=1;
return;
}
if(x!=0)sum+=map[y][x-1]&1;
if(x!=mx-1)sum+=map[y][x+1]&1;
if(y!=0)sum+=map[y-1][x]&1;
if(y!=my-1)sum+=map[y+1][x]&1;
if(x!=0 && y!=0)sum+=map[y-1][x-1]&1;
if(x!=mx-1 && y!=0)sum+=map[y-1][x+1]&1;
if(x!=mx-1 && y!=my-1)sum+=map[y+1][x+1]&1;
if(x!=0 && y!=my-1)sum+=map[y+1][x-1]&1;
settextstyle(0,0,1);
if(sum!=0){
sprintf(num,"%d",sum);
setcolor(sum%6);/*确定颜色*/
outtextxy(ha_x+2+x*10+1,ha_y+2+y*10+1,num);/*显示周围雷数*/
}
else{
if(x!=0 && !map[y][x-1]&1)box_open(x-1,y,0);/*0表示自动打开*/
if(x!=mx-1 && !map[y][x+1]&1)box_open(x+1,y,0);
if(y!=0 && !map[y-1][x]&1)box_open(x,y-1,0);
if(y!=my-1 && !map[y+1][x]&1)box_open(x,y+1,0);
if(x!=0 && y!=0 && !map[y-1][x-1]&1)box_open(x-1,y-1,0);
if(x!=mx-1 && y!=0 && !map[y-1][x+1]&1)box_open(x+1,y-1,0);
if(x!=mx-1 && y!=my-1 && !map[y+1][x+1])box_open(x+1,y+1,0);
if(x!=0 && y!=my-1 && !map[y+1][x-1])box_open(x-1,y+1,0);
}
}
void box_mark(int x,int y){/*给小方块插旗标记*/
int nx=ha_x+2+x*10,ny=ha_y+2+y*10;
if(map[y][x]>>1&1)return;/*已经打开*/
if(map[y][x]>>2&1)map[y][x]-=1<<2;/*有旗拔旗*/
else map[y][x]+=1<<2;/*插旗*/
setfillstyle(SOLID_FILL,LIGHTGRAY);
setcolor(WHITE);
line(ha_x+2+x*10,ha_y+2+y*10,ha_x+2+x*10+8,ha_y+2+y*10);/*一横,使之有立体感*/
line(ha_x+2+x*10,ha_y+2+y*10+1,ha_x+2+x*10,ha_y+2+y*10+8);/*一竖*/
bar(ha_x+2+x*10+1,ha_y+2+y*10+1,ha_x+2+x*10+8,ha_y+2+y*10+8);
if(map[y][x]>>2&1){
setcolor(RED); /*绘制小旗帜*/
line(nx+3,ny+2,nx+7,ny+4);
line(nx+3,ny+4,nx+7,ny+4);
setcolor(BLACK);
line(nx+3,ny+2,nx+3,ny+7);
line(nx+2,ny+7,nx+4,ny+7);
}
}
void map_window(){/*地图绘制*/
int x,y;
setfillstyle(SOLID_FILL,BLACK);/*清除屏幕*/
bar(1,40,638,478);/*清除屏幕*/
setcolor(WHITE);
rectangle(ha_x,ha_y,ha_x+1+mx*10+1,ha_y+1+my*10+1);
setfillstyle(SOLID_FILL,DARKGRAY);
bar(ha_x+1,ha_y+1,ha_x+1+mx*10,ha_y+1+my*10);/*扫雷部分背景*/
rectangle(ha_x,ha_y-30,ha_x+1+mx*10+1,ha_y);/*扫雷上部分*/
setfillstyle(SOLID_FILL,LIGHTGRAY);
bar(ha_x+1,ha_y-29,ha_x+1+mx*10,ha_y-1);/*扫雷上部分*/
setfillstyle(SOLID_FILL,LIGHTGRAY);/*绘制开局框--*/
setcolor(WHITE);
line((ha_x+ha_x+2+mx*10)/2-16,(ha_y+ha_y-30)/2-9,(ha_x+ha_x+2+mx*10)/2-16,(ha_y+ha_y-30)/2+8);/*竖*/
line((ha_x+ha_x+2+mx*10)/2-15,(ha_y+ha_y-30)/2-9,(ha_x+ha_x+2+mx*10)/2+15,(ha_y+ha_y-30)/2-9);/*横*/
setcolor(DARKGRAY);
line((ha_x+ha_x+2+mx*10)/2+16,(ha_y+ha_y-30)/2-9,(ha_x+ha_x+2+mx*10)/2+16,(ha_y+ha_y-30)/2+9);/*竖*/
line((ha_x+ha_x+2+mx*10)/2-15,(ha_y+ha_y-30)/2+9,(ha_x+ha_x+2+mx*10)/2+15,(ha_y+ha_y-30)/2+9);/*横*/
bar((ha_x+ha_x+2+mx*10)/2-15,(ha_y+ha_y-30)/2-8,(ha_x+ha_x+2+mx*10)/2+15,(ha_y+ha_y-30)/2+8);/*--绘制开局框*/
drawmat(kai12S,12,(ha_x+ha_x+2+mx*10)/2-13,(ha_y+ha_y-30)/2-6,BLACK);
drawmat(ju12S,12,(ha_x+ha_x+2+mx*10)/2+1,(ha_y+ha_y-30)/2-6,BLACK);
setfillstyle(SOLID_FILL,LIGHTGRAY);
for(y=0;y<my;y++)/*显示小方格*/
for(x=0;x<mx;x++){
setcolor(WHITE);
line(ha_x+2+x*10,ha_y+2+y*10,ha_x+2+x*10+8,ha_y+2+y*10);/*一横,使之有立体感*/
line(ha_x+2+x*10,ha_y+2+y*10+1,ha_x+2+x*10,ha_y+2+y*10+8);/*一竖*/
/*setcolor(DARKGRAY);
line(ha_x+2+x*10,ha_y+2+y*10+8,ha_x+2+x*10+8,ha_y+2+y*10+8); 一横
line(ha_x+2+x*10+8,ha_y+2+y*10+1,ha_x+2+x*10+8,ha_y+2+y*10+8); 一竖
bar(ha_x+2+x*10+1,ha_y+2+y*10+1,ha_x+2+x*10+7,ha_y+2+y*10+7);
*/
bar(ha_x+2+x*10+1,ha_y+2+y*10+1,ha_x+2+x*10+8,ha_y+2+y*10+8);
}
}
void initmap(){/*地图初始化*/
int i=0,x,y;
dead=0;
score=0;
switch(hard){
case 0:
mx=9;
my=9;
count=10;
break;
case 1:
mx=16;
my=16;
count=40;
break;
case 2:
mx=30;
my=16;
count=99;
break;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -