⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 telligent.cpp

📁 C++网络麻将源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "everyman.h"
#include "unit1.h"

void computerleft::chu()
{
    #ifndef NLABEL
    Form1->Label5->Caption=wantto;
    #endif

    mjpai mj=man::discard();

    //mj=painewget;//test

    if(mj==painewget)
    {
         Form1->mjots.insertmjleft(mj);
         painewget=0;
    }
    else
    {
        Form1->mjots.insertmjleft(mj);
        zuhand.takemj(zuhand.find(mj));
        zuhand.insertmj(painewget);
        painewget=0;
    }
}

void computerright::chu()
{
    #ifndef NLABEL
    Form1->Label7->Caption=wantto;
    #endif

    mjpai mj=man::discard();

    if(mj==painewget)
    {
         Form1->mjots.insertmjright(mj);
         painewget=0;
    }
    else
    {
        Form1->mjots.insertmjright(mj);
        zuhand.takemj(zuhand.find(mj));
        zuhand.insertmj(painewget);
        painewget=0;
    }
}

void computerup::chu()
{

    mjpai mj=man::discard();

    if(mj==painewget)
    {
         Form1->mjots.insertmjup(mj);
         painewget=0;
    }
    else
    {
        Form1->mjots.insertmjup(mj);
        zuhand.takemj(zuhand.find(mj));
        zuhand.insertmj(painewget);
        painewget=0;
    }
    #ifndef NLABEL
    zuhand.sort();
    Form1->Label6->Caption="";
    for(int i=0;i<zuhand.getcount();i++)
        Form1->Label6->Caption=Form1->Label6->Caption+AnsiString(zuhand.getmj(i))+" ";
    //wantto;
    #endif
}

bool man::wanttobugang()const   //只是有补就补,但是也不全,
{
    int i;

    if(wantto==dui)return false;//打七对不补杠

    i=zushowed.findke(painewget);
    if(i!=100) return true;

    int c=0;
    for(i=0;i<zuhand.getcount();i++)
        if(painewget==zuhand.getmj(i))
            c++;

    if(c==3)//可以补杠,
    {
        if(isting)     //可以听,则看杠后能不能继续听,能,就杠
        {
            mjpai mj[14];
            mjpai mjs=painewget;
            for(i=0;i<zuhand.getcount();i++)
                mj[i]=zuhand.getmj(i);

           ::mishel(mj,zuhand.getcount());

            for(int i=0;i<zuhand.getcount()-3;i++)
                if(mj[i]==mjs)
                {
                    for(int j=i;j<zuhand.getcount()-3;j++)
                        mj[j]=mj[j+3];
                    break;
                }

            if(::ting(mj,zuhand.getcount()-3).getcount()>0)
                return true;
            else return false;
        }

        return true;
    }

    return false;
}

bool man::wanttohu(bool iszimo) //检测和牌合不合规则亦在这里
{
    if(!iszimo) //不是自摸,则到桌上取别人刚出的牌
    {
        mjpai mj=Form1->mjots.getnewest();

        painewget=mj;
    }

    if(!this->hu())
    {
        if(!iszimo)painewget=0;
        return false;
    }

    if(iszimo)
    {
        return true;
    }

    if(zushowed.getkuaicount()==0)
    {
        if(!iszimo)painewget=0;
        return true;
    }
    if(fa()||zimingke()||zianke()||
        ziminggang()||ziangang()||minggang()||
        angang())
    {
        if(!iszimo)painewget=0;
        return true;
    }

    if(hunyise()||pengpenghu()||qidui())
    {
        if(!iszimo)painewget=0;
        return true;
    }

    if(!iszimo)painewget=0;
    return false;
    //碰了以后若无发、字刻、杠:普通和只能自摸,大和(碰碰和、清一色、混一色、七对)可以炮、摸
}


bool man::wanttopeng()const
{
    //这里先简单实现有吃就吃,有碰就碰

    if(wantto==dui)return false;//打七对 不碰

    mjpai mj[13];
    int mjs;

    if(isting) return false; //听牌就不碰

    for(int i=0;i<zuhand.getcount();i++)
        mj[i]=zuhand.getmj(i);

    mjs=Form1->mjots.getnewest();
    return (::pengandgang(mj,zuhand.getcount(),mjs)==1)?true:false;
}

