📄 ddz2.cpp
字号:
return 0;
/*//出单王
if(searchDanJoker())
{playDanJoker(player);return 1;}*/
}
////////////////////////////////////////////////////////////////////////////////
//被动出牌
////////////////////////////////////////////////////////////////////////////////
int out2(PLAYER *player)
{//单张
if(strcmp(CurrentOutCard.type ,"gz") == 0)
{
if(playDanZhang2(player))
return 1;
else
{
if(searchZhaDan()) //有炸弹出之
{playZhaDan(player);return 1;}
else if(searchJoker())//有双王出之
{playJoker(player);return 1;}
else
return 0;//过
}
}
//对子
if(strcmp(CurrentOutCard.type ,"dz") == 0)//
{
if(playDuiZi2(player))
return 1;
else
{
if(searchZhaDan()) //有炸弹出之
{
playZhaDan(player);
return 1;
}
else
if(searchJoker())//有双王出之
{
playJoker(player);
return 1;
}
else
return 0;
}
}
//三张
if(strcmp(CurrentOutCard.type ,"sgbd") == 0)
{
if(playSanZhang2(player))
return 1;
else
{
if(searchZhaDan()) //有炸弹出之
{playZhaDan(player);return 1;}
else if(searchJoker())//有双王出之
{playJoker(player);return 1;}
else
return 0;
}
}
//三带一
if(strcmp(CurrentOutCard.type ,"sd1") == 0)//
{
if(playSanDaiYi(player))
return 1;
else
{
if(searchZhaDan()) //有炸弹出之
{playZhaDan(player);return 1;}
else if(searchJoker())//有双王出之
{playJoker(player);return 1;}
else
return 0;
}
}
//连子
if(strcmp(CurrentOutCard.type ,"sz") == 0)//
{
if(playLianZi2(player))
return 1;
else
{
if(searchZhaDan()) //有炸弹出之
{playZhaDan(player);return 1;}
else if(searchJoker())//有双王出之
{playJoker(player);return 1;}
else
return 0;
}
}
//四带二
if(strcmp(CurrentOutCard.type ,"sd2g") == 0)//
{
if(playSiDai2(player))
return 1;
else
{
if(searchZhaDan()) //有炸弹出之
{playZhaDan(player);return 1;}
else if(searchJoker())//有双王出之
{playJoker(player);return 1;}
else
return 0;
}
}
//炸弹
if(strcmp(CurrentOutCard.type ,"zd") == 0)//
{
if(playZhaDan2(player))
return 1;
else
{
if(searchJoker())//有双王出之
{playJoker(player);return 1;}
else
return 0;
}
}
//双王
if(strcmp(CurrentOutCard.type ,"sw") == 0)//
{
if(searchJoker())//有双王出之
{playJoker(player);return 1;}
else
return 0;
}
return 0;
}
////////////////////////////////////////////////////////////////////////////////
// 出牌
////////////////////////////////////////////////////////////////////////////////
int OutCard()
{
switch (g_nTurnOut)
{
case 1:
{
AnalyseCard(player1);
if(g_nTurnOut ==g_nLastWhoOut)//
{
out1(&player1);
return 1;
}
else
if(out2(&player1))
return 1;
}break;
case 3:
{
AnalyseCard(player3);
if(g_nTurnOut ==g_nLastWhoOut)//
{
out1(&player3);
return 1;
}
else
if(out2(&player3))
return 1;
}break;
}
return 0;
}
//不出
void NotOut(int turn)
{
if(turn == 1) g_nPlayer1NotOut = 1;
if(turn == 3) g_nPlayer3NotOut = 1;
}
//
void LastWhoOut(int turn)
{
if(turn == 1) g_nLastWhoOut = 1;
if(turn == 2) g_nLastWhoOut = 2;
if(turn == 3) g_nLastWhoOut = 3;
}
////////////////////////////////////////////////////////////////////////////////
//出牌算法
////////////////////////////////////////////////////////////////////////////////
void HowToOut(int turn)
{
int before,after;
before = turn - 1;
if(before == 0) before = 3;
after = turn + 1;
after %= 3;
if(after == 0)after = 3;
if(g_nLastWhoOut == before && g_nWhoIsLord == before)//上家是地主,上家出的牌,33
{
if(OutCard() == 0)//判断能不能出
NotOut(turn);//不出
else
LastWhoOut(turn);
}
else
{
if(g_nLastWhoOut == after && g_nWhoIsLord == after)//上上家是地主,上家没出牌,22
{
if(OutCard() == 0)//判断能不能出
NotOut(turn);//
else
LastWhoOut(turn);
}
else
{
if(g_nWhoIsLord == turn)//自己是地主,11
{
if(OutCard() == 0)//判断能不能出
NotOut(turn);//
else
LastWhoOut(turn);
}
else
if(g_nLastWhoOut == before && g_nWhoIsLord == after)//下家是地主,上家出牌太小,32
{
if(strcmp(CurrentOutCard.type,"gz") == 0 && CurrentOutCard.card <10)
{
if(OutCard() == 0)//判断能不能出
NotOut(turn);//
else
LastWhoOut(turn);
}
else
if(strcmp(CurrentOutCard.type,"dz") == 0 && CurrentOutCard.card <8)
{
if(OutCard() == 0)//判断能不能出
NotOut(turn);//
else
LastWhoOut(turn);
}
else
NotOut(turn);
}
else
NotOut(turn);//不出
}
}
}
////////////////////////////////////////////////////////////////////////////////
// 初级化窗口
////////////////////////////////////////////////////////////////////////////////
void clear(HWND hWnd)
{
//初级化牌
for(int i = 0 ; i < 20 ; i++)
{
player1.statics[i] = 0 ;
player2.statics[i] = 0 ;
player3.statics[i] = 0 ;
player1.card[i] = 0 ;
player2.card[i] = 0 ;
player3.card[i] = 0 ;
player4.card[i] = 0 ;
}
g_nShowNotOut = 0;
g_nPlayer1NotOut = 0;
g_nPlayer3NotOut = 0;
g_nTurnOut = 0;
g_nLastWhoOut = 0;//上次是谁出的
}
////////////////////////////////////////////////////////////////////////////////
// //是否结束
////////////////////////////////////////////////////////////////////////////////
int CheckIfOver(HWND hWnd)
{
if(CardNum(player1,0) == 0)
{
MessageBox(hWnd , _T(" player1赢了! ") , _T("恭喜") , MB_OK) ;
g_nShowStart = 1;
clear(hWnd);
return 1;
}
else
if(CardNum(player2,0) == 0)
{
MessageBox(hWnd , _T("恭喜,你赢了!") , _T("恭喜") , MB_OK) ;
g_nShowStart = 1;
clear(hWnd);
return 1;
}
else
if(CardNum(player3,0) == 0)
{
MessageBox(hWnd , _T(" player3赢了! ") , _T("恭喜") , MB_OK) ;
g_nShowStart = 1;
clear(hWnd);
return 1;
}
return 0;
}
////////////////////////////////////////////////////////////////////////////////
// 游戏主函数
////////////////////////////////////////////////////////////////////////////////
int GameMain(HWND hWnd)
{
//::PatBlt(g_hMemDC , 0 , 100 , 50 , 200 , WHITENESS) ;
int nTime = 800;
if(g_nShowStart == 1)
return 0;
if(g_nTurnOut == 2)
g_nShowNotOut = 1;
if((g_nTurnOut == 2 && g_nLastWhoOut == 2 )|| g_nTurnOut == 3 || g_nTurnOut == 1)
g_nShowNotOut = 0;
if(g_nCanNotOut == 1)
{
delay(1000);
g_nCanNotOut = 0;
}
//delay(nTime);
if(g_nIfBegin == 1)//刚开始
{
switch (g_nTurnGetLord)
{delay(nTime);
case 1:
{
if(IfGetLord(player1))
{
GetLord(&player1);//叫
g_nLastWhoOut = 1;
g_nWhoIsLord = 1;
g_nTurnOut = 1;
g_nPlayer3NotGet = 0;
g_nPlayer1NotGet = 0;
return 1;
}
else//不叫
{
g_nPlayer1NotGet = 1;
NotGetLord(hWnd);
if(g_nNotGetLord >=3)
{
g_nNotGetLord = 0;
g_nTurnGetLord = rand() % 3 +1;
g_nIfBegin = 1;
MessageBox(hWnd , _T("都不叫,重新发牌!") , _T("提示信息") , MB_OK);
g_nPlayer3NotGet = 0;
g_nPlayer1NotGet = 0;
SendOutCard();
return 1;
}
}
}
break;
case 2:
{
g_nShow3f = 1;//控制叫按钮
g_nShowNotGet = 1;//控制不叫按钮
} break;
case 3:
{
if(IfGetLord(player3))
{
GetLord(&player3);//叫
g_nLastWhoOut = 3;
g_nWhoIsLord = 3;
g_nTurnOut = 3;
g_nPlayer1NotGet = 0;
g_nPlayer3NotGet = 0;
return 1;
}
else
{
NotGetLord(hWnd);//不叫
g_nPlayer3NotGet = 1;
if(g_nNotGetLord >=3)
{
g_nNotGetLord = 0;
g_nTurnGetLord = rand() % 3 +1;
MessageBox(hWnd , _T("都不叫,重新发牌!") , _T("提示信息") , MB_OK);
g_nPlayer3NotGet = 0;
g_nPlayer1NotGet = 0;
SendOutCard();
return 1;
}
}
} break;
}//switch
}
else//不是刚开始
{
switch (g_nTurnOut)//到谁出
{
case 1:
{delay(nTime);
if(CheckIfOver(hWnd)) return 0;//是否结束
DelCard(&player1) ;
DelCard(&player1) ;
DelCard(&player1) ;
DelCard(&player1) ;
if(g_nLastWhoOut == 1)//必需出牌
{
OutCard();//
g_nLastWhoOut = 1;
}
else
{
HowToOut(1);
}
g_nPlayer3NotOut = 0;
g_nTurnOut++;
g_nTurnOut = g_nTurnOut % 3 ;
if(g_nTurnOut == 0) g_nTurnOut = 3 ;
}
break;
case 2:
{
//g_nPlayer1NotOut = 0;
if(CheckIfOver(hWnd)) return 0;
DelCard(&player2) ;
DelCard(&player2) ;
DelCard(&player2) ;
DelCard(&player2) ;
if(g_nOutFlag == 1)//点了右键
{
int i ;
for(i = 0 ; i < 20 ; i++)//改状态
{
if(player2.statics[i] == 1)
{
player2.statics[i] = 2 ;
}
}
if(CheckCard(player2) == 0 )//改状态
{
for(i = 0 ; i < 20 ; i++)
{
if(player2.statics[i] == 2)
{
player2.statics[i] = 1 ;
}
}
g_nCanNotOut = 1 ;
}
else//2出
{
g_nLastWhoOut = 2;
g_nTurnOut ++;
g_nTurnOut = g_nTurnOut % 3 ;
if(g_nTurnOut == 0)
g_nTurnOut = 3;
g_nPlayer1NotGet = 0;
g_nShowNotOut = 0;
g_nPlayer3NotOut = 0;
}
}
}
g_nOutFlag = 0;
break;
case 3:
{
if(CheckIfOver(hWnd)) return 0;
delay(nTime);
g_nPlayer3NotOut = 0;
g_nPlayer1NotOut = 0;
DelCard(&player3) ;
DelCard(&player3) ;
DelCard(&player3) ;
DelCard(&player3) ;
if(g_nLastWhoOut == 3)//必需出牌
{
OutCard();//
g_nLastWhoOut = 3;
}
else
{
HowToOut(3);
}
g_nPlayer1NotOut = 0;
g_nTurnOut++;
g_nTurnOut = g_nTurnOut % 3 ;
if(g_nTurnOut == 0) g_nTurnOut = 3 ;
}
break;
}//switch
}//else
return 1;
}
////////////////////////////////////////////////////////////////////////////////
// 显示缓冲窗口
////////////////////////////////////////////////////////////////////////////////
void LoadMem(HWND hWnd , HDC hDC)
{
RECT rcClient ;
::GetClientRect(hWnd , &rcClient) ; // 取得客户区大小
::BitBlt(hDC , // 目的DC
0 , 0 ,
rcClient.right , rcClient.bottom ,
g_hMemDC , // 源DC
0 , 0 ,
SRCCOPY) ; // 复制缓冲DC到屏幕
}
////////////////////////////////////////////////////////////////////////////////
// 把牌显示到缓冲g_hMemDC
////////////////////////////////////////////////////////////////////////////////
void AddToMemDC(HWND hWnd , int PicName , int x , int y ,int Width,int Height)
{
// 加载图像
HBITMAP hBitmap = (HBITMAP)LoadImage(g_hInstance ,
(unsigned short*)PicName ,
IMAGE_BITMAP ,
0 ,
0 ,
0);
BITMAP object ;
::GetObject(hBitmap , sizeof(BITMAP) , &object) ;
//g_nCardWidth = object.bmWidth ;
g_nCardHeight = object.bmHeight ;
// 创建card DC
HDC hCardDC = NULL ;
hCardDC = ::CreateCompatibleDC(NULL) ; // 此步不可缺!
::SelectObject(hCardDC , hBitmap) ; // 此步不可缺!
::DeleteObject(hBitmap) ; // 可以释放了!
//RECT rcClient ;
//::GetClientRect(hWnd , &rcClient) ;
::BitBlt(g_hMemDC , // 目标DC
x , y ,
Width , Height ,
hCardDC , // 源DC
0 , 0 ,
SRCCOPY) ;
DeleteDC(hCardDC) ;
}
////////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -