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