c++扫雷

想起大一的时候写的c语言代码现在又写了一遍.无聊ing
在这里插入图片描述

//
//程序名称:扫雷           //
//作者:      ys           //
//

#include <graphics.h>
#include <conio.h>
#include <time.h>
#include <stdlib.h>
#include <stdio.h>

void draw_circul(int x,int y,int row,int col);
int  init_system();
void draw_mode(int x,int y,int wm_wh,int type);
void draw_framework();
void set_mine(int num);
void draw_min_max_framework(int x1,int y1,int x2,int y2);
void draw_happyface(int type);
void draw_clock_score();
void draw_mine(int row,int col);
void mouse_clear_mine();
void round_mine_num();
int  deal_space(int x, int y);
void deal_situation(int y,int x);
void output_num();
void show_space(int y,int x);
void show_num(int y,int x);

#define FLAG        20
#define win         m_col*m_row
#define mine_num    20                  //雷的数目

int m_maxx,m_maxy;
int m_row,m_col,m_wh;
int x0,y0,num=0;
int **p;

int main(void)
{
    init_system();                      //初始化系统
    if(!init_system())
        exit(0);

    x0=(m_maxx-m_col*(m_wh+1))/2;
    y0=(m_maxy-m_row*(m_wh+1))/2;

    draw_circul(x0,y0,m_row,m_col);     //初始化界面
    draw_framework();                   //框架
    set_mine(mine_num);                     //布雷
    round_mine_num();                   //计算周围雷数
    mouse_clear_mine();                 //鼠标清雷

    getch();
    closegraph();
    return 0;
}
//鼠标清雷
void mouse_clear_mine() 
{
    MOUSEMSG m;
    m=GetMouseMsg();

    int x,y;

    while(1)
    {
        m=GetMouseMsg();
        x=(m.x-x0)/(m_wh+1);
        y=(m.y-y0)/(m_wh+1);

        switch(m.uMsg)
        {
            case WM_LBUTTONDOWN:
            {
                if (x0<m.x && m.x<((m_wh+1)*m_col+x0) && m.y>y0 && m.y<(y0+(m_wh+1)*m_row) && p[y][x]<8 && p[y][x]>-3)
                {
                    if (p[y][x]==-1)
                    {
                        draw_happyface(2);
                        for (int j=0;j<m_col;j++)
                            for (int i=0;i<m_row;i++)
                            {                   
                                if (p[i][j]==-1)
                                    draw_mine(j,i);
                                p[i][j]+=FLAG;
                            }
                        setlinecolor(RED);
                        line(x0+x*(m_wh+1)+2,y0+y*(m_wh+1)+2,x0+(x+1)*(m_wh+1)-2,y0+(y+1)*(m_wh+1)-2);
                        line(x0+(x+1)*(m_wh+1)-2,y0+y*(m_wh+1)+2,x0+x*(m_wh+1)+2,y0+(y+1)*(m_wh+1)-2);

                    }
                    if (p[y][x]==0)
                    {
                        show_space(y,x);
                    }
                    if(p[y][x]>0 && p[y][x]<9) 
                    {
                        show_num(y,x);
                    } 
                }
                else if (m.x>m_maxx/2-m_wh-5 && m.x<m_maxx/2+m_wh+5 && m.y>y0-m_wh*5/2-5 && m.y<y0-m_wh/2+5) 
                {
                    draw_mode(m_maxx/2-m_wh-5,y0-m_wh*5/2-5,2*m_wh+10,1);
                    Sleep(20);
                    main();
                }
                else if (num==win)
                {
                    exit(1);
                }
                else 
                {
                    ;
                }
            }break;
            case WM_RBUTTONDOWN:
                {
                    if (x0<m.x && m.x<((m_wh+1)*m_col+x0) && m.y>y0 && m.y<(y0+(m_wh+1)*m_row))
                    {
                        if (p[y][x]>15 || p[y][x]==-2)
                        {
                            ;
                        }
                        else if (p[y][x]<-10)
                        {
                            draw_mode(x0+(m_wh+1)*x,y0+(m_wh+1)*y,m_wh,1);
                            p[y][x]+=FLAG;
                        }
                        else
                        {
                            setlinecolor(RED);
                            line(x0+(m_wh+1)*x+3,y0+(m_wh+1)*y+3,x0+(m_wh+1)*x+3,y0+(m_wh+1)*(y+1)-6);
                            rectangle(x0+(m_wh+1)*x+3,y0+(m_wh+1)*y+3,x0+(m_wh+1)*(x+1)-8,y0+(m_wh+1)*y+8);
                            setfillstyle(SOLID_FILL);
                            setfillcolor(RED);
                            floodfill(x0+(m_wh+1)*x+4,y0+(m_wh+1)*y+4,RED);
                            p[y][x]-=FLAG;
                        }
                    }
                    else
                    {
                        ;
                    }
                }break; 
        }
    }
}

void show_space(int y,int x)
{
    if(y>=0 && y<m_row && x>=0 && x<m_col && p[y][x]==0)
    {
        draw_mode(x0+x*(m_wh+1),y0+y*(m_wh+1),m_wh,2);
        p[y][x]+=FLAG;
        num++;
        show_space(y-1,x);
        show_space(y,x-1);
        show_space(y+1,x);
        show_space(y,x+1);
    }
    if(y>=0 && y<m_row && x>=0 && x<m_col && p[y][x]>0 && p[y][x]<=8)
    {
        show_num(y,x);
        num++;
    }
}

void show_num(int y,int x)
{
    draw_mode(x0+x*(m_wh+1),y0+y*(m_wh+1),m_wh,2);
    if (p[y][x]==1)
        settextcolor(RED);
    if (p[y][x]==2)
        settextcolor(GREEN);
    if (p[y][x]==3)
        settextcolor(BLUE);
    if (p[y][x]==4)
        settextcolor(YELLOW);
    if (p[y][x]==5)
        settextcolor(BROWN);
    if (p[y][x]==6)
        settextcolor(RED);
    if (p[y][x]==7)
        settextcolor(GREEN);
    if (p[y][x]==8)
        settextcolor(BLUE);
    setbkmode(TRANSPARENT);     
    outtextxy(x0+x*(m_wh+1)+m_wh/3,y0+y*(m_wh+1)+m_wh/8,p[y][x]+48);
    p[y][x]+=FLAG;
}
//布雷
void set_mine(int num)  
{
    int k,i,j;
    int m=0;

    srand((unsigned)time(NULL));
    while(m<num)
    {
        k=rand()%(m_row*m_col);
        j=k%m_col;
        i=k/m_col;
        if(p[i][j]!=-1)
        {   
            p[i][j]=-1;
            m++;
        }
    }
}
//显示雷数
void round_mine_num()
{
    int i,j;
    for (i=0;i<m_row;i++)
        for (j=0;j<m_col;j++)
        {
            if (j<m_col-1 && i<m_row-1 && p[i][j]==-1 && p[i+1][j+1]!=-1)
                p[i+1][j+1]++;
            if (i<m_row-1 && p[i][j]==-1 && p[i+1][j]!=-1)
                p[i+1][j]++;
            if (i<m_row-1 && j>0 && p[i][j]==-1 && p[i+1][j-1]!=-1)
                p[i+1][j-1]++;
            if (j>0 && p[i][j]==-1 && p[i][j-1]!=-1)
                p[i][j-1]++;
            if (i>0 && j>0 && p[i][j]==-1 && p[i-1][j-1]!=-1)
                p[i-1][j-1]++;
            if (i>0 && p[i][j]==-1 && p[i-1][j]!=-1)
                p[i-1][j]++;
            if (i>0 && j<m_col-1 && p[i][j]==-1 && p[i-1][j+1]!=-1)
                p[i-1][j+1]++;
            if (j<m_col-1 && p[i][j]==-1 && p[i][j+1]!=-1)
                p[i][j+1]++;
        }
}
//画一个雷
void draw_mine(int col,int row)
{
    draw_mode(x0+col*(m_wh+1),y0+row*(m_wh+1),m_wh,2);

    setcolor(BLACK);
    circle(x0+m_wh/2+col*(m_wh+1),y0+m_wh/2+row*(m_wh+1),5);
    setfillstyle(SOLID_FILL);
    setfillcolor(BLACK);
    floodfill(x0+m_wh/2+col*(m_wh+1),y0+m_wh/2+row*(m_wh+1),BLACK);
}
//画界面模式
void draw_mode(int x,int y,int wm_wh,int type)
{
    if (type==1)
    {
        setcolor(WHITE);
        rectangle(x,y,x+wm_wh,y+wm_wh);
        setfillstyle(SOLID_FILL);
        setfillcolor(LIGHTGRAY);
        floodfill((x+x+wm_wh)/2,(y+y+wm_wh)/2,WHITE);

        setlinecolor(WHITE);
        line(x,y,x+wm_wh,y);
        line(x,y,x,y+wm_wh);
        setlinecolor(DARKGRAY);
        line(x+wm_wh,y,x+wm_wh,y+wm_wh);
        line(x,y+wm_wh,x+wm_wh,y+wm_wh);

        setlinecolor(WHITE);
        line(x+1,y+1,x+wm_wh-1,y+1);
        line(x+1,y+1,x+1,y+wm_wh-1);
        setlinecolor(DARKGRAY);
        line(x+wm_wh-1,y+1,x+wm_wh-1,y+wm_wh-1);
        line(x+1,y+wm_wh-1,x+wm_wh-1,y+wm_wh-1);
    }
    else
    {
        setcolor(WHITE);
        rectangle(x,y,x+m_wh,y+m_wh);
        setfillstyle(SOLID_FILL);
        setfillcolor(LIGHTGRAY);
        floodfill((x+x+m_wh)/2,(y+y+m_wh)/2,WHITE);

        setlinecolor(DARKGRAY);
        line(x,y,x+m_wh,y);
        line(x,y,x,y+m_wh);
        setlinecolor(WHITE);
        line(x+m_wh,y,x+m_wh,y+m_wh);
        line(x,y+m_wh,x+m_wh,y+m_wh);
    }
}
//画整个雷区界面
void draw_circul(int x,int y,int row,int col)
{
    int i,j;
    for (i=0;i<row;i++)
    {
        x=(m_maxx-m_col*(m_wh+1))/2;
        for (j=0;j<col;j++)
        {
            draw_mode(x,y,m_wh,1);
            x+=m_wh+1;
        }
        y+=m_wh+1;
    }
}
//画外围框架界面
void draw_framework()
{
    int x1,y1,x2,y2;
    x1=x0-m_wh;
    y1=y0-3*m_wh;
    x2=x0+(m_col*(m_wh+1))+m_wh;
    y2=y0+(m_row*(m_wh+1))+m_wh;

    draw_min_max_framework(x1,y1,x2,y2);
    draw_happyface(1);
    draw_clock_score();
}
//大框小框
void draw_min_max_framework(int x1,int y1,int x2,int y2)
{
    setlinecolor(WHITE);    
    rectangle(x0,y0,x0+m_col*(m_wh+1),y0+m_row*(m_wh+1));
    setlinecolor(WHITE);        
    rectangle(x1,y1,x2,y2);
    setfillstyle(SOLID_FILL);
    setfillcolor(LIGHTGRAY);
    floodfill(x1+2,y1+2,WHITE);
}
//笑脸
void draw_happyface(int type)
{
    draw_mode(m_maxx/2-m_wh-5,y0-m_wh*5/2-5,2*m_wh+10,1);

    setlinecolor(RED);  
    circle(m_maxx/2,y0-m_wh*3/2,m_wh);
    setfillstyle(BS_SOLID);
    setfillcolor(YELLOW);
    floodfill(m_maxx/2,y0-m_wh*3/2,RED);

    setlinecolor(BLACK);
    circle(m_maxx/2-m_wh/2,y0-2*m_wh+2,2);
    setfillstyle(BS_SOLID);
    setfillcolor(BLACK);
    floodfill(m_maxx/2-m_wh/2,y0-2*m_wh+2,BLACK);
    circle(m_maxx/2+m_wh/2,y0-2*m_wh+2,2);
    floodfill(m_maxx/2+m_wh/2,y0-2*m_wh+2,BLACK);
    setlinecolor(RED);  

    if (type==1)
        arc(m_maxx/2-m_wh/2,y0-m_wh*2,m_maxx/2+m_wh/2,y0-m_wh,3.4,6);
    else
    {
        arc(m_maxx/2-m_wh/2,y0-m_wh*3/2+2,m_maxx/2+m_wh/2,y0-m_wh/2+2,0.3,2.85);
    }
}
//时钟和计时器
void draw_clock_score()
{
    setlinecolor(WHITE);        
    rectangle(x0,y0-2*m_wh,x0+3*m_wh,y0-m_wh);
    setlinecolor(DARKGRAY);
    line(x0,y0-2*m_wh,x0+3*m_wh,y0-2*m_wh);
    line(x0,y0-2*m_wh,x0,y0-m_wh);

    setlinecolor(WHITE);
    rectangle(x0+(m_col-3)*(m_wh+1),y0-2*m_wh,x0+m_col*(m_wh+1),y0-m_wh);
    setlinecolor(DARKGRAY);
    line(x0+(m_col-3)*(m_wh+1),y0-2*m_wh,x0+(m_col-3)*(m_wh+1),y0-m_wh);
    line(x0+(m_col-3)*(m_wh+1),y0-2*m_wh,x0+m_col*(m_wh+1),y0-2*m_wh);
}
//初始化系统
int init_system()
{
    int gdriver=DETECT,gmode;
    initgraph(&gdriver,&gmode," ");

    m_maxx=getmaxx();
    m_maxy=getmaxy();
    m_row=10;
    m_col=15;
    m_wh=20;

    int  i,j;
    p=(int **)malloc(sizeof(int *)*m_row);
    if (!p)
      return 0;
    for(i=0;i<m_row;i++)
    {
        p[i]=(int *)malloc(sizeof(int)*m_col);
        if(!p[i])
          return 0;
    }

    for (i=0;i<m_row;i++)
        for (j=0;j<m_col;j++)
            p[i][j]=0;
    return 1;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值