?? handbone.java
字號:
int index2 = m_aPengIndex[1];
m_aPengBone[m_nPeng] = bone;
m_aPengBone[m_nPeng+1] = m_aHandBone[index1];
m_aPengBone[m_nPeng+2] = m_aHandBone[index2];
m_nPeng += 3;
//將手中碰掉的拍去掉
int num = 0;
for( int n = 0; n < m_nHand; n ++ )
{
if( n == index1 || n == index2 )
continue;
m_aHandBone[num] = m_aHandBone[n];
num ++;
}
m_nHand = m_nHand - 3;
m_nSelectIndex = m_nHand;
m_HoldBone = m_aHandBone[m_nHand];
return true;
}
//顯示圖像,參數g對應手機屏幕
//參數bChi為true表示當前正在選擇吃牌的方法
//(如是三萬、四萬吃五萬,還是用四萬、六萬吃五萬)
//參數bSelect為true表示當前正在選擇要打出的牌
//參數scrWidth為屏幕的寬
//參數bHu為true表示胡了,需要把牌都翻轉過來
public void Paint(Graphics g, boolean bChi, boolean bSelect, boolean bHu, int scrWidth){
int x = m_nX;
int y = m_nY;
int arrDisX = 4;
int arrDisY = 13;
int w1 = 13;
int w2 = 3;
int h = 5;
if( !m_bPlayer )
{//玩家的牌是從左向右畫,電腦的牌則從右向左畫
w1 = -w1;
w2 = -w2;
h = -h;
arrDisX = - arrDisX;
arrDisY = - arrDisY;
}
//顯示杠牌
int num = 0;
while( num < m_nGang )
{//四張牌為一組,中間的牌羅起來
m_aGangBone[num].setRefPixelPosition(x, y);
m_aGangBone[num].setState(Bone.BASE_FALL_F);
m_aGangBone[num].Paint(g);
num ++;
x = x + w1;
m_aGangBone[num].setRefPixelPosition(x, y);
m_aGangBone[num].setState(Bone.BASE_FALL_F);
m_aGangBone[num].Paint(g);
num ++;
m_aGangBone[num].setRefPixelPosition(x, y - h);
m_aGangBone[num].setState(Bone.BASE_FALL_F);
m_aGangBone[num].Paint(g);
num ++;
x = x + w1;
m_aGangBone[num].setRefPixelPosition(x, y);
m_aGangBone[num].setState(Bone.BASE_FALL_F);
m_aGangBone[num].Paint(g);
num ++;
x = x + w1;
}
//顯示暗杠
num = 0;
while( num < m_nAnGang )
{//四張牌為一組,中間的牌羅起來
m_aAnGangBone[num].setRefPixelPosition(x, y);
m_aAnGangBone[num].setState(Bone.BASE_FALL_B);
m_aAnGangBone[num].Paint(g);
num ++;
x = x + w1;
m_aAnGangBone[num].setRefPixelPosition(x, y);
m_aAnGangBone[num].setState(Bone.BASE_FALL_B);
m_aAnGangBone[num].Paint(g);
num ++;
m_aAnGangBone[num].setRefPixelPosition(x, y - h);
if( m_bPlayer || bHu )
m_aAnGangBone[num].setState(Bone.BASE_FALL_F);
else
m_aAnGangBone[num].setState(Bone.BASE_FALL_B);
m_aAnGangBone[num].Paint(g);
num ++;
x = x + w1;
m_aAnGangBone[num].setRefPixelPosition(x, y);
m_aAnGangBone[num].setState(Bone.BASE_FALL_B);
m_aAnGangBone[num].Paint(g);
num ++;
x = x + w1;
}
//顯示吃牌
num = 0;
while( num < m_nChi )
{//三張牌為一組
m_aChiBone[num].setRefPixelPosition(x, y);
m_aChiBone[num].setState(Bone.BASE_FALL_F);
m_aChiBone[num].Paint(g);
num ++;
x = x + w1;
m_aChiBone[num].setRefPixelPosition(x, y);
m_aChiBone[num].setState(Bone.BASE_FALL_F);
m_aChiBone[num].Paint(g);
num ++;
x = x + w1;
m_aChiBone[num].setRefPixelPosition(x, y);
m_aChiBone[num].setState(Bone.BASE_FALL_F);
m_aChiBone[num].Paint(g);
num ++;
x = x + w1;
}
//顯示碰牌
num = 0;
while( num < m_nPeng )
{//三張牌為一組
m_aPengBone[num].setRefPixelPosition(x, y);
m_aPengBone[num].setState(Bone.BASE_FALL_F);
m_aPengBone[num].Paint(g);
num ++;
x = x + w1;
m_aPengBone[num].setRefPixelPosition(x, y);
m_aPengBone[num].setState(Bone.BASE_FALL_F);
m_aPengBone[num].Paint(g);
num ++;
x = x + w1;
m_aPengBone[num].setRefPixelPosition(x, y);
m_aPengBone[num].setState(Bone.BASE_FALL_F);
m_aPengBone[num].Paint(g);
num ++;
x = x + w1;
}
//顯示手中的牌
x = x + w2; //手中的牌與前面的牌稍微錯開點距離
//當前選擇的手中吃牌的索引
int chi1 = m_aChiIndex[m_nChiIndex];
int chi2 = m_aChiIndex[m_nChiIndex+1];
for( int n = 0; n < m_nHand; n ++ ){
m_aHandBone[n].setRefPixelPosition(x, y);
if( bHu ) //胡了,都翻轉過來
m_aHandBone[n].setState(Bone.BASE_FALL_F);
else if( m_bPlayer ) //玩家的牌正面朝屏幕
m_aHandBone[n].setState(Bone.BASE_FRONT);
else //電腦的背正面朝屏幕
m_aHandBone[n].setState(Bone.BASE_BACK);
m_aHandBone[n].Paint(g);
if( bChi )
{//正在選擇吃牌方法
if( n == chi1 || n == chi2 )
{
g.drawImage(m_ArrowImg, x-arrDisX, y-arrDisY, 0);
}
}
if( bSelect && m_nSelectIndex == n )
{//正在選擇所出的牌
g.drawImage(m_ArrowImg, x-arrDisX, y-arrDisY, 0);
}
x = x + w1;
}
//顯示摸到的牌
if( m_HoldBone != null ){
if( m_bPlayer ){
x = scrWidth - 7;
y = m_nY - 23;
}
else{
x = 7;
y = m_nY + 18;
}
m_HoldBone.setRefPixelPosition(x, y);
if( bHu ) //胡了,都翻轉過來
m_HoldBone.setState(Bone.BASE_FALL_F);
else if( m_bPlayer )
m_HoldBone.setState(Bone.BASE_FRONT);
else
m_HoldBone.setState(Bone.BASE_BACK);
m_HoldBone.Paint(g);
if( bSelect && m_nSelectIndex == m_nHand )
{//正在選擇所出的牌
g.drawImage(m_ArrowImg, x-arrDisX, y-arrDisY, 0);
}
}
}
//電腦出牌
public Bone ComOutBone(){
//將指定的牌與手中的牌組成新的數組
Bone atemp[] = new Bone[m_nHand + 1];
for( int n = 0; n < m_nHand; n++ ){
atemp[n] = m_aHandBone[n];
}
atemp[m_nHand] = m_HoldBone;
//Divide中會不斷地拆分atemp中的牌,如果能拆出胡牌的結構則返回null
Bone bone = Divide( atemp, false );
for( int n = 0; n <= m_nHand; n ++ ){
if( atemp[n] == bone ){
if( n == m_nHand )
m_HoldBone = null;
else{
m_aHandBone[n] = m_HoldBone;
m_HoldBone = null;
}
}
}
return bone;
}
//按麻將規則拆分存儲牌的數組
//返回無法組合的牌,如果組成胡牌的結構則返回null
//參數bDouble為true表示已拆除的牌中存在將牌
public Bone Divide( Bone abone[], boolean bDouble )
{
/*
if( abone.length == 3 && bDouble == false )
{//剩下三張牌了,還沒有“將”,則肯定不能胡
return abone[0];
}
if( abone.length == 2 && bDouble == true )
{//剩兩張牌,但是已經有“將”了,則也肯定不能胡
return abone[0];
}
if( abone.length == 1 )
{//拆得剩1張牌了,肯定也不能胡了
return abone[0];
}
if( abone.length == 0 )
{//理論上不會有這種情況
System.out.print("Dividie...Line16");
return null;
}*/
int word = abone[0].getWord();
int value = abone[0].getValue();
int aShun[] = new int[5]; //與第一張牌能組成順子的牌
int aSame[] = new int[3]; //與第一張牌能組成“碰”的牌
int nSameNum = 0;
for( int n = 0; n < aShun.length; n ++ )
{
aShun[n] = -1;
if( n < 3 )
aSame[n] = -1;
}
//找出與第一張牌能組成“碰”的牌及組成順子的牌
for( int n = 1; n < abone.length; n ++ )
{
if( abone[n].getWord() == word )
{
if( abone[n].getValue() == value )
{//如果牌的值相同
aSame[nSameNum] = n;
nSameNum ++;
}
else if( word != Bone.WORD_ZI )
{//如果能組成順子
int index = abone[n].getValue() - value;
if( index >= -2 && index <= 2 )
{
aShun[index+2] = n;
}
}
}
}
Bone retBone = abone[0];
if( nSameNum >= 2 )
{//拆除abone中與第一張組成“碰”的牌
if( abone.length == 3 )
{//剛好剩三張一樣的牌
aShun = null;
aSame = null;
return null;
}
Bone atemp[] = new Bone[abone.length - 3];
int num = 0;
for( int n = 1; n < abone.length; n ++ )
{
if( n != aSame[0] && n != aSame[1] )
{
atemp[num] = abone[n];
num ++;
}
}
//繼續拆分剩余的牌
Bone bone = Divide(atemp, bDouble);
if( bone == null ) //能胡牌,直接返回
{
atemp = null;
aShun = null;
aSame = null;
return null;
}
retBone = bone;
}
if( aShun[0] != -1 && aShun[1] != -1 )
{//拆除abone中與第一張組成第一種順子的牌,如第一張為五萬,其他兩張為三萬和四萬
if( abone.length == 3 )
{//剛好剩三張順的牌
aShun = null;
aSame = null;
return null;
}
Bone atemp[] = new Bone[abone.length - 3];
int num = 0;
for( int n = 1; n < abone.length; n ++ )
{
if( n != aShun[0] && n != aShun[1] )
{
atemp[num] = abone[n];
num ++;
}
}
//繼續拆分剩余的牌
Bone bone = Divide(atemp, bDouble);
if( bone == null ) //能胡牌,直接返回
{
atemp = null;
aShun = null;
aSame = null;
return null;
}
retBone = bone;
}
if( aShun[1] != -1 && aShun[3] != -1 )
{//拆除abone中與第一張組成第二種順子的牌,如第一張為五萬,其他兩張為四萬和六萬
if( abone.length == 3 )
{//剛好剩三張順的牌
aShun = null;
aSame = null;
return null;
}
Bone atemp[] = new Bone[abone.length - 3];
int num = 0;
for( int n = 1; n < abone.length; n ++ )
{
if( n != aShun[1] && n != aShun[3] )
{
atemp[num] = abone[n];
num ++;
}
}
//繼續拆分剩余的牌
Bone bone = Divide(atemp, bDouble);
if( bone == null ) //能胡牌,直接返回
{
atemp = null;
aShun = null;
aSame = null;
return null;
}
retBone = bone;
}
if( aShun[3] != -1 && aShun[4] != -1 )
{//拆除abone中與第一張組成第三種順子的牌,如第一張為五萬,其他兩張為六萬和七萬
if( abone.length == 3 )
{//剛好剩三張順的牌
aShun = null;
aSame = null;
return null;
}
Bone atemp[] = new Bone[abone.length - 3];
int num = 0;
for( int n = 1; n < abone.length; n ++ )
{
if( n != aShun[3] && n != aShun[4] )
{
atemp[num] = abone[n];
num ++;
}
}
//繼續拆分剩余的牌
Bone bone = Divide(atemp, bDouble);
if( bone == null ) //能胡牌,直接返回
{
atemp = null;
aShun = null;
aSame = null;
return null;
}
retBone = bone;
}
if( nSameNum >= 1 && bDouble == false )
{//拆除abone中與第一張組成“將”的牌
if( abone.length == 2 )
{//剛好剩兩張一樣的牌
aShun = null;
aSame = null;
return null;
}
Bone atemp[] = new Bone[abone.length - 2];
int num = 0;
for( int n = 1; n < abone.length; n ++ )
{
if( n != aSame[0] )
{
atemp[num] = abone[n];
num ++;
}
}
Bone bone = Divide(atemp, true);
if( bone == null ) //能胡牌,直接返回
{
atemp = null;
aShun = null;
aSame = null;
return null;
}
retBone = bone;
}
aShun = null;
aSame = null;
//返回不能組合的牌
return retBone;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -