📄 everyman.cpp
字号:
#include "everyman.h"
#include "unit1.h"
player::player()
{
setbeginpos(153,467);
} //修改此处需再修改resetbegin()
bool player::cangang()const
{
mjpai mj[13];
int mjs;
for(int i=0;i<zuhand.getcount();i++)
mj[i]=zuhand.getmj(i);
mjs=Form1->mjots.getnewest();
return (::pengandgang(mj,zuhand.getcount(),mjs)==2)?true:false;
}
bool player::canpeng()const
{
mjpai mj[13];
int mjs;
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 player::canbugang()const
{
int i,j,s;
int mja[14];
i=zushowed.findke(painewget);
if(i!=100) return true;
for(i=0;i<zuhand.getcount();i++)
{
mja[i]=zuhand.getmj(i);
if(zushowed.findke(mja[i])!=100)
return true;
}
mja[i]=painewget;
for(i=0;i<zuhand.getcount()+1;i++)
{
s=0;
for(j=i+1;j<zuhand.getcount()+1;j++)
if(mja[i]==mja[j]) s++;
if(s==3)
break;
}
if(i!=zuhand.getcount()+1)
return true;
return false;
}
bool player::canting(int index)const
{ //此时 painewget已经有牌,且参数表示用户选择准备出的牌(i=50未为painewget),
//除去这张,判断是否听
mjpai mj[14];
int c=zuhand.getcount();
assert(index<c||index==50);
int i;
if(index!=50)
{
for(i=0;i<c;i++)
mj[i]=(mjpai)zuhand.getmj(i);
mj[index]=painewget;
}
else
for(i=0;i<c;i++)
mj[i]=zuhand.getmj(i);
for(i=mjpai::wan1;i<=mjpai::wan9;i++)
if(::hu(mj,c,i)) return true;
for(i=mjpai::tiao1;i<=mjpai::tiao9;i++)
if(::hu(mj,c,i)) return true;
for(i=mjpai::bing1;i<=mjpai::bing9;i++)
if(::hu(mj,c,i)) return true;
if(::hu(mj,c,mjpai::zhong)) return true;
if(::hu(mj,c,mjpai::bai)) return true;
return false;
}
bool player::canhu(bool iszimo)const
{
player tempplayer;
tempplayer=* const_cast<player*>(this);
if(!iszimo) //不是自摸,则到桌上取别人刚出的牌
{
mjpai mj=Form1->mjots.getnewest();
tempplayer.painewget=mj;
}
if(!tempplayer.hu()) return false;
if(iszimo) return true;
if(zushowed.getkuaicount()==0) return true;
if(tempplayer.fa()||tempplayer.zimingke()||tempplayer.zianke()||
tempplayer.ziminggang()||tempplayer.ziangang()||tempplayer.minggang()||
tempplayer.angang())
return true;
if(tempplayer.hunyise()||tempplayer.pengpenghu()||tempplayer.qidui()||tempplayer.yitiaolong())
return true;
return false;
//碰了以后若无发、字刻、杠:普通和只能自摸,大和(碰碰和、清一色、混一色、七对)可以炮、摸
}
TRect player::picrect(mjpai mj) const
{
if(mj>=11&&mj<=19)
return Rect((mj-11)*25,0,24+(mj-11)*25,34);
else if(mj>=31&&mj<=39)
return Rect((mj-31)*25,35,24+(mj-31)*25,69);
else if(mj>=51&&mj<=59)
return Rect((mj-51)*25,70,24+(mj-51)*25,104);
else if(mj==91)
return Rect(0,105,24,139);
else if(mj==81)
return Rect(25,105,49,139);
else if(mj==71)
return Rect(50,105,74,139);
else if(mj==100)
return Rect(175,105,199,139);
return Rect(0,0,0,0);
}
void player::draw(int image)const
{
int showedcount,handcount;
TCanvas *imming,*iman;
showedcount=zushowed.getkuaicount();
handcount=zuhand.getcount();
switch(image)
{
case 1:
imming=Form1->imdownming1o->Canvas;
iman=Form1->imdownan1o->Canvas;
break;
case 2:
imming=Form1->imdownming2o->Canvas;
iman=Form1->imdownan2o->Canvas;
break;
}
int i; int current=beginx,c=0,j;
for(i=0;i<showedcount;i++)
if(zushowed.iske(i)||zushowed.isshun(i))
{
for(j=0;j<3;j++)
{
mjpai mj;
mj=zushowed.getmj(c++);
Form1->PaintBox1->Canvas->CopyRect(Rect(current,beginy,current+24,beginy+34),
imming, picrect(mj));
current+=25;
}
current +=5;
}
else if(zushowed.isgang(i))
{
for(j=0;j<4;j++)
{
mjpai mj;
mj=zushowed.getmj(c++);
if(zushowed.isgang(i)==1)//明杠
if(j==2)
Form1->PaintBox1->Canvas->CopyRect(Rect(current,beginy-13,current+24,beginy+34-13),
imming, picrect(mj));
else
Form1->PaintBox1->Canvas->CopyRect(Rect(current,beginy,current+24,beginy+34),
imming, picrect(mj));
else
if(j==2)
Form1->PaintBox1->Canvas->CopyRect(Rect(current,beginy-13,current+24,beginy+34-13),
imming, picrect(mj));
else
Form1->PaintBox1->Canvas->CopyRect(Rect(current,beginy,current+24,beginy+34),
imming, picrect(100));
if(j!=1)
current+=25;
}
current +=5;
}
else if(zushowed.whatcolor(i)==5)
{
mjpai mj;
mj=zushowed.getmj(c++);
Form1->PaintBox1->Canvas->CopyRect(Rect(current,beginy,current+24,beginy+34),
imming, picrect(mj));
current+=25;
current+=5;
}
//current +=15;
for(i=0;i<handcount;i++)
{
mjpai mj;
mj=zuhand.getmj(i);
Form1->PaintBox1->Canvas->CopyRect(Rect(current,
beginy-5,current+24,beginy+34-5), iman,
picrect(mj));
current+=25;
}
current+=5;
if(painewget!=0)
Form1->PaintBox1->Canvas->CopyRect(Rect(current,
beginy-5,current+24,beginy+34-5), iman,
picrect(painewget));
}
void player::select(int s,int image)
{
int c=zushowed.getkuaicount();
int sum=0;int i;
for(i=0;i<c;i++)
{
if(zushowed.iske(i)||zushowed.isshun(i)||zushowed.isgang(i))
sum+=3*25;
else
sum+=25;
sum+=5;
}
int x=beginx+sum;
int x2=x+zuhand.getcount()*25;
TImage *iman;
switch(image)
{
case 1:
iman=Form1->imdownan1o;
break;
case 2:
iman=Form1->imdownan2o;
break;
}
if(selected!=100)
if(selected==50){
Form1->PaintBox1->Canvas->FillRect(Rect(x2+5,457,x2+5+24,457+34+5));
Form1->PaintBox1->Canvas->CopyRect(Rect(x2+5,457+5,x2+5+24,457+34+5),
iman->Canvas,picrect(painewget));
}
else{
Form1->PaintBox1->Canvas->FillRect(Rect(x+25*selected,457,x+25*selected+24,457+34+5));
Form1->PaintBox1->Canvas->CopyRect(Rect(x+25*selected,457+5,x+25*selected+24,457+34+5),
iman->Canvas,picrect(zuhand.getmj(selected)));
}
selected=s;
if(selected==50){
Form1->PaintBox1->Canvas->FillRect(Rect(x2+5,457,x2+5+24,457+34+5));
Form1->PaintBox1->Canvas->CopyRect(Rect(x2+5,457,x2+5+24,457+34),
iman->Canvas,picrect(painewget));
}
else{
Form1->PaintBox1->Canvas->FillRect(Rect(x+25*selected,457,x+25*selected+24,457+34+5));
Form1->PaintBox1->Canvas->CopyRect(Rect(x+25*selected,457,x+25*selected+24,457+34),
iman->Canvas,picrect(zuhand.getmj(selected)));
}
}
void player::chu()
{
if(selected==50)
Form1->mjots.insertmjdown(painewget);
else
{
Form1->mjots.insertmjdown(zuhand.takemj(selected));
zuhand.insertmj(painewget);
sort();
}
painewget=0;
selected=100;
}
void player::sort(){
zuhand.sort();
}
void player::sortall(){
mjpai mja[14];
int c;
c=zuhand.getcount();
for (int i=0;i<c;i++)
mja[i]=zuhand.getmj(i);
assert(painewget);
mja[c]=painewget;
mishel(mja,c+1);
zuhand.clear();
for (int i=0;i<c;i++)
zuhand.insertmj(mja[i]);
painewget=mja[c];
//zuhand.sort();
}
//------------------------------------------------
TRect computerright::picrect(mjpai mj) const
{
if(mj>=11&&mj<=19)
return Rect(0,(19-mj)*25,35,(19-mj)*25+24);
else if(mj>=31&&mj<=39)
return Rect(35,(39-mj)*25,70,(39-mj)*25+24);
else if(mj>=51&&mj<=59)
return Rect(70,(59-mj)*25,105,(59-mj)*25+24);
else if(mj==91)
return Rect(35*3,25*4,35*4,25*5);
else if(mj==81)
return Rect(35*3,25*3,35*4,25*4);
else if(mj==71)
return Rect(35*3,25*2,35*4,25*3);
else if(mj==100)
return Rect(35*3,25*1,35*4,25*2);
else if(mj==200)
return Rect(78,110,89,135);
return Rect(0,0,0,0);
}
void computerright::draw(int image)const
{
int showedcount,handcount;
TImage *imming,*iman;
showedcount=zushowed.getkuaicount();
handcount=zuhand.getcount();
switch(image)
{
case 1:
imming=Form1->imright1;
iman=Form1->imdownan1o;//imleft1;
break;
case 2:
imming=Form1->imright2;
iman=Form1->imdownan2o;
break;
}
int i; int current=beginy,c=0,j;
for(i=0;i<showedcount;i++)
if(zushowed.iske(i)||zushowed.isshun(i))
{
for(j=0;j<3;j++)
{
mjpai mj;
mj=zushowed.getmj(c++);
Form1->PaintBox1->Canvas->CopyRect(Rect(beginx,current,beginx+34,current+24),
imming->Canvas, picrect(mj));
current-=25;
}
current -=5;
}
else if(zushowed.isgang(i))
{
for(j=0;j<4;j++)
{
//mage *temp=isgang(i)==1?
mjpai mj;
mj=zushowed.getmj(c++);
if(zushowed.isgang(i)==1)//明杠
if(j==2)
Form1->PaintBox1->Canvas->CopyRect(Rect(beginx+13,current,beginx+34+13,
current+24),imming->Canvas, picrect(mj));
else
Form1->PaintBox1->Canvas->CopyRect(Rect(beginx,current,beginx+34,
current+24),imming->Canvas, picrect(mj));
else
if(j==2)
Form1->PaintBox1->Canvas->CopyRect(Rect(beginx+13,current,beginx+34+13,current+24),
imming->Canvas, picrect(100));
else
Form1->PaintBox1->Canvas->CopyRect(Rect(beginx,current,beginx+34,current+24),
imming->Canvas, picrect(100));
if(j!=1)
current-=25;
}
current -=5;
}
else if(zushowed.whatcolor(i)==5)
{
mjpai mj;
mj=zushowed.getmj(c++);
Form1->PaintBox1->Canvas->CopyRect(Rect(beginx,current,beginx+34,current+24),
imming->Canvas, picrect(mj));
current-=25;
current-=5;
}
//current +=15;
for(i=0;i<handcount;i++)
{
mjpai mj;
mj=zuhand.getmj(i);
Form1->PaintBox1->Canvas->CopyRect(Rect(beginx+24,current,beginx+10+24,current+24),
/* #ifndef NVIEWMAN
imming->Canvas ,picrect(mj));
#else */
iman->Canvas,picrect(200));//test
// #endif
current-=25;
}
current-=5;
if(painewget!=0)
Form1->PaintBox1->Canvas->CopyRect(Rect(beginx+24,current,beginx+10+24,current+24),
/* #ifndef NVIEWMAN
imming->Canvas ,picrect(painewget));
#else */
iman->Canvas,picrect(200));//test
// #endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -