五子棋小案例

#include<graphics.h>
#include<windows.h>
#include<iostream>
#define MAX 20
using namespace std;
bool flag=true;
int temp=1;  // 为了实现黑白棋子的交替,使用全局变量
void qizi(int array2[][MAX],int array3[][MAX],int array1[][MAX]);
void huaqizi1(int array2[][MAX],int array3[][MAX],int array1[][MAX],mouse_msg msg);
void huaqizi2(int array2[][MAX],int array3[][MAX],int array1[][MAX],mouse_msg msg);
void huaqizi3(int array2[][MAX],int array3[][MAX],int array1[][MAX],mouse_msg msg);
void huaqizi4(int array2[][MAX],int array3[][MAX],int array1[][MAX],mouse_msg msg);


void PanDuanBaiZi1(int array2[][MAX],int a,int b);
void PanDuanBaiZi2(int array2[][MAX],int a,int b);
void PanDuanBaiZi3(int array2[][MAX],int a,int b);
void PanDuanBaiZi4(int array2[][MAX],int a,int b);

void PanDuanHeiZi1(int array3[][MAX],int a,int b);
void PanDuanHeiZi2(int array3[][MAX],int a,int b);
void PanDuanHeiZi3(int array3[][MAX],int a,int b);
void PanDuanHeiZi4(int array3[][MAX],int a,int b);
int main(void)
{
    //储存白子,只要交叉点的坐标下了白子,就将该坐标置为2
    int array2[MAX][MAX]={0};
    //储存黑子,只要交叉点的坐标下了黑子,就将该坐标置为3
    int array3[MAX][MAX]={0};
    //储存棋子,只要该坐标下了棋子,就置为1,则该点不能被重新下棋子
    int array1[MAX][MAX]={0};
    int k;
    //接下来的几个循环是将棋盘外面的区域置为1,表明不可被下棋子
    for(k=0;k<MAX;k++)
    {
        array1[0][k]=1;
    }
    int q;
    for(q=0;q<MAX;q++)
    {
        array1[q][0]=1;
    }
    int w;
    for(w=0;w<MAX;w++)
    {
        array1[15][w]=1;
    }
    int h,m;
    for(m=15;m<MAX;m++)
    {
        for(h=0;h<15;h++)
        {
            array1[h][m]=1;
        }
    }


    initgraph(800,600);
    setcolor(GREEN);
    //画棋盘,横有十四条线,纵有十四条线
    int i;
    for(i=40;i<=560;i=i+40)
    {
        line(i,40,i,560);
    }
    int j;
    for(j=40;j<=560;j=j+40)
    {
        line(40,j,560,j);
    }
    //接下来是对棋子的操作
    qizi(array2,array3,array1);
    getch();
    closegraph();
    return 0;
}


void qizi(int array2[][MAX],int array3[][MAX],int array1[][MAX])
{
    //鼠标函数实现
    mouse_msg msg={0};
    for(; is_run()&&temp==1; delay_fps(60))
    {
        while(mousemsg())
        {
            msg=getmouse();
        }
        //接下来四个区域,要实现当鼠标点击时,离该点最近的交叉点画圆,
        //确保每个棋子都落在交叉点上
        //以下四个函数是对该思路的算法实现
        if(msg.x%40<=18&&msg.y%40<=18)
        {
            huaqizi1(array2,array3,array1,msg);
        }
        else if(msg.x%40<18&&msg.y%40>18)
        {
            huaqizi2(array2,array3,array1,msg);
        }
        else if(msg.x%40>18&&msg.y%40<18)
        {
            huaqizi3(array2,array3,array1,msg);
        }
        else if(msg.x%40>18&&msg.y%40>18)
        {
            huaqizi4(array2,array3,array1,msg);
        }


    }
}


void huaqizi1(int array2[][MAX],int array3[][MAX],int array1[][MAX],mouse_msg msg)
{
    if(array1[(int)msg.y/40][(int)msg.x/40]==0)
    {
        if(msg.is_left()&&msg.is_down())
        {
            if(flag==true)
            {
                int a,b;
                a=(int)msg.y/40;
                b=(int)msg.x/40;
                setcolor(WHITE);
                setfillcolor(WHITE);
                fillellipse((int)msg.x/40*40,(int)msg.y/40*40,18,18);
                flag=false;//此处的目的是为了使黑白棋子交替
                Sleep(300);
                //每下一颗棋子,就将坐标置为1
                array1[(int)msg.y/40][(int)msg.x/40]=1;
                //每下一颗白棋子棋子,就将坐标置为2
                array2[(int)msg.y/40][(int)msg.x/40]=2;
                //接下来就是判断白子是否胜利
             PanDuanBaiZi1(array2,a,b);
             PanDuanBaiZi2(array2,a,b);
             PanDuanBaiZi3(array2,a,b);
             PanDuanBaiZi4(array2,a,b);


            }else if(flag==false)
            {
                int a,b;
                a=(int)msg.y/40;
                b=(int)msg.x/40;
                setcolor(WHITE);
                setfillcolor(BLACK);
                fillellipse((int)msg.x/40*40,(int)msg.y/40*40,18,18);
                flag=true;
                Sleep(300);
                 array1[(int)msg.y/40][(int)msg.x/40]=1;
                 //每下一颗黑棋子,就将坐标置为3
                 array3[(int)msg.y/40][(int)msg.x/40]=3;
                  //接下来就是判断黑子是否胜利
                  PanDuanHeiZi1(array3,a,b);
                  PanDuanHeiZi2(array3,a,b);
                  PanDuanHeiZi3(array3,a,b);
                  PanDuanHeiZi4(array3,a,b);
            }
        }
    }

}


