黑白棋

来源:互联网 发布:域名绑定公网ip 编辑:程序博客网 时间:2024/05/16 19:17

 启动游戏后直接进入棋盘界面,我们就可以开始游戏了,当我们开始下棋时,我们有两个计数器分别对双方棋子数进行记录,以作为判定输赢的依据,游戏中包括的控制有: 

1)吃子:以方格为直线或者斜线的方向,以一方对照棋子和即将落下棋子之间(此两子之间必须没有空格且全部为对方棋子)的所有对方棋子被吃掉,被吃掉的对方棋子变为自己一方的棋子。  

2)下子:必须在可以吃子的位置处并且该位置为空格时可以落下己方的棋子,如果不能下子,棋子无法显示在棋盘上。   

3)赢棋:根据计数器记录的双方棋子数判定棋子数多的一方取得本次游戏的胜利,屏幕上面会自动出现对话框提示。

             

#include <stdio.h>#include <conio.h>#include <windows.h>#include <stdlib.h>#include <time.h>#include <iostream>#include <dos.h>using namespace std;#define Wall1 0#define Wall2 1#define Wall3 2#define Wall4 3#define Wall5 4#define Wall6 5#define Wall7 6#define Wall8 7#define Wall9 8#define Wall10 9#define Wall11 10#define Wall12 11#define Wall13 12#define Wall14 13void qipan();void y(int a,int b);int pd1(int a,int b);int tu[20][20];int t=0;int m=100;int ai,bj;int mmm;int s;int ii=0;void jishi()///*********************************************************计数器函数{    if(ii==0)        s=time(NULL);    printf("所用时长:    %d 秒\n",time(NULL)-s);    ii++;}void ji()///***********************************************************计算机函数1{    int bo[21][21];    int dd=1,i,j;    memset(bo,0,sizeof(bo));    for(i=2; i<21; i++,i++)    {        for(j=3; j<21; j++,j++)        {            if(tu[i][j]==Wall12)            {                tu[i][j]=Wall13;                int fl=pd1(i,j);                if(fl==1)                {                    bo[i][j]=dd;                    dd++;                }                tu[i][j]=Wall12;            }        }        cout<<endl;    }    if(mmm==2)        srand(time(NULL));    int sui=rand()%(dd-1)+1;    for(i=2; i<21; i++,i++)        for(j=3; j<21; j++,j++)        {            if(bo[i][j]==sui)            {                ai=i;                bj=j;                break;            }        }}int jishu()///*****************************************************计数器函数2{    int i,j,bai=0,hen=0;    for(i=1; i<=17; i++)        for(j=1; j<=18; j++)        {            if(tu[i][j]==Wall13)                bai++;            else if(tu[i][j]==Wall14)                hen++;        }    printf("白棋●:%d  黑棋○:%d\n",hen,bai);    if(bai==0)    {        cout<<"白棋胜利!"<<endl;        m=0;    }    if(hen==0)    {        cout<<"黑棋胜利!"<<endl;        m=0;    }    if(bai+hen==64)    {        if(hen>bai)            cout<<"黑棋胜利!"<<endl;        else if(bai>hen)            cout<<"白棋胜利!"<<endl;        else            cout<<"平局!"<<endl;        m=0;    }}void qipan1()///*************************************************人机3.1{    int i,j,n=1;    int mm;    int a,b;    system("cls");    printf("     1   2   3   4   5   6   7   8\n");    for(i=1; i<=17; i++)    {        for( j=1; j<=18; j++)        {            if(j==1)            {                if(i%2==0)                {                    printf("%d",n);                    n++;                }                else                    printf(" ");            }            switch(tu[i][j])            {            case Wall1:                printf("┌");                break;            case Wall2:                printf("─");                break;            case Wall3:                printf("┬");                break;            case Wall4:                printf("┐");                break;            case Wall5:                printf("├");                break;            case Wall6:                printf("┼");                break;            case Wall7:                printf("┤");                break;            case Wall8:                printf("│");                break;            case Wall9:                printf("└");                break;            case Wall10:                printf("┴");                break;            case Wall11:                printf("┘");                break;            case Wall12:                printf("  ");                break;            case Wall13:                printf("○");                break;            case Wall14:                printf("●");                break;            }        }        printf("\n");    }    jishi();    jishu();    while(m--)    {        if(t==0)        {            int mse=0;            for(i=2; i<20; i++,i++)            {                for(j=3; j<20; j++,j++)                {                    if(tu[i][j]==Wall12)                    {                        tu[i][j]=Wall14;                        int fl=pd1(i,j);                        if(fl==1)                        {                            mse=1;                            tu[i][j]=Wall12;                            break;                        }                        tu[i][j]=Wall12;                    }                }                if( mse==1)                {                    break;                }            }            if(mse==0)///让步;            {                t=1;                printf("白棋无法落子,黑棋落子:");            }            else                printf("白棋落子:");        }        else        {            int mse=0;            for(i=2; i<20; i++,i++)            {                for(j=3; j<20; j++,j++)                {                    if(tu[i][j]==Wall12)                    {                        tu[i][j]=Wall13;                        int fl=pd1(i,j);                        if(fl==1)                        {                            mse=1;                            tu[i][j]=Wall12;                            break;                        }                        tu[i][j]=Wall12;                    }                }                if(mse==1)                {                    break;                }            }            if(mse==0)///让步;            {                t=0;                printf("黑棋无法落子,白棋落子:");            }            else                printf("黑棋落子:");        }        printf("(格式:横坐标;空格;纵坐标)\n");        if(t==0)        {            scanf("%d %d",&a,&b);            a=a*2;            b=b*2+1;        }        else        {            ji();            a=ai;            b=bj;            Sleep(1600);        }        if(a<1||a>18||b<1||b>18)        {            printf("无效坐标,请重新输入!\n");            m++;            qipan1();        }        else        {            if(tu[a][b]==Wall13||tu[a][b]==Wall14)            {                printf("无效坐标\n");                m++;                qipan1();            }            else            {                if(t==1)                {                    tu[a][b]=Wall13;                    t=0;                }                else                {                    tu[a][b]=Wall14;                    t=1;                }                mm=pd1(a,b);                if(mm==0)                {                    tu[a][b]=Wall12;                    if(t==1)                        t=0;                    else                        t=1;                    printf("无效落子\n");                    m++;                    qipan1();                }                else                {                    y(a,b);                    qipan1();                }            }        }    }}void qipan2()///**********************************************************人人3.2{    int i,j,n=1;    int mm;    int a,b;    int start;    if(m==100)        int s=time(NULL);    system("cls");    printf("     1   2   3   4   5   6   7   8\n");    for(i=1; i<=17; i++)    {        for( j=1; j<=18; j++)        {            if(j==1)            {                if(i%2==0)                {                    printf("%d",n);                    n++;                }                else  printf(" ");            }            switch(tu[i][j])            {            case Wall1:                printf("┌");                break;            case Wall2:                printf("─");                break;            case Wall3:                printf("┬");                break;            case Wall4:                printf("┐");                break;            case Wall5:                printf("├");                break;            case Wall6:                printf("┼");                break;            case Wall7:                printf("┤");                break;            case Wall8:                printf("│");                break;            case Wall9:                printf("└");                break;            case Wall10:                printf("┴");                break;            case Wall11:                printf("┘");                break;            case Wall12:                printf("  ");                break;            case Wall13:                printf("○");                break;            case Wall14:                printf("●");                break;            }        }        printf("\n");    }    jishi();    jishu();    while(m--)    {        if(t==0)        {            int mse=0;            for(i=2; i<20; i++,i++)            {                for(j=3; j<20; j++,j++)                {                    if(tu[i][j]==Wall12)                    {                        tu[i][j]=Wall14;                        int fl=pd1(i,j);                        if(fl==1)                        {                            mse=1;                            tu[i][j]=Wall12;                            break;                        }                        tu[i][j]=Wall12;                    }                }                if( mse==1)                {                    break;                }            }            if(mse==0)///让步;            {                t=1;                if(m!=0)                    printf("白棋无法落子,黑棋落子:");            }            else                printf("白棋落子:");        }        else        {            int mse=0;            for(i=2; i<20; i++,i++)            {                for(j=3; j<20; j++,j++)                {                    if(tu[i][j]==Wall12)                    {                        tu[i][j]=Wall13;                        int fl=pd1(i,j);                        if(fl==1)                        {                            mse=1;                            tu[i][j]=Wall12;                            break;                        }                        tu[i][j]=Wall12;                    }                }                if(mse==1)                {                    break;                }            }            if(mse==0)///让步;            {                t=0;                if(m!=0)                    printf("黑棋无法落子,白棋落子:");            }            else                printf("黑棋落子:");        }        printf("(格式:横坐标;空格;纵坐标)\n");        scanf("%d %d",&a,&b);        if(a<1||a>8||b<1||b>8)        {            printf("无效坐标,请重新输入!\n");            m++;            qipan2();        }        else        {            a=a*2;            b=b*2+1;            if(tu[a][b]==Wall13||tu[a][b]==Wall14)            {                printf("无效坐标\n");                m++;                qipan2();            }            else            {                if(t==1)                {                    tu[a][b]=Wall13;                    t=0;                }                else                {                    tu[a][b]=Wall14;                    t=1;                }                mm=pd1(a,b);                if(mm==0)                {                    tu[a][b]=Wall12;                    if(t==1)                        t=0;                    else                        t=1;                    printf("无效落子\n");                    m++;                    qipan2();                }                else                {                    y(a,b);                    qipan2();                }            }        }    }}void jianbiao1()///**************************************************人机建初表4.1{    int i,j;    for(i=1; i<=18; i++)    {        tu[i][1]=Wall12;    }    tu[1][2]=Wall1;    tu[1][18]=Wall4;    for( i=3; i<=17; i++)    {        if(i%2==1)           tu[1][i]=Wall2;        else            tu[1][i]=Wall3;    }    for(i=2; i<18; i++)        for( j=2; j<=18; j++)        {            if(i%2==0)            {                if(j%2==0)                    tu[i][j]=Wall8;                else                    tu[i][j]=Wall12;            }            else if(i%2==1&&j==2)                tu[i][j]=Wall5;            else if(i%2==1&&j==18)                tu[i][j]=Wall7;            else if(i%2==1&&j%2==1)                tu[i][j]=Wall2;            else if(i%2==1&&j%2==0)                tu[i][j]=Wall6;        }    tu[17][2]=Wall9;    tu[17][18]=Wall11;    for( i=3; i<18; i++)    {        if(i%2==1)            tu[17][i]=Wall2;        else            tu[17][i]=Wall10;    }    tu[8][9]=Wall13;    tu[8][11]=Wall14;    tu[10][9]=Wall14;    tu[10][11]=Wall13;    qipan1();}void jianbiao2()///*****************************************************人人建初表4.2{    int i,j;    for(i=1; i<=18; i++)    {        tu[i][1]=Wall12;    }    tu[1][2]=Wall1;    tu[1][18]=Wall4;    for( i=3; i<=17; i++)    {        if(i%2==1)            tu[1][i]=Wall2;        else            tu[1][i]=Wall3;    }    for(i=2; i<18; i++)        for( j=2; j<=18; j++)        {            if(i%2==0)            {                if(j%2==0)                    tu[i][j]=Wall8;                else                    tu[i][j]=Wall12;            }            else if(i%2==1&&j==2)                tu[i][j]=Wall5;            else if(i%2==1&&j==18)                tu[i][j]=Wall7;            else if(i%2==1&&j%2==1)                tu[i][j]=Wall2;            else if(i%2==1&&j%2==0)                tu[i][j]=Wall6;        }    tu[17][2]=Wall9;    tu[17][18]=Wall11;    for( i=3; i<18; i++)    {        if(i%2==1)            tu[17][i]=Wall2;        else            tu[17][i]=Wall10;    }    tu[8][9]=Wall13;    tu[8][11]=Wall14;    tu[10][9]=Wall14;    tu[10][11]=Wall13;    qipan2();}int main()///***********************************************************运行5{    int i,j,n,mm;    printf("请选择对战方式:人机1or人人2\n");    scanf("%d",&n);    while(n!=1&&n!=2)    {        cout<<"重新输入"<<endl;        cin>>n;    }    if(n==1)    {        printf("选择难度:简单1or困难2\n");        cin>>mm;        while(mm!=1&&mm!=2)        {            cout<<"重新输入"<<endl;            cin>>mm;        }        if(mm==1)            mmm=1;        else            mmm=2;        jianbiao1();    }    else        jianbiao2();    return 0;}void yr(int a,int b,int yll,int x)///****以下八个函数是变换棋盘{    int i;    for(i=b+2; i<yll; i++,i++)    {        tu[a][i]=x;    }}void yl(int a,int b,int yll,int x){    int i;    for(i=b-2; i>yll; i--,i--)    {        tu[a][i]=x;    }}void xd(int a,int b,int yll,int x){    int i;    for(i=a+2; i<yll; i++,i++)    {       tu[i][b]=x;    }}void xu(int a,int b,int yll,int x){    int i;    for(i=a-2; i>yll; i--,i--)    {        tu[i][b]=x;    }}void xydd(int a,int b,int yll,int ylr,int x){    int i,j;    for(i=a+2,j=b+2; i<yll,j<ylr; i++,i++,j++,j++)        tu[i][j]=x;}void xyuu(int a,int b,int yll,int ylr,int x){    int i,j;    for(i=a-2,j=b-2; i>yll,j>ylr; i--,i--,j--,j--)       tu[i][j]=x;}void xyud(int a,int b,int yll,int ylr,int x){    int i,j;    for(i=a-2,j=b+2; i>yll,j<ylr; i--,i--,j++,j++)       tu[i][j]=x;}void xydu(int a,int b,int yll,int ylr,int x){    int i,j;    for(i=a+2,j=b-2; i<yll,j>ylr; i++,i++,j--,j--)        tu[i][j]=x;}void y(int a,int b)///******************************************************棋盘变换6{    int x=a,y=b;    int a2=a,b2=b;    int a1=a,b1=b;    int a3=a,b3=b;    int c1=a,d1=b;    int c2=a,d2=b;    int c3=a,d3=b;    int c4=a,d4=b;    while(b++,b++)    {        if(b==19)            break;        else if(tu[a][b]==tu[x][y])        {            int yll=b;            yr(x,y,yll,tu[x][y]);            break;        }        else if(tu[a][b]==Wall12)            break;    }    while(b2--,b2--)    {        if(b2==1)            break;        else if(tu[a2][b2]==tu[x][y])        {            int yll=b2;            yl(x,y,yll,tu[x][y]);            break;        }        else if(tu[a2][b2]==Wall12)            break;    }    while(a1++,a1++)    {        if(a1==20)            break;        else if(tu[a1][b1]==tu[x][y])        {            int yll=a1;            xd(x,y,yll,tu[x][y]);            break;        }        else if(tu[a1][b1]==Wall12)            break;    }    while(a3--,a3--)    {        if(a3==0)            break;        else if(tu[a3][b3]==tu[x][y])        {            int yll=a3;            xu(x,y,yll,tu[x][y]);            break;        }        else if(tu[a3][b3]==Wall12)            break;    }    while(c1++,c1++,d1++,d1++)    {        if(c1==20||d1==19)            break;        else if(tu[c1][d1]==tu[x][y])        {            int yll=c1;            int ylr=d1;            xydd(x,y,yll,ylr,tu[x][y]);            break;        }        else if(tu[c1][d1]==Wall12)            break;    }    while(c2--,c2--,d2--,d2--)    {        if(c1==0||d1==1)            break;        else if(tu[c2][d2]==tu[x][y])        {            int yll=c2;            int ylr=d2;            xyuu(x,y,yll,ylr,tu[x][y]);            break;        }        else if(tu[c2][d2]==Wall12)            break;    }    while(c4++,c4++,d4--,d4--)    {        if(c4==20||d4==1)            break;        else if(tu[c4][d4]==tu[x][y])        {            int yll=c4;            int ylr=d4;            xydu(x,y,yll,ylr,tu[x][y]);            break;        }        else if(tu[c4][d4]==Wall12)            break;    }    while(c3--,c3--,d3++,d3++)    {        if(c3==0||d3==18)            break;        else if(tu[c3][d3]==tu[x][y])        {            int yll=c3;            int ylr=d3;            xyud(x,y,yll,ylr,tu[x][y]);            break;        }        else if(tu[c3][d3]==Wall12)            break;    }}int pd1(int a,int b)///**************************************棋盘判断7{    int x=a,y=b;    int a2=a,b2=b;    int a1=a,b1=b;    int a3=a,b3=b;    int c1=a,d1=b;    int c2=a,d2=b;    int c3=a,d3=b;    int c4=a,d4=b;    while(b++,b++)    {        if(b==21)            break;        else if(tu[x][y+2]!=tu[x][y]&&tu[x][y+2]!=Wall12&&tu[a][b+2]==tu[x][y])        {            return 1;        }        else if(tu[a][b]==Wall12)            break;    }    while(b2--,b2--)    {        if(b2==-1)            break;        else if(tu[x][y-2]!=tu[x][y]&&tu[x][y-2]!=Wall12&&tu[a2][b2-2]==tu[x][y])        {            return 1;        }        else if(tu[a2][b2]==Wall12)            break;    }    while(a1++,a1++)    {        if(a1==20)            break;        else if(tu[x+2][y]!=tu[x][y]&&tu[x+2][y]!=Wall12&&tu[a1+2][b1]==tu[x][y])        {            return 1;        }        else if(tu[a1][b1]==Wall12)            break;    }    while(a3--,a3--)    {        if(a3==0)            break;        else if(tu[x-2][y]!=tu[x][y]&&tu[x-2][y]!=Wall12&&tu[a3-2][b3]==tu[x][y])        {            return 1;        }        else if(tu[a3][b3]==Wall12)            break;    }    while(c1++,c1++,d1++,d1++)    {        if(c1==20||d1==21)            break;        else if(tu[x+2][y+2]!=tu[x][y]&&tu[x+2][y+2]!=Wall12&&tu[c1+2][d1+2]==tu[x][y])        {            return 1;        }        else if(tu[c1][d1]==Wall12)            break;    }    while(c2--,c2--,d2--,d2--)    {        if(c1==0||d1==-1)            break;        else if(tu[x-2][y-2]!=tu[x][y]&&tu[x-2][y-2]!=Wall12&&tu[c2-2][d2-2]==tu[x][y])        {            return 1;        }        else if(tu[c2][d2]==Wall12)            break;    }    while(c4++,c4++,d4--,d4--)    {        if(c4==20||d4==-1)            break;        else if(tu[x+2][y-2]!=tu[x][y]&&tu[x+2][y-2]!=Wall12&&tu[c4+2][d4-2]==tu[x][y])        {            return 1;        }        else if(tu[c4][d4]==Wall12)            break;    }    while(c3--,c3--,d3++,d3++)    {        if(c3==0||d3==21)            break;        else if(tu[x-2][y+2]!=tu[x][y]&&tu[x-2][y+2]!=Wall12&&tu[c3-2][d3+2]==tu[x][y])        {            return 1;        }        else if(tu[c3][d3]==Wall12)            break;    }    return 0;}

0 0