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

📄 ddz2.cpp

📁 EVC 下的斗地主源码,有AI机器人,运行环境是模拟器5
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	g_nTurnGetLord = g_nTurnGetLord % 3 ;
	if(g_nTurnGetLord == 0) g_nTurnGetLord = 3;
	g_nWhoIsLord = 0;
}
////////////////////////////////////////////////////////////////////////////////
// //找出相同的牌数
////////////////////////////////////////////////////////////////////////////////
int ACardNum(int temp[] , int num , int comp)
{
	int n = 0 , i ; 
	for(i = 0 ; i < num ; i++)
		if(temp[i] == comp)
			n++ ; 
	return n ; 
}

////////////////////////////////////////////////////////////////////////////////
// 分析手中的牌
////////////////////////////////////////////////////////////////////////////////
void AnalyseCard(PLAYER player)
{
	int i,j;
	for(i=0;i<15;i++)
		for(j=0;j<2;j++)
			analyse[i][j] = 0;

	for(i=3;i<18;i++)
	{
		analyse[i-3][0] =ACardNum(player.card,20,i);
		if(analyse[i-3][0] != 0)
			analyse[i-3][1] =i;
	}
}
//将牌改为出了的状态
void ChangeStatic(PLAYER *player,int temp[])
{
	int i,j;
	for(i=0;i<CurrentOutCard.num ;i++)
	for(j=0;j<20;j++)
	{
		if(player->card [j] == temp[i] && player->statics[j] != 2)
		{
			player->statics[j] = 2;
			break;
		}
	}
}


////////////////////////////////////////////////////////////////////////////////
// 找连子(不包括从其他类型组中取单张)
////////////////////////////////////////////////////////////////////////////////
int searchLianZi()
{
    int temp[12]={0},j=0;//analyse2记录单牌组组号
    g_nLast=-1;
	g_nLen=1;
	for(int i=0;i<12;i++)
       if(analyse[i][0]>0) 
             temp[j++]=i;
  
    //找连子
    for(i=0;i<j-1;i++)
	{
         if(analyse[temp[i]+1][1]==analyse[temp[i]][1]+1)
		 {
             g_nLen++;
             if(g_nLen>=5) 
				 g_nLast=temp[i]+1;
			 continue;
         }
        if(g_nLen<5) 
		{
			g_nLen=1;
			g_nLast=-1;
		}
		else
			return 1;
    }//for
	if(g_nLen<5)
		return 0;
	return 1;
}
//出连子
void playLianZi(PLAYER *player)
{
	int start=g_nLast-g_nLen;//连子开始组号
	int a1[12]={0};
	for(int i=0;start<g_nLast + 1;start++,i++)
	{
		a1[i]=analyse[start][1];    
	}
	for(int j=0;j<i + 1;j++)//改牌的状态为出了的
		for(int k=0;k<20;k++)
		{
			if(player->card[k] == a1[j])
			{
				player->statics[k] = 2;
				break;
			}
		}
	CurrentOutCard.card = a1[i - 1] ;
	CurrentOutCard.num = i ;
	CurrentOutCard.min = a1[0] ;
	strcpy(CurrentOutCard.type ,"sz" );
}

//找单张,在顺子后找3--2
int searchDanZhang()
{
	g_nPosition=-1;
	for(int i=0;i<13;i++)
		if(analyse[i][0] == 1)
		{
			g_nPosition=i;
			break;    
		}
	if(g_nPosition!=-1) 
		return 1;
	else 
	    return 0;
}
//出单张
void playDanZhang(PLAYER *player)
{
	for(int k=0;k<20;k++)//改牌的状态为出了的
	{
		if(player->card[k] == analyse[g_nPosition][1])
		{
			player->statics[k] = 2;
			break;
		}
	}
	CurrentOutCard.card = analyse[g_nPosition][1] ;
	CurrentOutCard.num = 1 ;
	strcpy(CurrentOutCard.type ,"gz" );
} 
//找对子
int searchDuiZi()
{
	g_nPosition=-1;
	for(int i=0;i<12;i++)
		  if(analyse[i][0]==2)
		  {
			g_nPosition=i;
			break;    
		  }    
	if(g_nPosition!=-1) 
		return 1;
	else 
		return 0;        
}
//出对子
void playDuiZi(PLAYER *player)
{
	int n = 0;
	for(int k=0;k<20;k++)//改牌的状态为出了的
	{
		if(player->card[k] == analyse[g_nPosition][1])
		{
			player->statics[k] = 2;
			n++;
			if(n >= 2)break;
		}
	}
	CurrentOutCard.card = analyse[g_nPosition][1] ;
	CurrentOutCard.num = 2 ;
	strcpy(CurrentOutCard.type ,"dz" );
}
//找三张
int searchSanZhang()
{
	g_nPosition=-1;
	for(int i=0;i<12;i++)
		if(analyse[i][0]==3)
		{
			g_nPosition=i;
			break;    
		}    
	if(g_nPosition!=-1) 
		return 1;
	else 
		return 0;          
  
}
//出三带一
int playSanZhang(PLAYER *player)
{
	for(int i=0;i<15;i++)
	{
		if(analyse[i][0]==3)
		{
			int j=0;
			int bt=0;
			while(!bt)
			{
				Sleep(1);
				if(analyse[j][0] == 1 && j!=i)
				{
					int a1[4]= {0};
					a1[0]=analyse[i][1];
					a1[1]=analyse[i][1];
					a1[2]=analyse[i][1];
					a1[3]=analyse[j][1];
					bt=1;
					CurrentOutCard.card = a1[0] ;
					CurrentOutCard.num = 4 ;
					strcpy(CurrentOutCard.type ,"sd1" );
					ChangeStatic(player,a1); 
					return 1;
				}
				else 
				{
					j++;
					if(j>12) 
						return 0;
				}       
			}//while    
		}//if
	}//for
	return 0;
}
//找炸弹
int searchZhaDan()
{
	g_nPosition=-1;
	for(int i=0;i<13;i++)
		if(analyse[i][0]==4)
		{
			g_nPosition=i;
			break;    
		}    
	if(g_nPosition!=-1) 
		return 1;
	else 
		return 0;          
}
//出炸弹
void playZhaDan(PLAYER *player)
{
	int n = 0;
	for(int k=0;k<20;k++)//改牌的状态为出了的
	{
		if(player->card[k] == analyse[g_nPosition][1])
		{
			player->statics[k] = 2;
			n++;
			if(n >= 4)break;
		}
	}
	CurrentOutCard.card = analyse[g_nPosition][1] ;
	CurrentOutCard.num = 4 ;
	strcpy(CurrentOutCard.type ,"zd" );
}
//找单大王
int searchDanJoker()
{
	for(int i=0;i<15;i++)
	{
		if(analyse[i][1] == 17 && analyse[i-1][0] == 0)
		{
			g_nPosition = i;
			return 1;
		}
	}
	return 0;
}
//出单大王
void playDanJoker(PLAYER *player)
{
	for(int k=0;k<20;k++)//改牌的状态为出了的
	{
		if(player->card[k] == analyse[g_nPosition][1])
		{
			player->statics[k] = 2;
			break;
		}
	}
	CurrentOutCard.card = analyse[g_nPosition][1] ;
	CurrentOutCard.num = 1 ;
	strcpy(CurrentOutCard.type ,"gz" );
}
//找双王
int searchJoker()
{
	if(analyse[13][0] == 1 && analyse[14][0] == 1)
		return 1;
	else 
		return 0;
}
//出双王
void playJoker(PLAYER *player)
{
	for(int k=0;k<20;k++)//改牌的状态为出了的
	{
		if((player->card[k] == 16 || player->card[k] == 17) && player->statics[k] != 2)
		{
			player->statics[k] = 2;
		}
	}
	CurrentOutCard.num = 2 ;
	CurrentOutCard.card = 17 ;
	strcpy(CurrentOutCard.type ,"sw" );
}
//出单张
int playDanZhang2(PLAYER *player)
{
	for(int i = CurrentOutCard.card - 2;i < 14 ;i++)
	{
			if(analyse[i][0] == 1 || (analyse[i][0] > 1 && analyse[i][1] == 15)) //多个2可拆
			{
				int a1[1] = {0};
				a1[0]=analyse[i][1];
				ChangeStatic(player,a1);//出牌后对玩家手中的牌进行相应清理
				
				CurrentOutCard.card = a1[0] ;
				CurrentOutCard.num = 1 ;
				strcpy(CurrentOutCard.type ,"gz" );
				return 1;
			}
	}
	return 0;
}
//出对子
int playDuiZi2(PLAYER *player)
{
	for(int i=CurrentOutCard.card - 2;i<15;i++)
	{
		if(analyse[i][0]==2 || (analyse[i][0] > 2 && analyse[i][1] == 15))
		{
			int a1[2] = {0};
			a1[0]=analyse[i][1];
			a1[1]=analyse[i][1];
			ChangeStatic(player,a1); //出牌后对玩家手中的牌进行相应清理
			CurrentOutCard.card = a1[0] ;
			CurrentOutCard.num = 2 ;
			strcpy(CurrentOutCard.type ,"dz" );
			return 1;
		}
	}
	return 0;    
}
    
