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

📄 ddz2.cpp

📁 EVC 下的斗地主源码,有AI机器人,运行环境是模拟器5
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// 选出玩家手中一张对应的牌显示到缓冲g_hMemDC
////////////////////////////////////////////////////////////////////////////////
void LoadCard(HWND hWnd , int n , int *x , int *y  , int A ,int B)
{
	switch (n)
	{
		case 2:
			{AddToMemDC(hWnd , IDB_CARDBACK , *x += A , *y += B,g_nCardWidth,g_nCardHeight) ; }
			break ; 
		case 3:
			{AddToMemDC(hWnd , IDB_3 , *x += A , *y += B,g_nCardWidth,g_nCardHeight) ; }
			break ; 
		case 4:
			{AddToMemDC(hWnd , IDB_4 , *x += A , *y += B,g_nCardWidth,g_nCardHeight) ; }
			break ; 
		case 5:
			{AddToMemDC(hWnd , IDB_5 , *x += A , *y += B,g_nCardWidth,g_nCardHeight) ; }
			break ; 
		case 6:
			{AddToMemDC(hWnd , IDB_6 , *x += A , *y += B,g_nCardWidth,g_nCardHeight) ; }
			break ; 
		case 7:
			{AddToMemDC(hWnd , IDB_7 , *x += A , *y += B,g_nCardWidth,g_nCardHeight) ; }
			break ; 
		case 8:
			{AddToMemDC(hWnd , IDB_8 , *x += A , *y += B,g_nCardWidth,g_nCardHeight) ; }
			break ; 
		case 9:
			{AddToMemDC(hWnd , IDB_9 , *x += A , *y += B,g_nCardWidth,g_nCardHeight) ; }
			break ; 
		case 10:
			{AddToMemDC(hWnd , IDB_10 , *x += A , *y += B,g_nCardWidth,g_nCardHeight) ; }
			break ; 
		case 11:
			{AddToMemDC(hWnd , IDB_J , *x += A , *y += B,g_nCardWidth,g_nCardHeight) ; }
			break ; 
		case 12:
			{AddToMemDC(hWnd , IDB_Q , *x += A , *y += B,g_nCardWidth,g_nCardHeight) ; }
			break ; 
		case 13:
			{AddToMemDC(hWnd , IDB_K , *x += A , *y += B,g_nCardWidth,g_nCardHeight) ; }
			break ; 
		case 14:
			{AddToMemDC(hWnd , IDB_A , *x += A , *y += B,g_nCardWidth,g_nCardHeight) ; }
			break ; 
		case 15:
			{AddToMemDC(hWnd , IDB_2 , *x += A , *y += B,g_nCardWidth,g_nCardHeight) ; }
			break ; 
		case 16:
			{AddToMemDC(hWnd , IDB_X , *x += A , *y += B,g_nCardWidth,g_nCardHeight) ; }
			break ; 
		case 17:
			{AddToMemDC(hWnd , IDB_D , *x += A , *y += B,g_nCardWidth,g_nCardHeight) ; }
			break ; 
	}
}
////////////////////////////////////////////////////////////////////////////////
// 计算出剩下的指定的状态的牌数
////////////////////////////////////////////////////////////////////////////////
int CardNum(PLAYER player , int n)
{
	int num = 0 ; 
	if(n == 0)
	{
		for(int i = 0 ; i < 20 ; i++)
		{
			if(player.statics[i] == 1 || player.statics[i] == 5)
				num++ ; 
		}
	}
	else
	{
		for(int i = 0 ; i < 20 ; i++)
		{
			if(player.statics[i] == n)
				num++ ; 
		}
	}
	return num ; 	
}

////////////////////////////////////////////////////////////////////////////////
// 初级化牌的状态
////////////////////////////////////////////////////////////////////////////////
void InitStatic()
{
	//初级化牌
	for(int i = 0 ; i < 17 ; i++)
	{
		player1.statics[i] = 5 ; 
		player2.statics[i] = 5 ; 
		player3.statics[i] = 5 ; 
		player4.card[i] = 0 ; 
	}
	//初级化变量
	g_nTurnOut = 0;//到谁出牌
	g_nLastWhoOut = 0;//上次是谁出的
	g_nWhoIsLord = 0;//谁是地主,1表左,2表我,3表右为地主
	g_nIfBegin = 1;//是不是刚开始,1 为是,
	g_nNotGetLord = 0;
	g_nOutFlag = 0;//右键改变其状态为1时出牌
	g_nPlayer1NotGet = 0; 
	g_nPlayer3NotGet = 0;
	g_nPlayer1NotOut = 0;
	g_nPlayer3NotOut = 0;
	g_nShowStart = 0;
	SendOutCard();
}


