📄 managers.cpp
字号:
// Managers.cpp: implementation of the Managers class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "program.h"
#include "Managers.h"
#include "ProgramDoc.h"
#include "ProgramView.h"
#include "Num.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////
bool operator ==(const Card &a,const Card &t)
{
if(a.Type==t.Type && a.Num==t.Num)
return true;
return false;
}
/////////////////////////////////////////////////////////
Managers::Managers()
{
srand(time(NULL));
Game_State=-2;
LastWiner=0;
OutCard.Num=10;
OutPlayer=4;
Power[0]=1;
Power[1]=1;
Power[2]=1;
Power[3]=1;
PlayPoints[0]=100;
PlayPoints[1]=100;
PlayPoints[2]=100;
PlayPoints[3]=100;
PlayCards[0][13].Num=10;
leftstart=-1;
leftend=-1;
PointPlayer=0;
isPlayBkmusic = false;
}
Managers::~Managers()
{
}
void Managers::GameStart()
{
leftstart=-1;
leftend=-1;
OutCard.Num=10;
OutPlayer=(LastWiner+3)%4+1;
int i,j;
for(i=0;i<4;i++)
{
Outsnum[i]=0;
for(j=0;j<20;j++)
{
PushCards[i][j].Num=10;
PlayOuts[i][j].Num=10;
}
}
Game_State=LastWiner;
PointPlayer=LastWiner;
Power[0]=1;
Power[1]=1;
Power[2]=1;
Power[3]=1;
LeftNum=55;
// if(MainComputer)
{
SendCard();
for(i=0;i<4;i++)
SortCard(PlayCards[i]);
leftstart=rand()%54*2;
leftend=(leftstart+55)%108;
}
isPlayBkmusic = true;
}
////////////////////////////////////////////////////////////////////////
/*
* 函数名称:SendCard()
* 函数介绍:发牌,完成初始化各玩家的牌
* 输入参数:无
* 输出参数:无
* 返回值 :无
*/
void Managers::SendCard()
{
int x,y,k;
bool cards[108]={false};
for(x=0;x<4;x++)
{
for(y=0;y<13;y++)
{
do
{
k=rand()%108;
}
while(cards[k]);
cards[k]=true;
PlayCards[x][y].Num=k%9+1;
PlayCards[x][y].Type=k/36;
PlayCards[x][y].Click=false;
}
}
PlayCards[0][13].Num=10;
PlayCards[1][13].Num=10;
PlayCards[2][13].Num=10;
PlayCards[3][13].Num=10;
do
{
k=rand()%108;
}
while(cards[k]);
Card te;
te.Num=k%9+1;
te.Type=k/36;
te.Click=false;
if(LastWiner==PlayerAc)
Actions=Cardinfo(PlayCards[LastWiner],PushCards[LastWiner],LastWiner,te,LastWiner);
else
Actions=0;
PlayCards[LastWiner][13]=te;
cards[k]=true;
y=0;
while(y<55)
{
do
{
k=rand()%108;
}
while(cards[k]);
Sendleft[y].Num=k%9+1;
Sendleft[y].Type=k/36;
Sendleft[y].Click=false;
y++;
cards[k]=true;
}
Sendleft[y].Num=10;
}
////////////////////////////////////////////////////////////////////////
/*
* 函数名称:DoMSG( int num //第几的一张牌
int action) //行为
* 函数介绍:消息响应
* 输入参数:action含义
1过 2 出牌 3吃 4碰 5杠 9和
* 输出参数:bool
* 返回值 :true 表示响应成功 false为失败
*/
bool Managers::DoMsg(int num, int action)
{
Card *ca=PlayCards[PlayerAc];
if(Game_State==PlayerAc)
{
if(action==1 && OutCard.Num<=9 && OutPlayer!=PlayerAc && Actions!=0)
{
if(!MainComputer)
pControl->SendCard(1,NULL);
else
pControl->BroadcastCard(1,NULL);
Updata();
pView->PrintAll();
PlaySound(action);
return true;
}
if(action==2 && OutCard.Num==10 && Game_State==PlayerAc)
{
PlayOuts[PlayerAc][Outsnum[PlayerAc]]=ca[num];
Outsnum[PlayerAc]++;
PlayOuts[PlayerAc][Outsnum[PlayerAc]].Num=10;
OutCard=ca[num];
OutCard.Click=true;
OutPlayer=PlayerAc;
Carddelete(num,ca,1);
SortCard(ca);
PlayCards[PlayerAc][13].Num=10;
if(!pControl->m_Isserver)
pControl->SendCard(2,&OutCard);
else
pControl->BroadcastCard(2,&OutCard);
Updata();
pView->PrintAll();
PlaySound(action);
return true;
}
if(action==3)
{
return false;//在这里,本麻将不准许“吃”
}
if(action==4 && Actions%10==1)//碰
{
int i;
for(i=0;ca[i+1].Num<10 && i<14;i++)
if(ca[i]==OutCard && ca[i+1]==OutCard)
{
char st[100];
if(ca[i].Type==0)
sprintf(st,"您是要碰%d条吗?",ca[i].Num);
else if(ca[i].Type==1)
sprintf(st,"您是要碰%d万吗?",ca[i].Num);
else if(ca[i].Type==2)
sprintf(st,"您是要碰%d饼吗?",ca[i].Num);
int k;
k=MessageBox(GetActiveWindow(),st,"询问",MB_OKCANCEL);
if(k!=1)
break;
Card te=OutCard;
OutCard.Click=true;
Cardinsert(OutCard,PushCards[PlayerAc],3);
Carddelete(i,ca,2);
OutCard.Num=10;
PlayOuts[OutPlayer][Outsnum[OutPlayer]-1].Num=10;
Outsnum[OutPlayer]--;
if(!MainComputer)
pControl->SendCard(4,&te);
else
pControl->BroadcastCard(4,&te);
PointPlayer=PlayerAc;
Actions=0;
pView->PrintAll();
PlaySound(action);
return true;
}
}
if(action==5 && Actions%100>=10)//杠在 这里分4种讨论,这会影响到后面的UpData
{
int i;
for(i=0;ca[i+2].Num<10 && i<13;i++)//用别人出的牌杠
if(ca[i]==OutCard && ca[i+1]==OutCard && ca[i+2]==OutCard)
{
char st[100];
if(ca[i].Type==0)
sprintf(st,"您是要杠%d条吗?",ca[i].Num);
else if(ca[i].Type==1)
sprintf(st,"您是要杠%d万吗?",ca[i].Num);
else if(ca[i].Type==2)
sprintf(st,"您是要杠%d饼吗?",ca[i].Num);
int k;
k=MessageBox(GetActiveWindow(),st,"询问",MB_OKCANCEL);
if(k!=1)
break;
Card te=OutCard;
OutCard.Click=true;
Cardinsert(OutCard,PushCards[PlayerAc],4);
Carddelete(i,ca,3);
OutCard.Num=10;
PlayOuts[OutPlayer][Outsnum[OutPlayer]-1].Num=10;
Outsnum[OutPlayer]--;
if(!MainComputer)
pControl->SendCard(5,&te);
else
pControl->BroadcastCard(5,&te);
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;
pView->PrintAll();
PlaySound(action);
return true;
}
for(i=0;ca[i+2].Num<10 && i<13;i++)//自己摸的牌暗杠
if(ca[i]==ca[13] && ca[i+1]==ca[13] && ca[i+2]==ca[13])
{
char st[100];
if(ca[i].Type==0)
sprintf(st,"您是要杠%d条吗?",ca[i].Num);
else if(ca[i].Type==1)
sprintf(st,"您是要杠%d万吗?",ca[i].Num);
else if(ca[i].Type==2)
sprintf(st,"您是要杠%d饼吗?",ca[i].Num);
int k;
k=MessageBox(GetActiveWindow(),st,"询问",MB_OKCANCEL);
if(k!=1)
break;
Card te=ca[13];
ca[13].Click=false;
Cardinsert(ca[13],PushCards[PlayerAc],4);
Carddelete(13,ca,1);
Carddelete(i,ca,3);
if(!MainComputer)
pControl->SendCard(6,&te);
else
pControl->BroadcastCard(6,&te);
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 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;
pView->PrintAll();
PlaySound(action);
return true;
}
for(i=0;ca[i+3].Num<10 && i<14;i++)//自己本来就有的牌暗杠
if(ca[i]==ca[i+1] && ca[i]==ca[i+2] && ca[i]==ca[i+3])
{
char st[100];
if(ca[i].Type==0)
sprintf(st,"您是要杠%d条吗?",ca[i].Num);
else if(ca[i].Type==1)
sprintf(st,"您是要杠%d万吗?",ca[i].Num);
else if(ca[i].Type==2)
sprintf(st,"您是要杠%d饼吗?",ca[i].Num);
int k;
k=MessageBox(GetActiveWindow(),st,"询问",MB_OKCANCEL);
if(k!=1)
continue;
Card te=ca[i];
ca[i].Click=false;
Cardinsert(ca[i],PushCards[PlayerAc],4);
Carddelete(i,ca,4);
if(!pControl->m_Isserver)
pControl->SendCard(7,&te);
else
pControl->BroadcastCard(7,&te);
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 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;
}
//补花(也是杠的一种)
for(i=0;PushCards[PlayerAc][i+2].Num<10 && i<14;i++)
if(PushCards[PlayerAc][i+2]==PushCards[PlayerAc][i] && PushCards[PlayerAc][i+2]==PushCards[PlayerAc][i+1])
{
if(PushCards[PlayerAc][i]==PushCards[PlayerAc][i+3])
{
i+=3;
continue;
}
int j;
for(j=0;ca[j].Num<10 && j<14;j++)
if(ca[j]==PushCards[PlayerAc][i])
break;
if(ca[13]==PushCards[PlayerAc][i])
{
j=13;
}
else if(ca[j].Num>=10)
{
i+=2;
continue;
}
char st[100];
if(ca[j].Type==0)
sprintf(st,"您是要杠%d条吗?",ca[j].Num);
else if(ca[j].Type==1)
sprintf(st,"您是要杠%d万吗?",ca[j].Num);
else if(ca[j].Type==2)
sprintf(st,"您是要杠%d饼吗?",ca[j].Num);
int k;
k=MessageBox(GetActiveWindow(),st,"询问",MB_OKCANCEL);
if(k!=1)
{
i+=2;
continue;
}
Card te=ca[j];
te.Click=true;
Cardinsert(te,PushCards[PlayerAc],1);
Carddelete(j,ca,1);
if(!pControl->m_Isserver)
pControl->SendCard(8,&te);
else
pControl->BroadcastCard(6,&te);
if(LeftNum==0)
{
Game_State=10;
if(MainComputer)
{
pControl->m_ready[0]=false;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -