【消消乐】源代码

友情提示:vc++6.0需要加装easyx库,这是一个图形库(个人认为这个库不错,太适合新手做一些有意思的效果),具体教程见前文,如果没有添加的话,是不能编译运行通过的,也就见不到效果。

#include

#include

#include

#include

#define KEY_DOWN(vk_c)(GetAsyncKeyState(vk_c)&0x8000)

typedef struct position{

    int x;

    int y;

}posType;

int index;//同色小球的个数

void init();//初始化游戏窗口

void gamebegin();//游戏开始界面

void gameplay();//玩游戏的具体过程

void close();//结束游戏,释放资源

void drawcursor(posType cur,COLORREF c1);//绘制光标

void drawtime(int sec);//绘制时间

void drawscore(int score);//绘制分数

void getsamecolorballs(posType cur,COLORREF c1);//获得光标所在位置周围的同色小球,计算同色小球的个数,并存入数组

int isValid(posType cur,COLORREF c1);//判断同色小球是否合法

void ballsfall();//小球下落

COLORREF colorArr[6]={RGB(200,0,0),RGB(0,200,0),RGB(0,0,200),RGB(200,200,0),RGB(200,0,200),RGB(0,200,200)};

posType cur;//定义当前光标位置

posType ballsArr[180];//同色小球坐标

void main()

{

    init();//初始化游戏窗口

    gamebegin();//游戏开始界面         

    gameplay();//玩游戏的具体过程

    close();//结束游戏,释放资源

}

void init()

{

    initgraph(1000,700);

}

void close()

{

    getch();

    closegraph();

}

void gamebegin()

{

    //绘制游戏边框     

    setlinecolor(RGB(50,50,50));

    setlinestyle(PS_SOLID,10);

    rectangle(255,45,745,655);

    //绘制小球

    srand((unsigned)time(NULL));   

    setlinestyle(PS_SOLID,1); 

    for(int x=280;x<740;x+=40)

    {

        for(int y=70;y<650;y+=40)

        {

            COLORREF c1=colorArr[rand()%6];   

            setfillcolor(c1);        

            setlinecolor(c1);

            fillcircle(x,y,18);

        }

    }

    //绘制移动光标

    cur.x=480;

    cur.y=390;

    drawcursor(cur,RGB(255,255,255));

    //绘制时间 drawtime(30);

    //绘制分数 drawscore(0);

}

void gameplay()

{

    int score=0;

    for(int i=300;i>0;i--)

    {

        if(i%10==0)

        {

            drawtime(i/10);

        }

        if(KEY_DOWN(VK_UP)&&cur.y>70)

        {

            drawcursor(cur,BLACK);//绘制黑光标

            cur.y-=40;//移动当前光标位置

            drawcursor(cur,WHITE);//绘制白光标

        }

        else if(KEY_DOWN(VK_DOWN)

        &&cur.y<630)

        {

            drawcursor(cur,BLACK);//绘制黑光标

            cur.y+=40;//移动当前光标位置

            drawcursor(cur,WHITE);//绘制白光标

        }

        else if(KEY_DOWN(VK_LEFT)

        &&cur.x>280)

        {

            drawcursor(cur,BLACK);//绘制黑光标

            cur.x-=40;//移动当前光标位置

            drawcursor(cur,WHITE);//绘制白光标

        }

        else if(KEY_DOWN(VK_RIGHT)

        &&cur.x<720)

        {

            drawcursor(cur,BLACK);//绘制黑光标

            cur.x+=40;//移动当前光标位置

            drawcursor(cur,WHITE);//绘制白光标

        }

        else if(KEY_DOWN(VK_RETURN)

        ||KEY_DOWN(VK_SPACE))

        {

            //获得光标所在位置周围的同色小球,计算同色小球的个数,并存入数组   

            getsamecolorballs

            (cur,getpixel(cur.x,cur.y));

            //同色小球消失一段时间(将数组中元素置黑)

            if(index>1)

            {

                for(int k=0;k

                {

                    setfillcolor(BLACK);   

                    setlinecolor(BLACK);   

            fillcircle(ballsArr[k].x,ballsArr[k].y,18);

                }

                //小球下落

                Sleep(500);

                ballsfall();

                score+=index;

                drawscore(score);

            }

            index=0;

        }

        Sleep(100);

    }

    cleardevice();

    settextcolor(RGB(255,0,0));

    settextstyle(80, 0, _T("黑体"));

    char s[] = "Game over";   

    outtextxy(300, 300, s);

    drawscore(score);

    Sleep(500);

}

void drawcursor(posType cur,COLORREF c1)

{

    setlinecolor(c1);

    rectangle(cur.x-20,cur.y- 

    20,cur.x+20,cur.y+20);

}

void drawtime(int sec)

{

    char str[30]; 

    settextcolor(RGB(255,255,0));

    settextstyle(25, 0, _T("黑体")); 

    sprintf(str,"剩余时间: %2d s",sec);   

    outtextxy(20, 50, str);

}

void drawscore(int score)

{

    char str[30];

    settextcolor(RGB(255,0,0));

    settextstyle(25, 0, _T("黑体"));

    sprintf(str,"分数: %d",score);   

    outtextxy(20, 550, str);

}

void getsamecolorballs(posType cur,COLORREF c1)

{

    ballsArr[index].x=cur.x;

    ballsArr[index].y=cur.y;

    index++;

    posType tempos;

    for(int k=0;k<4;k++)

    {

        switch(k){ 

        case 0:

        tempos.x=cur.x;

        tempos.y=cur.y-40;

        break;//上

        case 1:

        tempos.x=cur.x;

        tempos.y=cur.y+40;

        break;//下

        case 2:

        tempos.x=cur.x-40;

        tempos.y=cur.y;

        break;//左

        case 3:

        tempos.x=cur.x+40;

        tempos.y=cur.y;

        break;//右

        }

        if(isValid(tempos,c1))

        {

            getsamecolorballs(tempos,c1);

        }

    }

}

int isValid(posType cur,COLORREF c1)

{

    if(getpixel(cur.x,cur.y)!=c1)

    {

        return 0;

    }

    else

    {

        for(int k=0;k

        {   

            if(ballsArr[k].x==cur.x

            &&ballsArr[k].y==cur.y)

            {

                return 0;

            }

        }

        return 1;

    }

}

void rank()

{

    int i,j;

    posType temp;

    for(i=0;i

    {

        for(j=0;j

        {

            if(ballsArr[j].y>ballsArr[j+1].y)

            {

                temp=ballsArr[j];   

                ballsArr[j]=ballsArr[j+1];

                ballsArr[j+1]=temp;

            }

        }

    }

}

void ballsfall()

{

    rank();

    for(int i=0;i

    {

        for(int k=ballsArr[i].y;k>70;k-=40)

        {

      setfillcolor(getpixel(ballsArr[i].x,k-40));          setlinecolor(getpixel(ballsArr[i].x,k-40));        fillcircle(ballsArr[i].x,k,18);

        }

        COLORREF c1=colorArr[rand()%6];   

        setfillcolor(c1);    

        setlinecolor(c1);

        fillcircle(ballsArr[i].x,70,18);

    }

}

你可能感兴趣的:(【消消乐】源代码)