📄 managers.cpp
字号:
pControl->m_ready[1]=false;
pControl->m_ready[2]=false;
pControl->m_ready[3]=false;
}
return true;
}
LeftNum--;
if(LeftNum!=0)
{
Actions=Cardinfo(ca,PushCards[Game_State],Game_State,Sendleft[LeftNum],Game_State);
ca[13]=Sendleft[LeftNum];
leftstart=(leftstart+1)%108;
Power[PlayerAc]*=2;
PointPlayer=PlayerAc;
}
else
Game_State=10;
// OutCard.Num=10;
pView->PrintAll();
PlaySound(action);
return true;
}
}
if(action==9 && Actions>=100)
{
CNum score;
score.m_cstring.Format("恭喜你胜利了!");
char st[100];
sprintf(st,"majiangdoing%c%c%c",PlayerAc+100,109,(Actions/100));
if(!MainComputer)
pControl->SendMsg(pControl->m_pSocket,st);
else
{
pControl->Broadcast(st,NULL);
}
GameOver(Actions/100);
score.m_player1=pView->PlayerNames[(4-PlayerAc)%4];
score.m_player2=pView->PlayerNames[(5-PlayerAc)%4];
score.m_player3=pView->PlayerNames[(6-PlayerAc)%4];
score.m_player4=pView->PlayerNames[(7-PlayerAc)%4];
score.m_score1.Format("%d",PlayPoints[0]);
score.m_score2.Format("%d",PlayPoints[1]);
score.m_score3.Format("%d",PlayPoints[2]);
score.m_score4.Format("%d",PlayPoints[3]);
score.DoModal();
pView->PrintAll();
PlaySound(action);
}
}
return false;
}
void Managers::Updata()
{
if(OutCard.Num==10)//没有人出牌,就等Game_State出牌咯 Game_State不改变
return ;
//现在有玩家OutPlayer出了牌,判断有没有玩家需要这牌,当然出牌的玩家是不会要这张牌了
int i,j;
for(i=(Game_State+1)%4;i!=OutPlayer;i=(i+1)%4)
{
j=Cardinfo(PlayCards[i],PushCards[i],OutPlayer,OutCard,i);
if(j!=0)
{
Game_State=i;
if(Game_State!=PlayerAc)
Actions=0;
else
Actions=j;
return;
}
}
Game_State=(OutPlayer+1)%4;
OutCard.Num=10;
leftstart=(leftstart+1)%108;
if(LeftNum==0)
{
Game_State=10;
if(MainComputer)
{
pControl->m_ready[0]=false;
pControl->m_ready[1]=false;
pControl->m_ready[2]=false;
pControl->m_ready[3]=false;
}
return;
}
if(Game_State==PlayerAc)
{
Actions=Cardinfo(PlayCards[Game_State],PushCards[Game_State],Game_State,Sendleft[LeftNum-1],Game_State);
}
else
{
Actions=0;
}
PlayCards[Game_State][13]=Sendleft[LeftNum-1];
PlayCards[Game_State][13].Click=false;
LeftNum--;
PointPlayer=(OutPlayer+1)%4;
OutCard.Num=10;
}
////////////////////////////////////////////////////////////////////////
/*
* 函数名称:SortCard(Card ca[])
* 函数介绍:理牌
* 输入参数:需要整理的牌数组
* 输出参数:无
* 返回值 :无
*/
void Managers::SortCard(Card ca[])
{
int i,j;
Card temp;
if(ca[13].Num<=9)
{
for(j=0;j<13;j++)
if(ca[j].Num==10)
break;
ca[j]=ca[13];
ca[j+1].Num=10;
}
for(i=0;i<14 && ca[i].Num<=9;i++)
for(j=i+1;j<14 && ca[j].Num<=9;j++)
if(ca[i].Type*10+ca[i].Num>ca[j].Type*10+ca[j].Num)
{
temp=ca[i];
ca[i]=ca[j];
ca[j]=temp;
}
}
void Managers::Cardinsert(const Card inc, Card ca[],int num)
{
int t,k;
for(k=0;k<20 && ca[k].Num<=9;k++);
for(t=k;t<k+num;t++)
ca[t]=inc;
SortCard(ca);
}
void Managers::Carddelete(int start, Card ca[],int num)
{
int t;
if(start==13)
{
ca[13].Num=10;
return;
}
for(t=start;t<20 && ca[t+num].Num<=9;t++)
ca[t]=ca[t+num];
ca[t].Num=10;
}
////////////////////////////////////////////////////////////////////////
/*
* 函数名称:Cardinfo(Card ca[],Card pushca[],//手上的和桌子上自己打的牌
int inp, Card inc //摸或者别人打出来的牌 以及摸或者打牌的人
int player) //ca所属于的玩家
* 函数介绍:获得牌信息
* 输入参数:略
* 输出参数:int
* 返回值 :个位:时候能碰 十位 是否能杠,百位极以 如果能和牌那么他是多少翻
*/
int Managers::Cardinfo(Card ca[],Card pushca[],int inp, Card inc,int player)
{
Card cad[14];//存储如果别人打的牌在用户手里会有什么结果
int num;
int state=0;
int i,j;
//复制所有牌,为判断和牌做准备
for(num=0;ca[num].Num<10 && num<14;num++)
{
cad[num]=ca[num];
cad[num].Click=false;
}
ca[num].Num=10;
//杠 如果是inc引起的杠
j=0;
for(i=0;ca[i+2].Num<=9;i++)
{
if(inc==ca[i] && inc==ca[i+1] && inc==ca[i+2])
{
state+=10;
break;
}
}
//杠 如果本身牌就有杠
for(i=0;ca[i+3].Num<=9 && inp==player;i++)
{
if(ca[i]==ca[i+1] && ca[i]==ca[i+2] && ca[i]==ca[i+3])
{
state+=10;
break;
}
}
//杠 补花,即把自己的碰牌补充为杠
for(i=0;pushca[i+2].Num<=9 && inp==player;i++)
{
if(pushca[i+2]==pushca[i] && pushca[i+2]==pushca[i+1])
{
if(pushca[i+3]==pushca[i])
{
i+=3;
continue;
}
/* if(inc==ca[i])
{
state+=10;
break;
}*/
for (j=0;ca[j].Num<10 && j<14;j++)
if(ca[j]==pushca[i])
{
state+=10;
break;
}
if(inc==pushca[i])
{
state+=10;
break;
}
i+=2;
}
}
//碰
{
for(i=0;ca[i+1].Num<=9 && inp!=player;i++)
if(inc==ca[i] && inc==ca[i+1])
{
state+=1;
break;
}
}
//吃
/* {
for(i=0;ca[i+1].Num<=9 && inp==(player+3)%4;i++)
if(inc.Type==ca[i].Type && inc.Type==ca[i+1].Type &&
((inc.Num==ca[i].Num-1 && inc.Num==ca[i+1].Num-2)||
(inc.Num==ca[i].Num+1 && inc.Num==ca[i+1].Num-1)||
(inc.Num==ca[i].Num+2 && inc.Num==ca[i+1].Num+1)))
{
state+=5;
break;
}
}*/
//和牌判断
j=0;
inc.Click=false;
Cardinsert(inc,cad,1);//把inc插如牌序列
num++;
if (num==14)
{
j=0;
//七对判断
for(i=0;i<=num-1;i+=2)
{
if(cad[i].Num!=cad[i+1].Num || cad[i].Type!=cad[i+1].Type)
break;
if(cad[i].Num==cad[i+3].Num && cad[i].Type==cad[i+3].Type)
j++;//龙七对
}
if(i==12)
{
//七对成功如果j>=1则龙七对成功
state+=300;
}
}
i=0;
i=GetNext(cad,num,true,cad[0].Type+1,true);
if(i>0)
{
//和牌,或者准确点说叫可以和牌了
state+=i*100;
}
return state;
}
int Managers::GetNext(Card *ca, int num,bool dou,int type,bool fu)
{
int k,tem,i,j,temp;
tem=0;
k=0;
if(num==0)
{
k=1;
if(fu)//对子福
k*=2;
i=type%10;//判断是否是清一色
while(type!=0)
{
if(type%10!=i)
break;
type/=10;
}
if(type==0)//这也是
k*=3;
}
else if(num>=2)
{
for(i=1;i<num-1 && ca[i].Type == ca[0].Type;i++)
if(!ca[i].Click)
{
ca[i].Click=true;
for(j=i+1;j<num && ca[j].Type == ca[0].Type;j++)
if(!ca[j].Click)
{
ca[j].Click=true;
for(temp=1;temp<num && ca[temp].Click;temp++);
if(ca[0].Num==ca[i].Num && ca[0].Num==ca[j].Num)
tem=GetNext(ca+temp,num-temp,(dou && true),ca[0].Type+1+type*10,(fu && true));
if (tem>k)
k=tem;
if(ca[0].Num==ca[i].Num-1 && ca[0].Num==ca[j].Num-2)
tem=GetNext(ca+temp,num-temp,(dou && true),ca[0].Type+1+type*10,false);
if(tem>k)
k=tem;
ca[j].Click=false;
}
ca[i].Click=false;
}
if(ca[0]==ca[1] && dou)
tem=GetNext(ca+2,num-2,false,ca[0].Type+type*10,(fu && true));
if(tem>k)
k=tem;
}
return k;
}
int Managers::SearchCard(Card ca[],Card cad)
{
int i;
for(i=0;ca[i].Num<10;i++)
if(ca[i]==cad)
return i;
if(ca[13]==cad)
return 13;
return -1;
}
void Managers::GameOver(int num)
{
if(MainComputer)
{
pControl->m_ready[0]=false;
pControl->m_ready[1]=false;
pControl->m_ready[2]=false;
pControl->m_ready[3]=false;
}
LastWiner=Game_State;
//算分
if(OutCard.Num<10)//有人点炮
{
PlayPoints[OutPlayer]-=3*Power[Game_State]*num;
PlayPoints[Game_State]+=3*Power[Game_State]*num;
int i;
for(i=0;i<4;i++)
if(i!=OutPlayer)
LastPoints[i]=0;
else if(i==OutPlayer)
LastPoints[i]=-3*Power[Game_State]*num;
else
LastPoints[i]=3*Power[Game_State]*num;
}
else//自摸
{
PlayPoints[Game_State]+=9*Power[Game_State]*num;
LastPoints[Game_State]=9*Power[Game_State]*num;
int i;
for(i=0;i<4;i++)
if(i!=Game_State)
{
PlayPoints[i]-=3*Power[Game_State]*num;
LastPoints[i]=-3*Power[Game_State]*num;
}
}
Power[0]=1;
Power[1]=1;
Power[2]=1;
Power[3]=1;
Game_State+=4;
}
////////////////////////////////////////////////////////////////////////
/*
* 函数名称:PlaySound
* 函数介绍:播放声音
* 输入参数:action含义
1过 2 出牌 3吃 4碰 5杠 9和
* 输出参数:无
* 返回值 :无 int Num;//牌面数目 1-9 大与9表示此牌不存在
int Type;//牌的类型 条=0 万=1 饼=2
*/
void Managers::PlaySound(int action)
{
TCHAR szFilePath[MAX_PATH + 1];
GetModuleFileName(NULL, szFilePath, MAX_PATH);
(_tcsrchr(szFilePath, '\\'))[1] = '\0'; //删除文件名,只获得路径
switch(action)
{
case -1:
strcpy(szFilePath+strlen(szFilePath), "sound\\dice.wav");
m_sound.PlayWaveSound(szFilePath);
break;
case 0:
m_backmusic.Play();
break;
case 1:
strcpy(szFilePath+strlen(szFilePath), "sound\\wrong.wav");
m_sound.PlayWaveSound(szFilePath);
break;
case 2:
strcpy(szFilePath+strlen(szFilePath), "sound\\click.wav");
m_sound.PlayWaveSound(szFilePath);
break;
case 3:
strcpy(szFilePath+strlen(szFilePath), "sound\\give.wav");
m_sound.PlayWaveSound(szFilePath);
break;
case 4:
strcpy(szFilePath+strlen(szFilePath), "sound\\give.wav");
m_sound.PlayWaveSound(szFilePath);
break;
case 5:
strcpy(szFilePath+strlen(szFilePath), "sound\\give.wav");
m_sound.PlayWaveSound(szFilePath);
break;
case 9:
strcpy(szFilePath+strlen(szFilePath), "sound\\win.wav");
m_backmusic.Stop();
isPlayBkmusic=false;
m_sound.PlayWaveSound(szFilePath);
break;
default:
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -