📄 playing_cards.cpp
字号:
{
return 0;
}
}//
else if(m_nDiscardingCardsTable[i] == 2)
{
counter++;
}//
else if(m_nDiscardingCardsTable[i] != 0)
{
return 0;
}//
}
return 0;
}
//判断是否是三顺带四单;
int CPlayingCards::Is33331111()
{
int m_nTypeValue = 0;
int counter = 0;
for(int i=3;i<17;i++)
{
if(m_nDiscardingCardsTable[i] == 3 && i < 12) //遇到第一个三张且不等于A;
{
m_nTypeValue = i;
if((m_nDiscardingCardsTable[i+1] != 3) ||
(m_nDiscardingCardsTable[i+2] != 3) ||
(m_nDiscardingCardsTable[i+3] != 3))
{
return 0; //如果下表项不为三张,返回0;
}
else
{
for(int j=i+4; j<17; j++)
{
if(m_nDiscardingCardsTable[j] == 1)
{
counter++;
}
else if(m_nDiscardingCardsTable[j] != 0)
{
return 0; //再出现其它表项,则返回0;
}
}//end for(int j=i+1;j<17;j++)
}
//如果单牌数为2,则匹配成功!
if(counter == 4)
{
return m_nTypeValue;
}
else
{
return 0;
}
}//
else if(m_nDiscardingCardsTable[i] == 1)
{
counter++;
}//
else if(m_nDiscardingCardsTable[i] != 0)
{
return 0;
}//
}
return 0;
}
/*
* 函数介绍:检查出牌的逻辑合法性;
* 输入参数:无;
* 输出参数:??
* 返回值 : 匹配成功返回1,不成功返回0;
*/
int CPlayingCards::CheckChoosing()
{
int i;
for(i=0; i<17; i++) //初始化扫描表;
{
m_nDiscardingCardsTable[i] = 0;
}
//扫描进表中;
for(i=0; i<m_nChoosingCardsCounter; i++)
{
m_nDiscardingCardsTable[m_cChoosingCards[i].m_nValue]++;
}
int Table_Index;
switch(m_nChoosingCardsCounter)
{
case 1:
m_cDiscardingType.m_nTypeNum = 1;
m_cDiscardingType.m_nTypeValue = m_cChoosingCards[0].m_nValue;
return 1;
case 2://是否是一对牌;
if( (Table_Index = Is2()) != 0 )
{
//是大王,则为炸弹;
if(Table_Index == 16)
{
m_cDiscardingType.m_nTypeNum = 4; //类型为4表示炸弹;
}
else
{
m_cDiscardingType.m_nTypeNum = 2;
}
m_cDiscardingType.m_nTypeValue = Table_Index;
return 1;
}
return 0;
case 3:
if( (Table_Index = Is3()) != 0 )
{
m_cDiscardingType.m_nTypeNum = 3;
m_cDiscardingType.m_nTypeValue = Table_Index;
return 1;
}
return 0;
case 4:
if( (Table_Index = IsBomb()) != 0 )
{
m_cDiscardingType.m_nTypeNum = 4;
m_cDiscardingType.m_nTypeValue = Table_Index;
return 1;
}
else if( (Table_Index = Is31()) != 0 )
{
m_cDiscardingType.m_nTypeNum = 31;
m_cDiscardingType.m_nTypeValue = Table_Index;
return 1;
}
return 0;
case 5:
if( (Table_Index = IsSeries()) != 0 )
{
m_cDiscardingType.m_nTypeNum = 5;
m_cDiscardingType.m_nTypeValue = Table_Index;
return 1;
}
else if( (Table_Index = Is32()) != 0 )
{
m_cDiscardingType.m_nTypeNum = 32;
m_cDiscardingType.m_nTypeValue = Table_Index;
return 1;
}
return 0;
case 6:
//单顺: 6 最小牌的Card.m_nValue(面值) 6
//双顺: 222 最小牌的Card.m_nValue(面值) 6
//三顺: 33 最小牌的Card.m_nValue(面值) 6
//四带二单: 411 四张的Card.m_nValue(面值) 6
if( (Table_Index = IsSeries()) != 0 )
{
m_cDiscardingType.m_nTypeNum = 6;
m_cDiscardingType.m_nTypeValue = Table_Index;
return 1;
}
else if( (Table_Index = IsDoubleSeries()) != 0 )
{
m_cDiscardingType.m_nTypeNum = 222;
m_cDiscardingType.m_nTypeValue = Table_Index;
return 1;
}
else if( (Table_Index = IsThreeSeries()) != 0 )
{
m_cDiscardingType.m_nTypeNum = 33;
m_cDiscardingType.m_nTypeValue = Table_Index;
return 1;
}
else if( (Table_Index = Is411()) != 0 )
{
m_cDiscardingType.m_nTypeNum = 411;
m_cDiscardingType.m_nTypeValue = Table_Index;
return 1;
}
return 0;
case 7:
//单顺
if( (Table_Index = IsSeries()) != 0 )
{
m_cDiscardingType.m_nTypeNum = 7;
m_cDiscardingType.m_nTypeValue = Table_Index;
return 1;
}
return 0;
case 8:
//单顺: 8 最小牌的Card.m_nValue(面值) 8
//双顺 2222 最小牌的Card.m_nValue(面值) 8
//三顺带二单: 3311 最小三张的Card.m_nValue(面值) 8
//四带二对: 422 四张的Card.m_nValue(面值) 8
if( (Table_Index = IsSeries()) != 0 )
{
m_cDiscardingType.m_nTypeNum = 8;
m_cDiscardingType.m_nTypeValue = Table_Index;
return 1;
}
else if( (Table_Index = IsDoubleSeries()) != 0 )
{
m_cDiscardingType.m_nTypeNum = 2222;
m_cDiscardingType.m_nTypeValue = Table_Index;
return 1;
}
else if( (Table_Index = Is3311()) != 0 )
{
m_cDiscardingType.m_nTypeNum = 3311;
m_cDiscardingType.m_nTypeValue = Table_Index;
return 1;
}
else if( (Table_Index = Is422()) != 0 )
{
m_cDiscardingType.m_nTypeNum = 422;
m_cDiscardingType.m_nTypeValue = Table_Index;
return 1;
}
return 0;
case 9:
//单顺: 9 最小牌的Card.m_nValue(面值) 9
//三顺: 333 最小三张的Card.m_nValue(面值) 9
if( (Table_Index = IsSeries()) != 0 )
{
m_cDiscardingType.m_nTypeNum = 9;
m_cDiscardingType.m_nTypeValue = Table_Index;
return 1;
}
else if( (Table_Index = IsThreeSeries()) != 0 )
{
m_cDiscardingType.m_nTypeNum = 333;
m_cDiscardingType.m_nTypeValue = Table_Index;
return 1;
}
return 0;
case 10:
//单顺: 10 最小牌的Card.m_nValue(面值) 10
//双顺: 22222 最小牌的Card.m_nValue(面值) 10
//三顺带二对: 3322 最小三张的Card.m_nValue(面值) 10
if( (Table_Index = IsSeries()) != 0 )
{
m_cDiscardingType.m_nTypeNum = 10;
m_cDiscardingType.m_nTypeValue = Table_Index;
return 1;
}
else if( (Table_Index = IsDoubleSeries()) != 0 )
{
m_cDiscardingType.m_nTypeNum = 22222;
m_cDiscardingType.m_nTypeValue = Table_Index;
return 1;
}
else if( (Table_Index = Is3322()) != 0 )
{
m_cDiscardingType.m_nTypeNum = 3322;
m_cDiscardingType.m_nTypeValue = Table_Index;
return 1;
}
return 0;
case 11:
//单顺: 11 最小牌的Card.m_nValue(面值) 11
if( (Table_Index = IsSeries()) != 0 )
{
m_cDiscardingType.m_nTypeNum = 11;
m_cDiscardingType.m_nTypeValue = Table_Index;
return 1;
}
return 0;
case 12:
//单顺: 12 最小牌的Card.m_nValue(面值) 12
//双顺: 222222 最小对牌的Card.m_nValue(面值) 12
//三顺: 3333 最小三张的Card.m_nValue(面值) 12
//三顺带三: 333111 最小三张的Card.m_nValue(面值) 12
if( (Table_Index = IsSeries()) != 0 )
{
m_cDiscardingType.m_nTypeNum = 12;
m_cDiscardingType.m_nTypeValue = Table_Index;
return 1;
}
else if( (Table_Index = IsDoubleSeries()) != 0 )
{
m_cDiscardingType.m_nTypeNum = 222222;
m_cDiscardingType.m_nTypeValue = Table_Index;
return 1;
}
else if( (Table_Index = IsThreeSeries()) != 0 )
{
m_cDiscardingType.m_nTypeNum = 3333;
m_cDiscardingType.m_nTypeValue = Table_Index;
return 1;
}
else if( (Table_Index = Is333111()) != 0 )
{
m_cDiscardingType.m_nTypeNum = 333111;
m_cDiscardingType.m_nTypeValue = Table_Index;
return 1;
}
return 0;
case 13:
return 0;
case 14:
//双顺 2222222 最小对牌的Card.m_nValue(面值) 14
if( (Table_Index = IsDoubleSeries()) != 0 )
{
m_cDiscardingType.m_nTypeNum = 2222222;
m_cDiscardingType.m_nTypeValue = Table_Index;
return 1;
}
return 0;
case 15:
//三顺带三对: 333222 最小三张的Card.m_nValue(面值) 15
//三顺: 33333 最小三张的Card.m_nValue(面值) 15
if( (Table_Index = IsThreeSeries()) != 0 )
{
m_cDiscardingType.m_nTypeNum = 33333;
m_cDiscardingType.m_nTypeValue = Table_Index;
return 1;
}
else if( (Table_Index = Is333222()) != 0 )
{
m_cDiscardingType.m_nTypeNum = 333222;
m_cDiscardingType.m_nTypeValue = Table_Index;
return 1;
}
return 0;
case 16:
//双顺 22222222 最小对牌的Card.m_nValue(面值) 16
//三顺带四单: 33331111 最小三张的Card.m_nValue(面值) 16
if( (Table_Index = IsDoubleSeries()) != 0 )
{
m_cDiscardingType.m_nTypeNum = 22222222;
m_cDiscardingType.m_nTypeValue = Table_Index;
return 1;
}
else if( (Table_Index = Is33331111()) != 0 )
{
m_cDiscardingType.m_nTypeNum = 33331111;
m_cDiscardingType.m_nTypeValue = Table_Index;
return 1;
}
return 0;
case 17:
return 0;
case 18:
//双顺 222222222 最小对牌的Card.m_nValue(面值) 18
//三顺 333333 最小三张的Card.m_nValue(面值) 18
if( (Table_Index = IsDoubleSeries()) != 0 )
{
m_cDiscardingType.m_nTypeNum = 222222222;
m_cDiscardingType.m_nTypeValue = Table_Index;
return 1;
}
else if( (Table_Index = IsThreeSeries()) != 0 )
{
m_cDiscardingType.m_nTypeNum = 333333;
m_cDiscardingType.m_nTypeValue = Table_Index;
return 1;
}
return 0;
case 19:
return 0;
case 20:
return 0;
//暂时保留;几乎不可能的牌;
//双顺 2222222222 最小对牌的Card.m_nValue(面值) 20
//三顺带五单: 3333311111 最小三张的Card.m_nValue(面值) 20
//三顺带四对: 33332222 最小三张的Card.m_nValue(面值) 20
}
return -1;
}
//直接选择出牌;
int CPlayingCards::DirectChoose()
{
int i;
int counter_0 = 0;
int counter_1 = 0;
int value_1 = 17;
int counter_2 = 0;
int value_2 = 17;
int counter_3 = 0;
int value_3 = 17;
int counter_4 = 0;
int value_4 = 17;
CCardsType temp;
temp.m_nTypeValue = 2;
//扫描未出牌表;
for(i=15;i>=3;i--)
{
switch(m_nCardsTable[i])
{
case 0:
counter_0++;
break;
case 1:
counter_1++;
value_1 = i;
break;
case 2:
counter_2++;
value_2 = i;
break;
case 3:
counter_3++;
value_3 = i;
break;
case 4:
counter_4++;
value_4 = i;
break;
}
}
if( counter_3 >= 2 && counter_1 >= counter_2 )
{
//寻找3311;找到返回;
//如果没找到,则 if(counter_1 <= 5)寻找31;返回
if( Search3311(temp) )
{
return 1;
}
}
else if( counter_3 >= 2 && counter_2 > counter_1 )
{
//寻找3322;找到返回;
//如果没找到,则 if(counter_2 <= 5)寻找32;返回
if( Search3322(temp) )
{
return 1;
}
}
if( counter_1 >= 3 )
{
//寻找单顺;从12张到5张的情况;
if( SearchBeyond10(temp,12) )
return 1;
if( SearchBeyond10(temp,11) )
return 1;
if( SearchBeyond10(temp,10) )
return 1;
if( Search9(temp) )
return 1;
if( Search8(temp) )
return 1;
if( Search7(temp) )
return 1;
if( Search6(temp) )
return 1;
if( Search5(temp) )
return 1;
}
if( counter_2 >= 3 )
{
//寻找双顺;从5到3;
if( Search2222(temp) )
return 1;
if( Search222(temp) )
return 1;
}
if( counter_4 >= 0 && counter_1 >= 2 && counter_2 >= 2 )
{
//寻找411;
if( value_1 < value_2 )
{
if( Search411(temp) )
return 1;
}
else
{
if( Search422(temp) )
return 1;
}
}
else if( counter_4 >= 0 && counter_1 >= 2 )
{
if( Search411(temp) )
return 1;
}
else if( counter_4 >= 0 && counter_2 >= 2 )
{
if( Search422(temp) )
return 1;
}
if( counter_3 > 0 && value_1 < value_2 && counter_1 > 0 )
{
//寻找31;
if( Search31(temp) )
return 1;
}
else if( counter_3 > 0 && value_2 < value_1 && counter_2 > 0 )
{
//寻找31;
if( Search32(temp) )
return 1;
}
if( value_1 < value_2 )
{
//寻找1;
if( Search1(temp) )
return 1;
}
else
{
//寻找2;
if( Search2(temp) )
return 1;
}
for(i=3;i<=16;i++)
{
if( m_nCardsTable[i] == 0 )
continue;
else
{
m_cDiscardingType.m_nTypeNum = 4;
m_cDiscardingType.m_nTypeNum = m_nCardsTable[i];
m_cDiscardingType.m_nTypeValue = i;
for(int j=0;j<m_nCardsTable[i];j++)
{
m_nDiscardingCounter++;
m_cDiscarding[j] = m_cCards[j];
m_cCards[j] = m_cBLANK_CARD;
}//end for~
m_nCardsTable[i] = 0;
break;
}
}//end if
// CleanUp();
return 1;
}
//工人智能补丁1;
BOOL CPlayingCards::AI_Patch1()
{
//双王
if( (m_nCardsTable[16] == 2) && (m_nCardsCounter == 2) )
{
m_cDiscardingType.m_nTypeNum = 4;
m_cDiscardingType.m_nTypeValue = 16;
m_nDiscardingCounter = 2;
m_cDiscarding[0] = m_cCards[0];
m_cDiscarding[1] = m_cCards[1];
m_cCards[0] = m_cBLANK_CARD;
m_cCards[1] = m_cBLANK_CARD;
m_nCardsTable[16] = 0;
return 1;
}
int i;
int counter_1 = 0;
int value_1 = 17;
int counter_2 = 0;
int value_2 = 17;
int counter_3 = 0;
int value_3 = 17;
int counter_4 = 0;
int value_4 = 17;
CCardsType temp;
temp.m_nTypeValue = 2;
//扫描未出牌表;
for(i=15;i>=3;i--)
{
switch(m_nCardsTable[i])
{
case 1:
counter_1++;
value_1 = i;
break;
case 2:
counter_2++;
value_2 = i;
break;
case 3:
counter_3++;
value_3 = i;
break;
case 4:
counter_4++;
value_4 = i;
break;
}
}
//双王加单张;
if( (m_nCardsTable[16] == 2) && (m_nCardsCounter == 3) )
{
m_cDiscardingType.m_nTypeNum = 4;
m_cDiscardingType.m_nTypeValue = 16;
m_nDiscardingCounter = 2;
m_cDiscarding[0] = m_cCards[1];
m_cDiscarding[1] = m_cCards[2];
m_cCards[1] = m_cBLANK_CARD;
m_cCards[2] = m_cBLANK_CARD;
m_nCardsTable[16] = 0;
return 1;
}
//双王加一对;
if( (m_nCardsTable[16] == 2) && ((m_nCardsCounter == 4) && (counter_2 == 1)) )
{
m_cDiscardingType.m_nTypeNum = 4;
m_cDiscardingType.m_nTypeValue = 16;
m_nDiscardingCounter = 2;
m_cDiscarding[0] = m_cCards[2];
m_cDiscarding[1] = m_cCards[3];
m_cCards[2] = m_cBLANK_CARD;
m_cCards[3] = m_cBLANK_CARD;
m_nCardsTable[16] = 0;
return 1;
}
//双王加三张;
if( (m_nCardsTable[16] == 2) && ((m_nCardsCounter == 5) && (counter_3 == 1)) )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -