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

📄 mjpaikuaizu.cpp

📁 一个麻将程序。我的。
💻 CPP
字号:
#include "mjpaikuaizu.h"

int mjpaikuaizu::whatcolor(int i_ikuai)const
{
    assert(getcount()>0&&i_ikuai<i_numofkuai);
    int first;
    first = i_beginofkuai[i_ikuai];

    if(getmj(first)<=19&&getmj(first)>=11)return 1;
    if(getmj(first)<=39&&getmj(first)>=31)return 2;
    if(getmj(first)<=59&&getmj(first)>=51)return 3;
    if(getmj(first)==71||getmj(first)==91)return 4;
    if(getmj(first)==81)return 5;
    return 0;
}


bool mjpaikuaizu::iske(int i_ikuai)const
{
    assert(getcount()>0&&i_ikuai<i_numofkuai);

    //if(getcount()-i_beginofkuai[i_ikuai]<3)return false ;

    int end = (i_ikuai==i_numofkuai-1)?getcount():i_beginofkuai[i_ikuai+1];

    int first;
    first = i_beginofkuai[i_ikuai];

    if(end-first!=3) return false;

    if(getmj(first)==getmj(first+1)&&getmj(first)==getmj(first+2))
        return true;
    return false;
}

bool mjpaikuaizu::isshun(int i_ikuai)const
{
    assert(getcount()>0&&i_ikuai<i_numofkuai);

    int end = (i_ikuai==i_numofkuai-1)?getcount():i_beginofkuai[i_ikuai+1];

    int first;
    first = i_beginofkuai[i_ikuai];

    if(end-first!=3) return false;

    int max=0,min=100;
    for(int i=first;i<first+3;i++){
        if( getmj(i)>max) max=getmj(i);
        if(getmj(i)<min)min=getmj(i);
    }

    if(max-min==2&&((min+1==getmj(first))||(min+1==getmj(first+1))||(min+1==getmj(first+2))))
         return true;
    return false;

}

int mjpaikuaizu::isgang(int i_ikuai)const
{
    assert(getcount()>0&&i_ikuai<i_numofkuai);

    int end = (i_ikuai==i_numofkuai-1)?getcount():i_beginofkuai[i_ikuai+1];

    int first;
    first = i_beginofkuai[i_ikuai];

    if(end-first!=4) return false;

    if(getmj(first)==getmj(first+1)&&getmj(first)==getmj(first+2)&&getmj(first)==getmj(first+3))
        if(isangang[i_ikuai])
            return 2;
        else return 1;
    return 0;
}

void mjpaikuaizu::insertmjkuai(mjpai firstmj,int type,bool isangang)
{
    assert(i_numofkuai<8);
    assert(firstmj<=91&&firstmj>=11);
    assert(type>=0&&type<4);


    switch(type)
    {
        case 0:
            assert(firstmj!=81);
            assert((firstmj>10&&firstmj<18)||(firstmj>30&&firstmj<38)||
                (firstmj>50&&firstmj<58));
                
            i_beginofkuai[i_numofkuai]=getcount();
            i_numofkuai++;

            insertmj(firstmj);
            insertmj(firstmj+1);
            insertmj(firstmj+2);
            
            break;
        case 1:
        case 2:
            assert(firstmj!=81);
            i_beginofkuai[i_numofkuai]=getcount();
            mjpaikuaizu::isangang[i_numofkuai]=isangang;
            i_numofkuai++;

            for(int i=0;i<type+2;i++)
                insertmj(firstmj);


            break;
        case 3:
            assert(firstmj==81);
            i_beginofkuai[i_numofkuai]=getcount();
            i_numofkuai++;

            insertmj(firstmj);

            break;
    }

}

void mjpaikuaizu::deletemjkuai(int i)
{
    assert(i<i_numofkuai);
   // int count=getcount();

    int i_todelete=i_beginofkuai[i];
    int i_next;

    if(i==i_numofkuai-1)
        i_next=getcount();
    else
        i_next=i_beginofkuai[i+1];

    for(int i_i=i_todelete;i_i<i_next;i_i++){
        takemj(i_todelete);//一张一张删除
    }

    for(int i_i=i;i_i<i_numofkuai-1;i_i++)
    {
        i_beginofkuai[i_i]=i_beginofkuai[i_i+1]-(i_next-i_todelete);
        //标志位 重新组合
        isangang[i_i]=isangang[i_i+1];
    }

    i_numofkuai--; //少了一组
}

mjpaikuaizu & mjpaikuaizu::operator =(mjpaikuaizu &s)
{
    if(this==&s) return *this ;
    
    mjpaizu::operator =(s);

    i_numofkuai=s.i_numofkuai;

    for(int i=0;i<8;i++){
        i_beginofkuai[i]=s.i_beginofkuai[i];
        isangang[i]=s.isangang[i];
    }

    return *this;
}   

mjpaikuaizu::mjpaikuaizu(mjpaikuaizu &s):mjpaizu(s) //调用父类的拷贝构造
{
    //mjpaizu::mjpaizu(s); //不能放在这,呵呵.实际上此处调用并非对父类初始化.
    //而是生成了一临时对象(构造函数调用相当于生成临时对象)

    i_numofkuai=s.i_numofkuai;

    for(int i=0;i<8;i++){
        i_beginofkuai[i]=s.i_beginofkuai[i];
        isangang[i]=s.isangang[i];
    }

}

int mjpaikuaizu::havezikeorgang()const
{
    int i, i_sumke=0, i_sumgang=0   ,i_sumangang=0;
    for(i=0;i<i_numofkuai;i++)
    {
        if(whatcolor(i)==4)
        {
            if(iske(i)) i_sumke++;
            if(isgang(i)==1) i_sumgang++;
            if(isgang(i)==2) i_sumangang++;
        }
    }
    return i_sumke+10*i_sumgang+100*i_sumangang;
}

int mjpaikuaizu::havegang()const
{
    int i, i_sumgang=0   ,i_sumangang=0;
    for(i=0;i<i_numofkuai;i++)
    {
        if(whatcolor(i)!=4&&whatcolor(i)!=5)
        {
            //if(iske(i)) i_sumke++;
            if(isgang(i)==1) i_sumgang++;
            if(isgang(i)==2) i_sumangang++;
        }
    }
    return i_sumgang+10*i_sumangang;
}

int mjpaikuaizu::havefa()const
{
    int i, i_sum=0;
    for(i=0;i<i_numofkuai;i++)
    {
        if(whatcolor(i)==5)
        {
            i_sum++;
        }
    }
    return i_sum;
}

void mjpaikuaizu::bugang(mjpai mj,bool isangang)
{
    int i;

    for(i=0;i<i_numofkuai;i++)
    {
        if(iske(i))
        {
            if(mj==getmj(i_beginofkuai[i]))
            {
                deletemjkuai(i);
                insertmjkuai(mj,2,isangang);
                break;
            }

        }
    }
    assert(i!=i_numofkuai);;
}


int mjpaikuaizu::findke(mjpai mj)const
{
    assert(mj>10&&mj<92);

    for(int i=0;i<i_numofkuai;i++)
        if(iske(i)&&getmj(i_beginofkuai[i])==mj)
        //{
            return i;
            //break;
        //}

    return 100;
}


mjpai mjpaikuaizu::getfirstofkuai(int kuai)const
{
    return mjpaizu::getmj(i_beginofkuai[kuai]);
}

⌨️ 快捷键说明

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