📄 telligent.cpp
字号:
#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 + -