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

📄 telligent.cpp

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

#define NLABEL    //桌面上不显示电脑状态

//#define NDEBUG   //不要assert
#include <assert.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))+" ";
    Form1->Label6->Caption=Form1->Label6->Caption+"wantto"+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()||yitiaolong())
    {
        if(!iszimo)painewget=0;
        return true;
    }

    painewget=0;

    if(duting())
    {
        //if(!iszimo)painewget=0;
        return true;
    }

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

static mjpaizu GetRidOfShunKe(mjpai* mj,int c,bool forward=true);

bool man::wanttopeng()const
{
    if(wantto==dui)return false;//打七对 不碰
    if(isting) return false; //听牌就不碰


    mjpai mj[13];
    int mjs,c;
    mjpaizu temp;

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

    if(wantto!=pengpeng)//如果不是碰碰和那么 除去可连成3张的牌
    {
        temp=GetRidOfShunKe(mj,c);
        c=temp.getcount();
        for(int i=0;i<c;i++)
            mj[i]=temp.getmj(i);
    }
    
    mjs=Form1->mjots.getnewest();
    return (::pengandgang(mj,c,mjs)==1)?true:false;
}

bool man::wanttogang()const
{
    if(wantto==dui)return false;//打七对 不杠

    mjpai mj[13],mj1[13];
    int mjs,c;

    mjs=Form1->mjots.getnewest();

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

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

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

            if(::ting(mj,c-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++)
        Form1->mjots.insertshowedinhand(mjs);
}

void man::bugang()//有两种情况,可能新摸的要杠,或者,手上早有4张
{               //wanttobugang可以配合(相当于叫),属于电脑智能一部分
    soundgang();
    mjpai mj;
    mjpai mja[14];

    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;
    }
    
    mj=Form1->mjot.takeone(false);
    while(mj==mjpai::fa)
    {
        zushowed.insertmjkuai(mjpai::fa,3);
        mj=Form1->mjot.takeone(false);
    }

    int i=zushowed.findke(painewget);//看看摸到的牌能不能补杠
    if(i!=100)
    {
        zushowed.bugang(painewget);

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

    int s,j;


    for(i=0;i<zuhand.getcount();i++)//看看手上的牌能不能补杠
    {
        mja[i]=zuhand.getmj(i);
        if(zushowed.findke(mja[i])!=100)
        {
            zushowed.bugang(mja[i],false);
            zuhand.takemj(zuhand.find(mja[i]));
            //zuhand.insertmj(mj);
            zuhand.insertmj(painewget);
            painewget=mj;

                Form1->mjots.insertshowedinhand(mja[i]);
                if(wantto==yise)//如果在打一色,且杠了别的牌,就不打一色了
                {
                    if(se==wan&&(mja[i].isbing()||mja[i].istiao()))
                        wantto=nothing;
                    if(se==tiao&&(mja[i].isbing()||mja[i].iswan()))
                        wantto=nothing;
                    if(se==bing&&(mja[i].iswan()||mja[i].istiao()))
                        wantto=nothing;
                }
            return ;
        }
    }

    mja[i]=painewget;

    for(i=0;i<zuhand.getcount()+1;i++) //剩下的就是手上有4张相同
    {
        s=0;
        for(j=i+1;j<zuhand.getcount()+1;j++)
            if(mja[i]==mja[j]) s++;
        if(s==3)
            break;
    }
    //assert(c==3);
    assert(i!=zuhand.getcount()+1);
    zushowed.insertmjkuai(mja[i],2,true);
    
                if(wantto==yise)//如果在打一色,且杠了别的牌,就不打一色了
                {
                    if(se==wan&&(mja[i].isbing()||mja[i].istiao()))
                        wantto=nothing;
                    if(se==tiao&&(mja[i].isbing()||mja[i].iswan()))
                        wantto=nothing;
                    if(se==bing&&(mja[i].iswan()||mja[i].istiao()))

⌨️ 快捷键说明

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