//三张
int playSanZhang2(PLAYER *player)
{
	for(int i=CurrentOutCard.card - 2;i<15;i++)
	{
        if(analyse[i][0]==3)
		{
            int a1[3] = {0};
			a1[0]=analyse[i][1];
			a1[1]=analyse[i][1];
			a1[2]=analyse[i][1];
            ChangeStatic(player,a1); 
			CurrentOutCard.card = a1[0] ;
			CurrentOutCard.num = 3 ;
			strcpy(CurrentOutCard.type ,"sgbd" );
			return 1;
        }
    }
	return 0;         
}
    
//三带一
int playSanDaiYi(PLAYER *player)
{
	for(int i=CurrentOutCard.card - 2;i<12;i++)
	{
		if(analyse[i][0]==3)
		{
			int j=0;
			int bt=0;
			while(!bt)
			{
				if(analyse[j][0] == 1 && j!=i)
				{
					int a1[4]= {0};
					a1[0]=analyse[i][1];
					a1[1]=analyse[i][1];
					a1[2]=analyse[i][1];
					a1[3]=analyse[j][1];
					bt=1;
					CurrentOutCard.card = a1[0] ;
					CurrentOutCard.num = 4 ;
					strcpy(CurrentOutCard.type ,"sd1" );
					ChangeStatic(player,a1); 
					return 1;
				}
				else 
				{
					j++;
					if(j>12) 
						return 0;
				}       
			}//while    
		}//if
	}//for
	return 0;     
}
    
//四带二只能带对子
int playSiDai2(PLAYER *player)
{
	for(int i=CurrentOutCard.card - 2;i<15;i++)
	{
		if(analyse[i][0]==4)
		{
			int j=0;
			int bt=0;
			while(!bt)
			{
				if(analyse[j][0]==2)
				{
					int a1[8]= {0};
					int ans=analyse[i][1];    
					for(int k=0;k<4;k++)
					a1[k]=ans++;    
					a1[4]=analyse[j][1];
					a1[5]=analyse[j][1]+1;
					ChangeStatic(player,a1); 
					bt=1;
					CurrentOutCard.card = a1[0] ;
					CurrentOutCard.num = 8 ;
					strcpy(CurrentOutCard.type ,"sd2g" );
					return 1;
				}
				else 
				{
					j++;
					if(j>12) {bt=1; return 0;} 
				}       
			} 
		}
	}    
	return 0;
}
    
//炸弹
int playZhaDan2(PLAYER *player)
{
	for(int i=CurrentOutCard.card - 2;i<15;i++)
	{
		if(analyse[i][0]==4)
		{
			int a1[4]= {0};
			int ans=analyse[i][1];    
			for(int k=0;k<4;k++)
				a1[k]=ans++;    
			ChangeStatic(player,a1); 
			CurrentOutCard.card = a1[0] ;
			CurrentOutCard.num = 4 ;
			strcpy(CurrentOutCard.type ,"zd" );
			return 1;
		}
	}
	return 0;
}
    
//    连子
int playLianZi2(PLAYER *player)
{
	int lens=1;
	int end=0;
	for(int i=CurrentOutCard.card - 2;i<12 && lens<CurrentOutCard.num;i++)
	{
		for(int j=0;j<CurrentOutCard.num;j++,i++)
			if(analyse[i][0]>0)
			{
				lens++;
				if(j==CurrentOutCard.num-1) 
					end=i;
			}
			else 
			{
				lens=1;
				break;
			}
	}//for
	//找到匹配的连子
	if(lens == CurrentOutCard.num)
	{
		int start=-1;
		start=end-CurrentOutCard.num+1;//连子开始组号
		int a1[12]= {0};
		for(int i=0;i<CurrentOutCard.num;i++)
			a1[i]=analyse[start++][1];
		ChangeStatic(player,a1);
		CurrentOutCard.card = a1[i] ;
		CurrentOutCard.min = a1[0] ;
		CurrentOutCard.num = i - 1 ;
		strcpy(CurrentOutCard.type ,"sz" );
		return 1;
	}
	//未找到匹配的连子
	else   
		return 0;         
}//playLianZi2()

//全出
void OutAll(PLAYER *player)
{
	for(int i=0;i<20;i++)
	{
		if(player->statics[i] != 2)
			player->statics[i] = 2;
	}
}
////////////////////////////////////////////////////////////////////////////////
//主动出牌
////////////////////////////////////////////////////////////////////////////////
int out1(PLAYER *player)
{
	//出三张
	if(searchSanZhang())
		{playSanZhang(player);return 1;}
	//出连子
	if(searchLianZi())
		{playLianZi(player);return 1;}
	//出对子
	if(searchDuiZi())
		{playDuiZi(player);return 1;}
	//出单张
	if(searchDanZhang())
		{playDanZhang(player);return 1;}
	 //出炸弹
	if(searchZhaDan())
		{playZhaDan(player);return 1;}
	//出双王
	if(searchJoker())
		{playJoker(player);return 1;}
	OutAll(player);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -