📄 everyman.cpp
字号:
}
//------------------------------------------------
TRect computerup::picrect(mjpai mj) const
{
if(mj>=11&&mj<=19)
return Rect((19-mj)*25,35*3,(19-mj)*25+25,35*4);
else if(mj>=31&&mj<=39)
return Rect((39-mj)*25,35*2,(39-mj)*25+25,35*3);
else if(mj>=51&&mj<=59)
return Rect((59-mj)*25,35*1,(59-mj)*25+25,35*2);
else if(mj==91)
return Rect(25*4,0,25*5,35);
else if(mj==81)
return Rect(25*3,0,25*4,35);
else if(mj==71)
return Rect(25*2,0,25*3,35);
else if(mj==100)
return Rect(25*1,0,25*2,35);
else if(mj==200)
return Rect(90,110,115,121);
return Rect(0,0,0,0);
}
void computerup::draw(int image)const
{
int showedcount,handcount;
TCanvas *imming,*iman;
showedcount=zushowed.getkuaicount();
handcount=zuhand.getcount();
switch(image)
{
case 1:
imming=Form1->imup1->Canvas;
iman=Form1->imdownan1o->Canvas;
break;
case 2:
imming=Form1->imup2->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++)
{
//mage *temp=isgang(i)==1?
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(100));
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,current+24,beginy+10),
/* #ifndef NVIEWMAN
imming ,picrect(mj));
#else */
iman,picrect(200));//test
// #endif
current-=25;
}
current-=5;
if(painewget!=0)
Form1->PaintBox1->Canvas->CopyRect(Rect(current,beginy,current+24,beginy+10),
/* #ifndef NVIEWMAN
imming ,picrect(painewget));
#else */
iman,picrect(200));//test
// #endif
//030325换联众图片
}
//------------------------------------------------
TRect computerleft::picrect(mjpai mj) const
{
if(mj>=11&&mj<=19)
return Rect(35*3,25*(mj-11),35*4,25*(mj-11)+24);
else if(mj>=31&&mj<=39)
return Rect(35*2,25*(mj-31),35*3,25*(mj-31)+24);
else if(mj>=51&&mj<=59)
return Rect(35*1,25*(mj-51),35*2,25*(mj-51)+24);
else if(mj==91)
return Rect(0,25*4,35,25*5);
else if(mj==81)
return Rect(0,25*5,35,25*6);
else if(mj==71)
return Rect(0,25*6,35,25*7);
else if(mj==100)
return Rect(0,25*7,35,25*8);
else if(mj==200)
return Rect(116,110,127,135);
return Rect(0,0,0,0);
}
void computerleft::draw(int image)const
{
int showedcount,handcount;
TImage *imming,*iman;
showedcount=zushowed.getkuaicount();
handcount=zuhand.getcount();
switch(image)
{
case 1:
imming=Form1->imleft1;
iman=Form1->imdownan1o;
break;
case 2:
imming=Form1->imleft2;
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,current,beginx+10,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,current,beginx+10,current+24),
/* #ifndef NVIEWMAN
imming->Canvas ,picrect(painewget));
#else */
iman->Canvas,picrect(200));//test
// #endif
}
//---------------------------
TRect mjontable::picrect(int direct,int color)const
{
assert(direct>0&&direct<3&& color>0&&color<3);
if(direct==1&&color==1)
return Rect(0,0,19,15);
else if(direct==2&&color==1)
return Rect(19,0,34,19);
else if(direct==1&&color==2)
return Rect(15,19,34,34);
else if(direct==2&&color==2)
return Rect(0,15,15,34);
return Rect(0,0,0,0);
}
void mjontable::reset() //插入120张牌
{
int i,j;
clear();
for(i=mjpai::wan1;i<=mjpai::wan9;i++)
for(j=0;j<4;j++)
mjpaizu::insertmj(i);
for(i=mjpai::tiao1;i<=mjpai::tiao9;i++)
for(j=0;j<4;j++)
mjpaizu::insertmj(i);
for(i=mjpai::bing1;i<=mjpai::bing9;i++)
for(j=0;j<4;j++)
mjpaizu::insertmj(i);
for(i=mjpai::zhong;i<=mjpai::bai;i+=10)
for(j=0;j<4;j++)
mjpaizu::insertmj(i);
takenfromhead=takenfromtail=0;
}
void mjontable::wash() //洗牌
{
assert(mjpaizu::getcount()==120);
randomize();
int i;
int r=random(120);
for(i=0;i<r;i++) //先取出头上random张放到尾部
mjpaizu::insertmj(mjpaizu::takemj(0));
for(i=0;i<480;i++)
{
r=random(120); //再取第random张放到尾部,做480次
mjpaizu::insertmj(mjpaizu::takemj(random(2)?r:(119-r)));
}
}
void mjontable::setfirst(int pos,int num) //设置第一张牌从哪里取
{
assert(num%2==0);
firstpos=pos;
firstpai=num;
}
void mjontable::drawonedirect(int image,int from,int to,int direct)const
{
assert(from>=0&&to<30&&to>=from);
int i,head,tail,length,lengthup,begin,beginup;
head=from/2;
tail=(30-to-1)/2;
length=15-head-tail;
lengthup=(from%2)?(length-1):length;
lengthup=((to+1)%2)?(lengthup-1):lengthup;
begin=head;
beginup=begin+from%2;
switch(direct)
{
case down:
for(i=0;i<length;i++)
Form1->PaintBox1->Canvas->CopyRect(Rect(bxdown-(i+begin)*15,bydown,bxdown-(i+begin)*15+15,bydown+19),
Form1->imgai->Canvas, picrect(2,image));
for(i=0;i<lengthup;i++)
Form1->PaintBox1->Canvas->CopyRect(Rect(bxdown-(i+beginup)*15+2,bydown-2,bxdown-(i+beginup)*15+15+2,bydown+19-2),
Form1->imgai->Canvas, picrect(2,image));
break;
case up:
for(i=0;i<length;i++)
Form1->PaintBox1->Canvas->CopyRect(Rect(bxup+(i+begin)*15,byup,bxup+(i+begin)*15+15,byup+19),
Form1->imgai->Canvas, picrect(2,image));
for(i=0;i<lengthup;i++)
Form1->PaintBox1->Canvas->CopyRect(Rect(bxup+(i+beginup)*15+2,byup-2,bxup+(i+beginup)*15+15+2,byup+19-2),
Form1->imgai->Canvas, picrect(2,image));
break;
case left:
for(i=0;i<length;i++)
Form1->PaintBox1->Canvas->CopyRect(Rect(bxleft,byleft-(i+begin)*15,bxleft+19,byleft-(i+begin)*15+15),
Form1->imgai->Canvas, picrect(1,image));
for(i=0;i<lengthup;i++)
Form1->PaintBox1->Canvas->CopyRect(Rect(bxleft+2,byleft-(i+beginup)*15-2,bxleft+19+2,byleft-(i+beginup)*15+15-2),
Form1->imgai->Canvas, picrect(1,image));
break;
case right:
for(i=0;i<length;i++)
Form1->PaintBox1->Canvas->CopyRect(Rect(bxright,byright+(i+begin)*15,bxright+19,byright+(i+begin)*15+15),
Form1->imgai->Canvas, picrect(1,image));
for(i=0;i<lengthup;i++)
Form1->PaintBox1->Canvas->CopyRect(Rect(bxright+2,byright+(i+beginup)*15-2,bxright+19+2,byright+(i+beginup)*15+15-2),
Form1->imgai->Canvas, picrect(1,image));
break;
}
}
void mjontable::draw(int image)const
{
//int count=getcount();
assert(takenfromhead+takenfromtail<=120);
int i,j,th,fp,tt;
int taken[4][2];
for(i=0;i<4;i++)
for(j=0;j<2;j++)
taken[i][j]=0;
th=takenfromhead;
th-=30-firstpai;
fp=(firstpos==3)?0:(firstpos+1);
while(th>=30)
{
th-=30;
taken[fp][0]=taken[fp][1]=30;
fp=(fp==3)?0:(fp+1);
}
if(th>0)taken[fp][0]=th;
//-------
tt=takenfromtail;
tt-=firstpai;
fp=(firstpos==0)?3:(firstpos-1);
while(tt>=30)
{
tt-=30;
taken[fp][0]=taken[fp][1]=30;
fp=(fp==0)?3:(fp-1);
}
if(tt>0)taken[fp][1]=tt;
//-------以上 得到除了第一方外的3方的麻将堆的被取情况,[0]为顺时针方向取的
fp=(firstpos==3)?0:(firstpos+1);
for(i=0;i<3;i++)
{
if(taken[fp][0]==30&&taken[fp][1]==30);
else
if(taken[fp][0]<=29-taken[fp][1])
drawonedirect(image,taken[fp][0],29-taken[fp][1],fp);
fp=(fp==3)?0:(fp+1);
} //由前面得到的taken[][]来画3方牌
//下面画初始取牌的一方
if(takenfromtail==0&&takenfromhead==0)
{
drawonedirect(image,0,29,firstpos);
return;
}
if(takenfromtail<firstpai)
if(taken[firstpos][0]<=firstpai-takenfromtail-1)
drawonedirect(image,taken[firstpos][0],firstpai-takenfromtail-1,firstpos);
if(takenfromhead<30-firstpai)
if(firstpai+takenfromhead<=29-taken[firstpos][1])
drawonedirect(image,firstpai+takenfromhead,29-taken[firstpos][1],firstpos);
}
int player::getindex(int mousex,int mousey)const
{
int c=zushowed.getkuaicount();
int s=0;int i;
for(i=0;i<c;i++)
{
if(zushowed.iske(i)||zushowed.isshun(i)||zushowed.isgang(i))
s+=3*25;
else
s+=25;
s+=5;
}
int x=beginx+s;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -