⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ddz2.cpp

📁 EVC 下的斗地主源码,有AI机器人,运行环境是模拟器5
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	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 + -