void huaqizi2(int array2[][MAX],int array3[][MAX],int array1[][MAX],mouse_msg msg)
{
    if(array1[(int)msg.y/40+1][(int)msg.x/40]==0)
    {
        if(msg.is_left()&&msg.is_down())
        {
            int a=(int)msg.y/40+1;
            int b=(int)msg.x/40;
            if(flag==true)
            {
                setcolor(WHITE);
                setfillcolor(WHITE);
                fillellipse((int)msg.x/40*40,((int)msg.y/40+1)*40,18,18);
                flag=false;
                Sleep(300);
                array1[(int)msg.y/40+1][(int)msg.x/40]=1;
                array2[(int)msg.y/40+1][(int)msg.x/40]=2;
                PanDuanBaiZi1(array2,a,b);
                PanDuanBaiZi2(array2,a,b);
                PanDuanBaiZi3(array2,a,b);
                PanDuanBaiZi4(array2,a,b);


            }
            else if(flag==false)
            {

                setcolor(WHITE);
                setfillcolor(BLACK);
                fillellipse((int)msg.x/40*40,((int)msg.y/40+1)*40,18,18);
                flag=true;
                Sleep(300);
                array1[(int)msg.y/40+1][(int)msg.x/40]=1;
                array3[(int)msg.y/40+1][(int)msg.x/40]=3;
                PanDuanHeiZi1(array3,a,b);
                PanDuanHeiZi2(array3,a,b);
                PanDuanHeiZi3(array3,a,b);
                PanDuanHeiZi4(array3,a,b);
            }
        }
    }

}
void huaqizi3(int array2[][MAX],int array3[][MAX],int array1[][MAX],mouse_msg msg)
{
    if(array1[(int)msg.y/40][(int)msg.x/40+1]==0)
    {
        if(msg.is_left()&&msg.is_down())
        {
             int a,b;
             a=(int)msg.y/40;
             b=(int)msg.x/40+1;
            if(flag==true)
            {

                setcolor(WHITE);
                setfillcolor(WHITE);
                fillellipse(((int)msg.x/40+1)*40,(int)msg.y/40*40,18,18);
                flag=false;
                Sleep(300);
                array1[(int)msg.y/40][(int)msg.x/40+1]=1;
                array2[(int)msg.y/40][(int)msg.x/40+1]=2;
                PanDuanBaiZi1(array2,a,b);
                PanDuanBaiZi2(array2,a,b);
                PanDuanBaiZi3(array2,a,b);
                PanDuanBaiZi4(array2,a,b);
            }
            else if(flag==false)
            {
                setcolor(WHITE);
                setfillcolor(BLACK);
                fillellipse(((int)msg.x/40+1)*40,(int)msg.y/40*40,18,18);
                flag=true;
                Sleep(300);
                array1[(int)msg.y/40][(int)msg.x/40+1]=1;
                array3[(int)msg.y/40][(int)msg.x/40+1]=3;
                PanDuanHeiZi1(array3,a,b);
                PanDuanHeiZi2(array3,a,b);
                PanDuanHeiZi3(array3,a,b);
                PanDuanHeiZi4(array3,a,b);
            }
        }
    }

}

void huaqizi4(int array2[][MAX],int array3[][MAX],int array1[][MAX],mouse_msg msg)
{
    if(array1[(int)msg.y/40+1][(int)msg.x/40+1]==0)
    {
        if(msg.is_left()&&msg.is_down())
        {
            int a,b;
            a=(int)msg.y/40+1;
            b=(int)msg.x/40+1;
            if(flag==true)
            {

                setcolor(WHITE);
                setfillcolor(WHITE);
                fillellipse(((int)msg.x/40+1)*40,((int)msg.y/40+1)*40,18,18);
                Sleep(300);
                flag=false;
                array1[(int)msg.y/40+1][(int)msg.x/40+1]=1;
                array2[(int)msg.y/40+1][(int)msg.x/40+1]=2;
                PanDuanBaiZi1(array2,a,b);
                PanDuanBaiZi2(array2,a,b);
                PanDuanBaiZi3(array2,a,b);
                PanDuanBaiZi4(array2,a,b);
            }
            else if(flag==false)
            {
                setcolor(WHITE);
                setfillcolor(BLACK);
                fillellipse(((int)msg.x/40+1)*40,((int)msg.y/40+1)*40,18,18);
                Sleep(300);
                flag=true;
                array1[(int)msg.y/40+1][(int)msg.x/40+1]=1;
                array3[(int)msg.y/40+1][(int)msg.x/40+1]=3;
                PanDuanHeiZi1(array3,a,b);
                PanDuanHeiZi2(array3,a,b);
                PanDuanHeiZi3(array3,a,b);
                PanDuanHeiZi4(array3,a,b);
            }
        }
    }
}

//接下来是判断棋子胜负的算法实现
/*
举个例子,当白子下落后,就往左循环判断不间断最远的白子的位置并记录,
接下来就从那里往右循环看白子是否是连续的五个,
这样的算法要四个,分别是从左到右,从上到下,斜上方到斜下方,斜下方到斜上方
若是,则白子赢,跳出循环,使棋盘不能被下棋子,并在界面显示白子胜利
判断黑子胜负的过程也是这样的。
*/
void PanDuanBaiZi1(int array2[][MAX],int a,int b)
{
    int c;
    for(;array2[a][b]==2;b--)
    {
        ;
    }
    c=b+1;
    int count1=0;
    for(;array2[a][c]==2;c++)
    {
        count1++;
    }
    if(count1==5)
    {
        setcolor(RED);
        setfont(20,12,"宋体");
        outtextxy(650,100,"白子胜利!");
        temp=0;

    }
}

void PanDuanBaiZi2(int array2[][MAX],int a,int b)
{
    int c;
    for(;array2[a][b]==2;a--)
    {
        ;
    }
    c=a+1;
    int count1=0;
    for(;array2[c][b]==2;c++)
    {
        count1++;
    }
    if(count1==5)
    {
        setcolor(RED);
        setfont(20,12,"宋体");
        outtextxy(650,100,"白子胜利!");
        temp=0;
    }
}

void PanDuanBaiZi3(int array2[][MAX],int a,int b)
{
    int c,d;
    for(;array2[a][b]==2;a--,b--)
    {
        ;
    }
    c=a+1;
    d=b+1;
    int count1=0;
    for(;array2[c][d]==2;c++,d++)
    {
        count1++;
    }
    if(count1==5)
    {
        setcolor(RED);
        setfont(20,12,"宋体");
        outtextxy(650,100,"白子胜利!");
        temp=0;

    }
}
void PanDuanBaiZi4(int array2[][MAX],int a,int b)
{
    int c,d;
    for(;array2[a][b]==2;a--,b++)
    {
        ;
    }
    c=a+1;
    d=b-1;
    int count1=0;
    for(;array2[c][d]==2;c++,d--)
    {
        count1++;
    }
    if(count1==5)
    {
        setcolor(RED);
        setfont(20,12,"宋体");
        outtextxy(650,100,"白子胜利!");
        temp=0;

    }
}


void PanDuanHeiZi1(int array3[][MAX],int a,int b)
{
    int c;
    for(;array3[a][b]==3;b--)
    {
        ;
    }
    c=b+1;
    int count1=0;
    for(;array3[a][c]==3;c++)
    {
        count1++;
    }
    if(count1==5)
    {
        setcolor(RED);
        setfont(20,12,"宋体");
        outtextxy(650,200,"黑子胜利!");
        temp=0;

    }
}

void PanDuanHeiZi2(int array3[][MAX],int a,int b)
{
     int c;
    for(;array3[a][b]==3;a--)
    {
        ;
    }
    c=a+1;
    int count1=0;
    for(;array3[c][b]==3;c++)
    {
        count1++;
    }
    if(count1==5)
    {
        setcolor(RED);
        setfont(20,12,"宋体");
        outtextxy(650,200,"黑子胜利!");
        temp=0;

    }
}

void PanDuanHeiZi3(int array3[][MAX],int a,int b)
{
     int c,d;
    for(;array3[a][b]==3;a--,b--)
    {
        ;
    }
    c=a+1;
    d=b+1;
    int count1=0;
    for(;array3[c][d]==3;c++,d++)
    {
        count1++;
    }
    if(count1==5)
    {
        setcolor(RED);
        setfont(20,12,"宋体");
        outtextxy(650,200,"黑子胜利!");
        temp=0;

    }
}

void PanDuanHeiZi4(int array3[][MAX],int a,int b)
{
    int c,d;
    for(;array3[a][b]==3;a--,b++)
    {
        ;
    }
    c=a+1;
    d=b-1;
    int count1=0;
    for(;array3[c][d]==3;c++,d--)
    {
        count1++;
    }
    if(count1==5)
    {
        setcolor(RED);
        setfont(20,12,"宋体");
        outtextxy(650,200,"黑子胜利!");
        temp=0;

    }
}



//以上代码要运行的话必须要安装ege图形库

总结:

这次小案例我觉得做的还行,用到了ege图形库,接触到了以前没有接触到的东西,学到了很多。

可是也有不足的地方:那就是没有一个“开始游戏”的动态gif画面。

还有就是没有“人机对战”的选项,因为我不会人机算法,如果我以后会的话,我会加上去。

 

总的来说,这次要感谢老师出这样一个题目,不然我还是浑浑噩噩的浪下去,不可能被动及主动的接收这样的知识。


猜你喜欢

转载自blog.csdn.net/xu_jin_ren_shuai/article/details/80980617