c语言实现,图形界面扫雷

来源:互联网 发布:下拉菜单获取数据库 编辑:程序博客网 时间:2024/05/16 14:24

时隔一年多,突然找到了大一暑假用c语言写的扫雷游戏,想起了那个大一的自己,额,15天写了一个扫雷也是蛮拼的,大一留下的东西,然而现在已经看不懂当时的代码代码了。就只剩当时的思路。
写这篇博客,附上代码,有兴趣的朋友可以玩玩,想写扫雷的同学,也可以借鉴下,特别是点击一下,出现大片空白区域,那个地方可以多看看,个人觉得很难,当时把我难得够呛。
代码命名成c++格式,如:1.cpp,主要是为了应用c++的一个图形库,但是其中的语法都是c的语法,
其中用到了一个图形库graphics.h,我用的是vc编辑器,没有这个库,所有需要补一个graphics库,这里下载

这里写图片描述

代码如下:

////////////////////////////程序名称:扫雷           ////作者:      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;}

编写大体思路是这样的,用一个二维数组模拟面板棋盘。每个位置都对应一个坐标,然后根据坐标个变化,去显示成图像就成了,大多数棋盘游戏都是这样。

2 0
原创粉丝点击