////////////////////////////////////////////////////////////////////////////////
// 计算出点在了哪张牌上
////////////////////////////////////////////////////////////////////////////////
void SelectCard(int x , int y)
{
	int xTemp = x-(WIDTH-ADD*(CardNum(player2 , 0)-1)-g_nCardWidth)/2 +20; 
	if(y<460 && y>340)
	{
		if((xTemp/ADD) < CardNum(player2 , 0))
		{
			if(player2.statics[xTemp/ADD-1] == 5)
			{
				player2.statics[xTemp/ADD-1] = 1 ; 
			}
			else
			{
				if(player2.statics[xTemp/ADD-1] == 1)
				{
					player2.statics[xTemp/ADD-1] = 5 ; 
				}
			}
		}
		else
		{
			if((xTemp/ADD) < CardNum(player2 , 0)+4)
			{
				if(player2.statics[CardNum(player2 , 0)-1] == 5)
				{
					player2.statics[CardNum(player2 , 0)-1] = 1 ; 
				}
				else
				{
					if(player2.statics[CardNum(player2 , 0)-1] == 1)
					{
						player2.statics[CardNum(player2 , 0)-1] = 5 ; 
					}
				}
			}
		}
	}
}

////////////////////////////////////////////////////////////////////////////////
// 显示手中的牌
////////////////////////////////////////////////////////////////////////////////
void ShowDesktop(HWND hWnd ,  PLAYER player)
{
	
	AddToMemDC(hWnd,IDB_BACK,0,0,g_nScreenX,g_nScreenY);//背景
	AddToMemDC(hWnd,IDB_BMP_QUIT,150,150,g_nScreenX,g_nScreenY);
	//::PatBlt(g_hMemDC ,  0 ,  0 ,  g_nScreenX ,  g_nScreenY ,  WHITENESS) ; 
	if(g_nCanNotOut == 1)//2出的不对
	{
		AddToMemDC(hWnd,IDB_NO,280,260,g_nScreenX,g_nScreenY);
	}
	if(g_nShowStart == 1)//开始
	{
		//AddToMemDC(hWnd,IDB_START,650,550,g_nScreenX,g_nScreenY);
		AddToMemDC(hWnd,IDB_START,650,250,g_nScreenX,g_nScreenY);

	}
	
	if(g_nShow3f == 1)//3分
	{
		AddToMemDC(hWnd,IDB_3F,340,200,g_nScreenX,g_nScreenY);
	}

	if(g_nShowNotGet == 1)//不叫
	{
		AddToMemDC(hWnd,IDB_BJ,410,200,g_nScreenX,g_nScreenY);
	}

	if(g_nTurnOut == 2)
	{
		AddToMemDC(hWnd,IDB_3F,300,200,g_nScreenX,g_nScreenY);//加载出牌图片==>需要替换
	}
	if(g_nShowNotOut == 1)//2不出
	{
		AddToMemDC(hWnd,IDB_NOTOUT,380,200,g_nScreenX,g_nScreenY);
		AddToMemDC(hWnd,IDB_3F,300,200,g_nScreenX,g_nScreenY);//加载出牌图片==>需要替换
	}

	if(g_nPlayer1NotGet == 1)//1不叫
	{
		AddToMemDC(hWnd,IDB_BJ2,200,300,g_nScreenX,g_nScreenY);
	}
	if(g_nPlayer3NotGet == 1)//3不叫
	{
		AddToMemDC(hWnd,IDB_BJ2,550,300,g_nScreenX,g_nScreenY);
	}
	if(g_nPlayer1NotOut == 1)//1不出
	{
		AddToMemDC(hWnd,IDB_BC,200,280,g_nScreenX,g_nScreenY);
	}
	if(g_nPlayer3NotOut == 1)//3不出
	{
		AddToMemDC(hWnd,IDB_BC,550,280,g_nScreenX,g_nScreenY);
	}
	switch(g_nWhoIsLord)//地主
	{
	case 1:	{AddToMemDC(hWnd,IDB_LORD,20,280,g_nScreenX,g_nScreenY);}break;
	case 2: {AddToMemDC(hWnd,IDB_LORD,375,552,g_nScreenX,g_nScreenY);}break;
	case 3: {AddToMemDC(hWnd,IDB_LORD,740,280,g_nScreenX,g_nScreenY);}break;
	}
	//显示player1
	CardX = 75 ; 
	g_nCardHeight = 96;
	CardY = (HEIGHT-ADD*(CardNum(player1 , 0)-1)-g_nCardHeight)/2 -10; 
	g_nCardX1 = 195 ; 
	g_nCardY1 = (HEIGHT-ADD*(CardNum(player1 , 2)-1)-g_nCardHeight)/2 - 30 ; 
	for(int i = 0 ; i < 20 ; i++)
	{
		switch (player1.statics[i])
		{
			case 5:
				LoadCard(hWnd , 2 , &CardX , &CardY , 0, ADD) ;
				break ; 
			case 2:
				LoadCard(hWnd , player1.card[i] , &g_nCardX1 , &g_nCardY1 , 0,ADD) ; 
				break ; 
		}
	}

	//显示player2
		CardX = (WIDTH-ADD*(CardNum(player2 , 0)-1)-g_nCardWidth)/2 -20; 
		CardY = 360 ; 
		g_nCardX1 = (WIDTH-ADD*(CardNum(player2 , 2)-1)-g_nCardWidth)/2 ; 
		g_nCardY1 = 250 ; 
		for(i = 0 ; i < 20 ; i++)
		{
			switch (player2.statics[i])
			{
				case 5:
					LoadCard(hWnd , player2.card[i] , &CardX , &CardY , ADD,0) ; 
					break ; 
				case 1:
					{
					CardY -= ADD ; 
					LoadCard(hWnd , player2.card[i] , &CardX , &CardY , ADD,0) ; 
					CardY += ADD ; 
					}
					break ; 
				case 2:
					LoadCard(hWnd , player2.card[i] , &g_nCardX1 , &g_nCardY1 , ADD,0) ; 
					break ; 
			}
		}

	//显示player3
		CardX = 655 ; 
		g_nCardHeight = 96;
		CardY = (HEIGHT-ADD*(CardNum(player3 , 0)-1)-g_nCardHeight)/2 -10; 
		g_nCardX1 = 530 ; 
		g_nCardY1 = (HEIGHT-ADD*(CardNum(player3 , 2)-1)-g_nCardHeight)/2 - 30; ; 
		for(i = 0 ; i < 20 ; i++)
		{
			switch (player3.statics[i])
			{
				case 5:
					LoadCard(hWnd , 2 , &CardX , &CardY , 0,ADD) ; 
					break ; 
				case 2:
					LoadCard(hWnd , player3.card[i] , &g_nCardX1 , &g_nCardY1 , 0,ADD) ; 
					break ; 
			}
		}

	//显示另三张
		CardX = 218 ; 
		CardY = 10 ; 
		int nTemp = 75;
		if(g_nShowStart != 1)
		{
			if(g_nWhoIsLord != 0)
			{
				for(i = 0 ; i < 3 ; i++)
				{
					LoadCard(hWnd , player4.card[i] , &CardX , &CardY , nTemp,0) ; 
				}
			}
			else
			{
				for(i = 0 ; i < 3 ; i++)
				{
					LoadCard(hWnd , 2 , &CardX , &CardY , nTemp,0) ; 
				}
			}
		}
}

////////////////////////////////////////////////////////////////////////////////
// 发牌 
////////////////////////////////////////////////////////////////////////////////
void SendOutCard()
{
    int a[54] ; 

    int i , randanalyse , analyse ; 
	for(i = 0 ; i < 13 ; i++) 
	{
		a[i] = i+3 ;  
		a[i+13] = i+3 ;  
		a[i+26] = i+3 ;  
	}
	for(i = 39 ; i < 54 ; i++) 
	{
		a[i] = i-36 ;  
	}
	srand((unsigned)GetTickCount()) ;  
	for(i = 0 ; i < 54 ; i++) 
	{
		randanalyse = rand() % 54 ;  
		analyse = a[i] ;  
		a[i] = a[randanalyse] ;  
		a[randanalyse] = analyse ;  
	} 

	for (i = 0 ; i < 17 ; i++)
	{
		player1.card[i] = a[i] ; 
		player2.card[i] = a[i+17] ; 
		player3.card[i] = a[i+34] ; 
	}
	for (i = 51 ; i < 54 ; i++)
	{
		player4.card[i-51] = a[i] ; 
	}
	sort(&player1) ; 
	sort(&player2) ; 
	sort(&player3) ; 
	sort(&player4) ; 
}
////////////////////////////////////////////////////////////////////////////////
// 排序 
////////////////////////////////////////////////////////////////////////////////
void sort(PLAYER *player)
{
	int temp , i , j ; 
	for (i = 0 ; i < 20 ; i++)
		for(j = 0 ; j < 20 ; j++)
		{
			if((player -> card[j] < player -> card[i]) && (player -> card[j] !=  0 || player -> card[i] !=  0))
			{
				temp = player -> card[j] ; 
				player -> card[j] = player -> card[i] ; 
				player -> card[i] = temp ; 
			}
		}
}

