分享

五子棋程序(运行环境:C++builder)

 上善若水teamo 2010-03-11
#include<iostream.h>
#define uchar unsigned char
#define lsh 13
//棋盘为13路
enum result{natu,nonl,nonu,vict,surr};
//对应落子后的结果:常规、非法、弃权、获胜、投降
enum crossing{black,white,air};
//对应一个交叉点的状态:黑子、白子、空
enum crossing qp[lsh][lsh];//声明一个数组,对应棋盘
bool w_play;//轮白方下棋
void init();//声明初始化函数
void show();//声明显示函数
enum result play();//声明对弈函数
bool verd(char*);//声明判断落子合法性的函数
bool five(char,char);//声明判断五子相连的函数
void main()
{
    enum result result0;    //落子后的结果
    init();                 //初始化函数
    while(true)
    {
        show();             //显示函数
        result0=play();     //对弈函数
        if(result0>nonu)
            break;
    }
    getchar();
    getchar();
}
void init()
{
    for(int i=0;i<lsh;i++)//整个棋盘初始化为全空
        for(int j=0;j<lsh;j++)
            qp[i][j]=air;
    w_play=false;//初始为黑棋下
}
void show()//显示函数
{
    int i,j;
    char b;
    cout<<endl;
    b='a';
    cout<<' ';
    for(i=0;i<lsh;i++)  //在最上一行显示各个列的编号
    {
        cout<<b<<' ';
        b++;
    }
    b='A';
    for(i=0;i<lsh;i++)
    {
        cout<<endl;
        cout<<b;       //每行开头,显示行的编号
        b++;
        for(j=0;j<lsh;j++)
        {
            switch(qp[i][j])
            {
                case black:
                    cout<<"○"; //显示黑子
                    break;
                case white:
                    cout<<"●"; //显示白子
                    break;
                case air:       //在不同位置显示交叉点
                    if(i==0)
                    {
                        if(j==0)
                            cout<<"┏";
                        else if(j==lsh-1)
                            cout<<"┓";
                        else
                            cout<<"┯";
                    }
                    else if(i==lsh-1)
                    {
                        if(j==0)
                            cout<<"┗";
                        else if(j==lsh-1)
                            cout<<"┛";
                        else
                            cout<<"┷";
                    }
                    else
                    {
                        if(j==0)
                            cout<<"┠";
                        else if(j==lsh-1)
                            cout<<"┨";
                        else
                            cout<<"┼";
                    }
                    break;
            }
        }
    }
    cout<<endl;
    cout<<"弃权:*"<<endl;//显示弃权、投降的提示信息
    cout<<"投降:$"<<endl;
    if(w_play)
        cout<<"●";//显示当前的走棋方为白方
    else
        cout<<"○";//显示当前的走棋方为黑方
}
enum result play()//五子棋对弈函数
{
    char key[3];//用于输入落子的坐标
    cin>>key;
    if(key[0]=='*')//弃权
    {
        w_play=!w_play;//换为另一方下棋
        return nonu;
    }
    else if(key[0]=='$')//投降
    {
        if(w_play)
            cout<<"黑方获胜!";
        else
            cout<<"白方获胜!";
        return surr;
    }
    else if(verd(key))//普通的合法输入
    {
        if(five(key[0],key[1]))//判断五子
        {
            if(w_play)
                cout<<"白方获胜!";
            else
                cout<<"黑方获胜!";
            return vict;
        }
        w_play=!w_play;//换为另一方下棋
        return natu;
    }
    else//非法输入
    {
        cout<<"输入错误!请重新输入!";
        return nonl;
    }
}
bool verd(char *p)
{//判断输入是否合法,如合法则转换成相应的坐标
    if(p[0]<'A' || p[0]>=('a'+lsh) || p[0]>=('A'+lsh) && p[0]<'a')//非法字符
        return false;
    if(p[1]<'A' || p[1]>=('a'+lsh) || p[1]>=('A'+lsh) && p[1]<'a')//非法字符
        return false;
    if(p[0]>0x60)//以下把输入的字母转换成数值下标
        p[0]=p[0]-0x61;
    else
        p[0]=p[0]-0x41;
    if(p[1]>0x60)
        p[1]=p[1]-0x61;
    else
        p[0]=p[0]-0x41;
    if(qp[p[0]][p[1]]!=air)//该处有子
        return false;
    if(w_play)//在棋盘数组中进行记录
        qp[p[0]][p[1]]=white;
    else
        qp[p[0]][p[1]]=black;
    return true;
}
bool five(char x,char y)//判断五子相连的函数
{
    char n,i,j;
    enum crossing z=qp[x][y];//Z是刚落下的棋子
    n=0;
    j=y;
    while(j>0)//检查横向是否五子相连
    {
        if(qp[x][j-1]==z)//看看左边是不是同色棋子
            j--;
        else
            break;
    }
    while(qp[x][j]==z)//看看右边是不是同色棋子
    {
        if(j++==lsh)
            break;
        if(++n==5)
            return true;
    }
    n=0;
    i=x;
    while(i>0)//检查纵向是否五子相连
    {
        if(qp[i-1][y]==z)//看看上边是不是同色棋子
            i--;
        else
            break;
    }
    while(qp[i][y]==z)//看看下边是不是同色棋子
    {
        if(i++==lsh)
            break;
        if(++n==5)
            return true;
    }
    i=x;
    j=y;
    n=0;
    while(i>0 && j>0)//检查左上右下方向是否五子相连
    {
        if(qp[i-1][j-1]==z)//看看左上是不是同色棋子
        {
            i--;
            j--;
        }
        else
            break;
    }
    while(qp[i][j]==z)//看看右下是不是同色棋子
    {
        if(i++==lsh)
            break;
        if(j++==lsh)
            break;
        if(++n==5)
            return true;
    }
    i=x;
    j=y;
    n=0;
    while(i>0 && j<lsh-2)//检查右上左下方向是否五子相连
    {
        if(qp[i-1][j+1]==z)//看看右上是不是同色棋子
        {
            i--;
            j++;
        }
        else
            break;
    }
    while(qp[i][j]==z)//看看左下是不是同色棋子
    {
        if(i++==lsh)
            break;
        if(j--==-1)
            break;
        if(++n==5)
            return true;
    }
    return false;
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多