bool man::wanttogang()const
{
    //这里先简单实现有吃就吃,有碰就碰
    mjpai mj[13];
    int mjs;

    if(wantto==dui)return false;//打七对 不杠

    mjs=Form1->mjots.getnewest();

    for(int i=0;i<zuhand.getcount();i++)
        mj[i]=zuhand.getmj(i);

    if(::pengandgang(mj,zuhand.getcount(),mjs)==2)//如果可以杠且听牌
    {                                              //如果杠后仍听,则杠
        if(isting)
        {
            mishel(mj,zuhand.getcount());

            for(int i=0;i<zuhand.getcount()-3;i++)
                if(mj[i]==mjs)
                {
                    for(int j=i;j<zuhand.getcount()-3;j++)
                        mj[j]=mj[j+3];
                    break;
                }

            if(::ting(mj,zuhand.getcount()-3).getcount()>0)
                return true;
            else return false;
        }


        return true;
    }
    return false;
}

void man::peng()
{
    soundpeng();
    //这里先简单的找牌吃碰杠
    mjpai mjs=Form1->mjots.takenewest();

    if(!fainhandhavedetected)
    {
        for(int i=0;i<zuhand.getcount();i++) //补手上的发
            if(zuhand.getmj(i)==mjpai::fa)
            {
                mjpai temp;
                zuhand.takemj(i);
                zushowed.insertmjkuai(mjpai::fa,3);
                temp=Form1->mjot.takeone(false);
                while(temp==mjpai::fa)
                {
                    zushowed.insertmjkuai(mjpai::fa,3);
                    temp=Form1->mjot.takeone(false);
                }
                zuhand.insertmj(temp);
            i=-1;
            }
        fainhandhavedetected=true;
    }

    int i=zuhand.find(mjs);
    assert(i!=100);
    zuhand.takemj(i);

    i=zuhand.find(mjs);
    assert(i!=100);
    zuhand.takemj(i);

    zushowed.insertmjkuai(mjs,1);

                if(wantto==yise)//如果在打一色,且杠了别的牌,就不打一色了
                {
                    if(se==wan&&(mjs.isbing()||mjs.istiao()))
                        wantto=nothing;
                    if(se==tiao&&(mjs.isbing()||mjs.iswan()))
                        wantto=nothing;
                    if(se==bing&&(mjs.iswan()||mjs.istiao()))
                        wantto=nothing;
                }


    painewget=zuhand.takemj(zuhand.getcount()-1);

    for(i=0;i<3;i++)
        Form1->mjots.insertshowedinhand(mjs);

}



void man::gang()
{
    soundgang();
    //这里先简单的找牌吃碰杠
    mjpai mjs=Form1->mjots.takenewest();


    if(!fainhandhavedetected)
    {
        for(int i=0;i<zuhand.getcount();i++) //补手上的发
            if(zuhand.getmj(i)==mjpai::fa)
            {
                mjpai temp;
                zuhand.takemj(i);
                zushowed.insertmjkuai(mjpai::fa,3);
                temp=Form1->mjot.takeone(false);
                while(temp==mjpai::fa)
                {
                    zushowed.insertmjkuai(mjpai::fa,3);
                    temp=Form1->mjot.takeone(false);
                }
                zuhand.insertmj(temp);
            i=-1;
            }
        fainhandhavedetected=true;
    }

    int mjn=Form1->mjot.takeone(false);
    while(mjn==mjpai::fa)
    {
        zushowed.insertmjkuai(mjpai::fa,3);
        mjn=Form1->mjot.takeone(false);
    }

    int i=zuhand.find(mjs);
    assert(i!=100);
    zuhand.takemj(i);

    i=zuhand.find(mjs);
    assert(i!=100);
    zuhand.takemj(i);

    i=zuhand.find(mjs);
    assert(i!=100);
    zuhand.takemj(i);

    zushowed.insertmjkuai(mjs,2,false);
    
                if(wantto==yise)//如果在打一色,且杠了别的牌,就不打一色了
                {
                    if(se==wan&&(mjs.isbing()||mjs.istiao()))
                        wantto=nothing;
                    if(se==tiao&&(mjs.isbing()||mjs.iswan()))
                        wantto=nothing;
                    if(se==bing&&(mjs.iswan()||mjs.istiao()))
                        wantto=nothing;
                }

    painewget=mjn;

    for(i=0;i<4;i++)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -