c語言實現,圖形界面掃雷

時隔一年多,突然找到了大一暑假用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;
}

編寫大體思路是這樣的,用一個二維數組模擬面板棋盤。每個位置都對應一個座標,然後根據座標個變化,去顯示成圖像就成了,大多數棋盤遊戲都是這樣。

發佈了57 篇原創文章 · 獲贊 84 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章