- 論壇徽章:
- 0
|
麻將游戲開發(fā)
- /***************************************************************
- * 文件名:hu.cpp *
- * *
- * 功 能:演示一個簡潔明了的遞歸函數(shù)——判斷[麻將]的和牌。 *
- * *
- * 說 明:1. 此函數(shù)不判斷七對和十三幺,讀者不難自行判斷; *
- * 同時由于麻將的規(guī)則各不相同,也請讀者自己添加和修改。*
- * *
- * 2. 其他與麻將類似的游戲,如[字牌](又稱跑胡子、 *
- * 二七十)等牌類游戲,也可采用類似的判斷函數(shù)。 *
- * *
- * 環(huán) 境: VC 6.0, 但符合ANSI C標準,隨便移植 ^_^ *
- * *
- * 作 者:shyworm(怕怕蟲) *
- * E_Mail: shyworm@sina.com *
- ***************************************************************/
- #include <stdio.h>;
- int Hu(int PAI[38]);
- int Remain(int PAI[38]);
- int main()
- {
- // 把一副牌放在下面的數(shù)組里,可以任意填入數(shù)字來測試函數(shù)正確與否。
- // 為了方便,PAI[0],PAI[10],PAI[20],PAI[30]都棄之不用,并且必須
- // 置為0,千萬注意!
- int PAI[38] = { 0,
- 1,1,1,0,1,1,1,0,0, // PAI[ 1- 9] 壹萬~玖萬的個數(shù)
- 0,
- 0,0,0,0,0,3,0,0,0, // PAI[11-19] 壹銅~玖銅的個數(shù)
- 0,
- 0,0,0,0,0,0,0,0,0, // PAI[21-29] 壹條~玖條的個數(shù)
- 0,
- 0,1,1,1,0,0,0 // PAI[31-37] 東南西北中發(fā)白的個數(shù)
- };
- // 請務必先排除“七對” 和“十三幺”,由于簡單,所以不提供了
- // if( QIDUI(PAI) )...
- // if( SHISANYAO(PAI) )...
- if( Hu(PAI) )
- printf("哈!我和啦!\n");
- else
- printf("哎,和不成!\n");
- return 1;
- }
- // 判斷和牌的遞歸函數(shù),不考慮“七對” 和“十三幺”。因為如果
- // 把“七對” 和“十三幺”的判斷放在遞歸函數(shù)里,將得不償失。
- int Hu(int PAI[38])
- {
- static int JIANG = 0; // 將牌標志,即牌型“三三三三二”中的“二”
- if( !Remain(PAI) ) return 1; // 遞歸退出條件:如果沒有剩牌,則和牌返回。
- for(int i=1;!PAI[i]&&i<38;i++); // 找到有牌的地方,i就是當前牌, PAI[i]是個數(shù)
- printf("i = %d\n",i); // 跟蹤信息
- // 4張組合(杠子)
- if ( PAI[i] == 4 ) // 如果當前牌數(shù)等于4張
- {
- PAI[i] = 0; // 除開全部4張牌
- if( Hu(PAI) ) return 1; // 如果剩余的牌組合成功,和牌
- PAI[i] = 4; // 否則,取消4張組合
- }
- // 3張組合(大對)
- if ( PAI[i] >;= 3 ) // 如果當前牌不少于3張
- {
- PAI[i] -= 3; // 減去3張牌
- if( Hu(PAI) ) return 1; // 如果剩余的牌組合成功,和牌
- PAI[i] += 3; // 取消3張組合
- }
- // 2張組合(將牌)
- if ( !JIANG && PAI[i] >;= 2 ) // 如果之前沒有將牌,且當前牌不少于2張
- {
- JIANG = 1; // 設置將牌標志
- PAI[i] -= 2; // 減去2張牌
- if( Hu(PAI) ) return 1; // 如果剩余的牌組合成功,和牌
- PAI[i] += 2; // 取消2張組合
- JIANG = 0; // 清除將牌標志
- }
- if ( i >; 30 ) return 0; // “東南西北中發(fā)白”沒有順牌組合,不和
- // 順牌組合,注意是從前往后組合!
- if( i%10 != 8 && i%10 != 9 && // 排除數(shù)值為8和9的牌
- PAI[i+1] && PAI[i+2] ) // 如果后面有連續(xù)兩張牌
- {
- PAI[i]--;
- PAI[i+1]--;
- PAI[i+2]--; // 各牌數(shù)減1
- if( Hu(PAI) ) return 1; // 如果剩余的牌組合成功,和牌
- PAI[i]++;
- PAI[i+1]++;
- PAI[i+2]++; // 恢復各牌數(shù)
- }
- // 無法全部組合,不和!
- return 0;
- }
- // 檢查剩余牌數(shù)
- int Remain(int PAI[38])
- {
- int sum = 0;
- for(int i=1;i<38;i++)
- sum += PAI[i];
- return sum;
- }
復制代碼 |
|