////////////////////////////////////////////////////////////////////////////////
// 删除打出的牌 
////////////////////////////////////////////////////////////////////////////////
void DelCard(PLAYER *player)
{
	for(int i = 0 ; i < 20 ; i++)
	{
		if(player -> statics [i]  ==  2)
		{
			for(int j = i ; j < 19 ; j++)
			{
				player -> card [j] = player -> card [j+1] ; 
				player -> statics [j] = player -> statics [j+1] ; 
			}
			player -> card [19] = 0 ; 
			player -> statics [19] = 0 ; 
		}
	}
}



////////////////////////////////////////////////////////////////////////////////
// 把要打出的牌顺序放入数组 
////////////////////////////////////////////////////////////////////////////////
void SaveOutCard(int *temp , PLAYER player)
{
	int i , j = 0 ; 
	for(i = 0 ; i < 20 ; i++)
		temp[i] = 0 ; 
	for(i = 0 ; i < 20 ; i++)
	{
		if(player.statics[i] == 2)
		{
			temp[j++] = player.card[i] ; 
		}
	}
}

////////////////////////////////////////////////////////////////////////////////
// 牌的类型
////////////////////////////////////////////////////////////////////////////////
//一对
int dz(int temp[])
{
	if(temp[0] == temp[1])
	{
		CurrentOutCard.card = temp[0];
		CurrentOutCard.num = 2;
		strcpy(CurrentOutCard.type,"dz");
		return 1; 
	}
	return 0 ; 
}
//双王
int sw(int temp[])
{
	if(temp[0]+temp[1] == 33)
	{
		CurrentOutCard.num =2;
		strcpy(CurrentOutCard.type,"sw");
		return 1; 
	}
	return 0 ; 
}
//三个不带
int sgbd(int temp[])
{
	if(temp[0] == temp[1] && temp[1] == temp[2])
	{
		CurrentOutCard.card = temp[0];
		CurrentOutCard.num =3;
		strcpy(CurrentOutCard.type,"sgbd");
		return 1; 
	}	
	return 0 ; 
}

//三带一
int sd1(int temp[])
{
	int analyse[2] , m = 0 , n = 0 , i , j , k , num = 5 ; 
	for(i = 0 ; i < num ; i++)
	for(j = i+1 ; j < num ; j++)
	for(k = j+1 ; k < num ; k++)
	{
		if(temp[i] == temp[j] && temp[j] == temp[k])
		{
			for(m = 0 ; m < num ; m++)
			{
				if(m !=  i  &&  m !=  j  &&  m !=  k)
					analyse[n++] = temp[m] ; 
			}
			if(analyse[0] != temp[i])
			{
				CurrentOutCard.card = temp[i];
				CurrentOutCard.num =3;
				strcpy(CurrentOutCard.type,"sd1");
				return 1 ; 
			}
			else 
				return 0 ; 
		}
	}
	return 0 ; 
}
//三带二
int sd2(int temp[])
{
	int analyse[2] , m = 0 , n = 0 , i , j , k , num = 5 ; 
	for(i = 0 ; i < num ; i++)
	for(j = i+1 ; j < num ; j++)
	for(k = j+1 ; k < num ; k++)
	{
		if(temp[i] == temp[j] && temp[j] == temp[k])
		{
			for(m = 0 ; m < num ; m++)
			{
				if(m !=  i  &&  m !=  j  &&  m !=  k)
					analyse[n++] = temp[m] ; 
			}
			if(analyse[0] == analyse[1])
			{
				CurrentOutCard.card = temp[i];
				CurrentOutCard.num =4;
				strcpy(CurrentOutCard.type,"sd2");
				return 1 ; 
			}
			else 
				return 0 ; 
		}
	}
	return 0 ; 
}
//炸
int zd(int temp[])
{
	if(temp[0] == temp[1] && temp[1] == temp[2] && temp[2] == temp[3])
	{
		CurrentOutCard.card = temp[0];
		CurrentOutCard.num =4;
		strcpy(CurrentOutCard.type,"zd");
		return 1 ; 
	}
	else
		return 0 ; 
}
//顺子
int sz(int temp[] , int n)
{
	int i ; 
	for(i = 0 ; i < n-1 ; i++)
	{
		if(temp[i] == 15 || temp[i+1] == 15) return 0 ; ////不能有2
		if(temp[i] !=  temp[i+1]+1)
			return 0 ; 
	}
	CurrentOutCard.card = temp[0];
	CurrentOutCard.min  = temp[n - 1];
	CurrentOutCard.num =n;
	strcpy(CurrentOutCard.type,"sz");
	return 1 ; 
}

//是不是二对 , 要求不一样
int ld(int temp[])
{
	int i , j , m , n = 0 , analyse[2] , num = 4 ; 
	for (i = 0 ; i < num ; i++)
	for (j = i+1 ; j < num ; j++)
	{
		if(temp[i] == temp[j])

⌨️ 快捷键说明

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