?? 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 + -