⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 saolei.c

📁 c语言实现的扫雷游戏
💻 C
📖 第 1 页 / 共 2 页
字号:
/*********************************
作者: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 + -