急啊,高分请教高手,关于斗地主游戏,怎么才能修改以下代码才能也看到另外两个玩家的牌,说白了就是作弊功能。
//建立消息
int CClientPlayView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
// 发牌界面
int iCreateIndex[3]={1,2,0};
for (int i=0;i<3;i++)
{//建立客户扑克
m_UserCard[iCreateIndex[i]].Create(NULL,NULL,WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS,CRect(0,0,0,0),this,10+i,NULL);
m_UserCard[iCreateIndex[i]].SetShowCard(true);
m_UserCard[i].InitGameCard(GetParent());// 不加,造成右键点牌重启
//建立三张底牌
m_UserBackCard[i].Create(NULL,NULL,WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS,CRect(0,0,0,0),this,30+i,NULL);
m_UserBackCard[i].InitGameCard(GetParent());
}//左边牌显示
m_MeCard.Create(NULL,NULL,WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS,CRect(0,0,0,0),this,15,NULL);
m_MeCard.InitGameCard(GetParent());// 不加,造成右键点牌重启
m_LeftCard.Create(NULL,NULL,WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS,CRect(0,0,0,0),this,16,NULL);
m_LeftCard.InitGameCard(GetParent());
m_LeftCard.SetLookMode(false);
m_LeftCard.SetShowCard(false);//隐藏
//右边牌显示
m_RightCard.Create(NULL,NULL,WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS,CRect(0,0,0,0),this,17,NULL);
m_RightCard.InitGameCard(GetParent());// 不加,造成右键点牌重启
m_RightCard.SetLookMode(false);
m_RightCard.SetShowCard(false);//隐藏
//底牌显示
m_MeBackCard.Create(NULL,NULL,WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS,CRect(0,0,0,0),this,18,NULL);
m_MeBackCard.InitGameCard(GetParent());// 不加,造成右键点牌重启
m_MeBackCard.SetShowCard(false);
m_MeBackCard.SetUseMouse(false);
m_MeBackCard.ShowWindow(SW_HIDE); if (CUsingSkinClass::OnCreate(lpCreateStruct) == -1) return -1;
//建立控件
m_btOutCard.Create(NULL,WS_CHILD|WS_CLIPSIBLINGS|BS_OWNERDRAW,CRect(0,0,76,53),this,IDC_OUT_CARD);//出牌
m_btOutCard.LoadButtonBitmap("pic\\ddz\\OutCard.jpg",true);
m_btPass.Create(NULL,WS_CHILD|WS_CLIPSIBLINGS|BS_OWNERDRAW,CRect(0,0,76,53),this,IDC_PASS);//不出
m_btPass.LoadButtonBitmap("pic\\ddz\\Pass.jpg",true);
m_btTMLtishi.Create(NULL,WS_CHILD|WS_CLIPSIBLINGS|BS_OWNERDRAW,CRect(0,0,76,53),this,IDC_TMLtishi);//提示
m_btTMLtishi.LoadButtonBitmap("pic\\ddz\\ddzts.jpg",true);
m_btLiangPaiDa.Create(NULL,WS_CHILD|WS_CLIPSIBLINGS|BS_OWNERDRAW,CRect(0,0,76,53),this,IDC_LIANGPAI);//明牌 //地主亮牌打按钮 m_btLiangPaiDa.SetFont(&CGameImageLink::m_HFont); 
m_btContinue.Create(NULL,WS_CHILD|WS_CLIPSIBLINGS|BS_OWNERDRAW,CRect(0,0,76,53),this,IDC_CONTINUE);//开始 
m_btContinue.LoadButtonBitmap("pic\\ddz\\ddzks.jpg",true); // 开始按钮 [10/23/2007 by slt]
m_btJiaoFen1.Create(NULL,WS_CHILD|WS_CLIPSIBLINGS|BS_OWNERDRAW,CRect(0,0,76,53),this,IDC_JIAO_FEN1);//1分 
m_btJiaoFen1.LoadButtonBitmap("pic\\ddz\\ddz1f.jpg",true); // 一分 [10/23/2007 by slt]
m_btJiaoFen2.Create(NULL,WS_CHILD|WS_CLIPSIBLINGS|BS_OWNERDRAW,CRect(0,0,76,53),this,IDC_JIAO_FEN2);//2分
m_btJiaoFen2.LoadButtonBitmap("pic\\ddz\\ddz2f.jpg",true); // 二分 [10/23/2007 by slt]
m_btJiaoFen3.Create(NULL,WS_CHILD|WS_CLIPSIBLINGS|BS_OWNERDRAW,CRect(0,0,76,53),this,IDC_JIAO_FEN3);//3分
m_btJiaoFen3.LoadButtonBitmap("pic\\ddz\\ddz3f.jpg",true); // 三分 [10/23/2007 by slt]
m_btGiveUpFen.Create(NULL,WS_CHILD|WS_CLIPSIBLINGS|BS_OWNERDRAW,CRect(0,0,76,53),this,IDC_GIVE_UP_FEN);//不叫
m_btGiveUpFen.LoadButtonBitmap("pic\\ddz\\ddzbj.jpg",true); m_btQiangDZ.Create(NULL,WS_CHILD|WS_CLIPSIBLINGS|BS_OWNERDRAW,CRect(0,0,80,25),this,IDC_QiangDZ);//抢地主按钮  相当于6分
m_btQiangDZ.LoadButtonBitmap("pic\\ddzqdz.jpg",false);//抢地主按钮
m_btBuQiangDZ.Create(NULL,WS_CHILD|WS_CLIPSIBLINGS|BS_OWNERDRAW,CRect(0,0,80,25),this,IDC_BuQiangDZ);//抢地主按钮
m_btBuQiangDZ.LoadButtonBitmap("pic\\ddzbq.jpg",false);//不抢地主按钮 m_btLastTurn.Create(NULL,WS_CHILD|WS_CLIPSIBLINGS|WS_VISIBLE|WS_DISABLED|BS_OWNERDRAW,CRect(0,0,81,32),this,IDC_LAST_CARD);
m_btLastTurn.LoadButtonBitmap("pic\\ddz\\LastTurn.jpg",true); //上一轮  [10/23/2007 by slt]
m_btSortCard.Create(NULL,WS_CHILD|WS_CLIPSIBLINGS|WS_VISIBLE|WS_DISABLED|BS_OWNERDRAW,CRect(0,0,81,32),this,IDC_BACK_CARD);
m_btSortCard.LoadButtonBitmap("pic\\ddz\\SortCard.jpg",true); // 排序 [10/23/2007 by slt]
//m_btThing.Create(TEXT("有事要走"),WS_CHILD|WS_CLIPSIBLINGS|WS_VISIBLE|WS_DISABLED|BS_OWNERDRAW,CRect(0,0,25,25),this,IDC_HAVE_THING);
m_GameNoteView.Create(NULL,NULL,WS_CHILD|WS_CLIPSIBLINGS,CRect(0,0,0,0),this,50,NULL);
m_GameNoteView.AutoSize(); DDCOLORKEY color_key; // used to set color key
color_key.dwColorSpaceLowValue  = 0;
color_key.dwColorSpaceHighValue = 0;
m_lpDDSSource_Jiantou->SetColorKey(DDCKEY_SRCBLT,&color_key);
return 0;
}//重画函数,上面的代码大部分在这以下的代码中处理(具体也不是老清楚,看的头大...)
void CUpGradeGameCard::OnPaint()
{
CRect ClipRect ;
GetUpdateRect(&ClipRect, FALSE);
CWnd::OnPaint(); if (m_bCardCount==0) 
{
return;
} int PaintCount = m_bCardCount;
if (!m_bHorzLook&&!m_bShowCard)
{
if(m_bCardCount>4)
{
m_bCardCount=4;
}
}
//建立缓冲
CSize CardSize;
GetCardSize(CardSize); DD_RELEASE(m_lpDDSWindow);
if ( FALSE == g_DDControl.CreateSecondarySurface( CardSize.cx, CardSize.cy , &m_lpDDSWindow))
{
AfxMessageBox("生成CClientPlayView::OnCreate()的离屏表面失败!");
} //绘画扑克
int iXPos=0,iYPos=0;
IDirectDrawSurface* m_lpDDSSource_Active = NULL;
for (BYTE i=0;i<m_bCardCount;i++)
{
BYTE bCard = m_CardArray.GetAt(i);
BYTE bUpCard = m_CardUpArray.GetAt(i); if ((m_bShowCard==true)&&(m_CardArray.GetAt(i)!=0))
{
if ((bCard==0x4E)||(bCard==0x4F))
{
iYPos=0;
iXPos=(bCard-0x4D)*m_iCardWidth;
m_lpDDSSource_Active = m_lpDDSSource_CardPic[1] ;
}
else
{

m_lpDDSSource_Active = m_lpDDSSource_CardPic[0] ;
iXPos=GetCardXPos(bCard)*m_iCardWidth;
iYPos=GetCardYPos(bCard)*m_iCardHight;
}
}
else//反面
{
iYPos=0;
iXPos=0;
m_lpDDSSource_Active = m_lpDDSSource_CardPic[1] ;
}
if (m_bHorzLook==true) 
{ {
g_DDControl.StretchBlt( m_lpDDSWindow, i*m_iCardHSpace,bUpCard?0:m_iCardUpSpace,m_iCardWidth,m_iCardHight,
m_lpDDSSource_Active, iXPos,iYPos, m_iCardWidth, m_iCardHight);
} }
else 
{
{
g_DDControl.StretchBlt( m_lpDDSWindow, 0,i*m_iCardVSpace,m_iCardWidth,m_iCardHight,
m_lpDDSSource_Active, iXPos,iYPos, m_iCardWidth, m_iCardHight);
}
} } if (!m_bHorzLook)
{//显示牌数量
//绘画牌数量
TCHAR szBuffer[3];
} // 翻屏到主表面 CRect rrc;
rrc.left = 0;
rrc.right = CardSize.cx;
rrc.top = 0;
rrc.bottom = CardSize.cy;
g_DDControl.Flip( m_hWnd, rrc, m_lpDDSWindow, rrc);
//清理资源 
m_bCardCount = PaintCount; return;
}

解决方案 »

  1.   

    找到m_bShowCard的地址修改.
    网络游戏是没有对手牌的信息保存在本地的 只是需要的时候会从网络上传下来当前需要的牌信息.
      

  2.   

    把封包从pGameEnd 改成pGameBegin 放在case GS_PLAY_GAME:里
    总之,放在一个发完牌之后还有封包的地方..
    case ASS_CONTINUE_END:
    .....
    //直到翻牌的代码处
    for (int i=0;i<3;i++)
    {int iViewStation=ViewStation(i);
    if(iViewStation==0){//显示右侧剩余牌
    m_PlayView.m_RightCard.SetShowCard(true);
    m_PlayView.m_RightCard.SetCard(pGameEnd->iUserCard[i],NULL,pGameEnd->iUserCardCount[i]);
    }
    else if (iViewStation==2){//显示左侧剩余牌 m_PlayView.m_LeftCard.SetShowCard(true);
    m_PlayView.m_LeftCard.SetCard(pGameEnd->iUserCard[i],NULL,pGameEnd->iUserCardCount[i]);
    }
    else if ((iViewStation==1)&&(pGameEnd->iUserCardCount[i]==0)){
    m_PlayView.m_MeCard.SetCard(pGameEnd->iUserCard[i],NULL,17);
    }
    }结贴 给分
      

  3.   

    我最后提醒你一句话,在那个消息处理函数里找case,别的不再多说