📄 ddz2.cpp
字号:
// 选出玩家手中一张对应的牌显示到缓冲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 + -