亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 7587 | 回復: 5
打印 上一主題 下一主題

麻將游戲開發(fā) [復制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2005-09-09 14:00 |只看該作者 |倒序瀏覽
麻將游戲開發(fā)
最近要學習軟件工程,學習之余就去網(wǎng)絡上玩麻將,呵呵~~~

突發(fā)奇想要自己開發(fā)一個,邊練手,邊娛樂,何樂而不為呢

麻將游戲要用到很多模塊,慢慢補來

也望各位大大多留下意見,先謝過


麻將網(wǎng)絡游戲項目

  項目分為服務器端和客戶端兩大模塊
  服務器端功能:提供游戲玩家注冊、登錄、積分、聊天服務
                為游戲提供桌號、洗牌、算番
  客戶端:游戲界面,判斷是否吃、碰、杠、聽牌及胡牌

數(shù)據(jù)結(jié)構(gòu):麻將的數(shù)字表示
用數(shù)字0~35表示麻將牌,其中0~8代表一萬到九萬,9~17代表一條到九條,18~26代表一筒到九筒,27代表東風,28代表南風,29代表西風,30代表北風,31代表中,32代表發(fā),33代表白,34代表春夏秋冬,35代表梅竹蘭菊

見下表

============================================
0    1     2   3    4    5    6    7    8
============================================
一萬 二萬 三萬 四萬 五萬 六萬 七萬 八萬 九萬
============================================
9    10   11   12   13   14   15   16   17
============================================
一條 二條 三條 四條 五條 六條 七條 八條 九條
============================================
18    19   20   21   22   23   24   25   26
============================================
一筒 二筒 三筒 四筒 五筒 六筒 七筒 八筒 九筒
============================================
27    28   29   30   31   32   33   34   35
============================================
東風 南風 西風 北風 紅中 發(fā)財 白板  花1  花2
============================================

每個數(shù)字出現(xiàn)四次,代表四張牌,洗牌時采用隨機算法提供牌墻

牌墻數(shù)據(jù)結(jié)構(gòu):

  圈風:
     quanfeng:(27,28,29,30)
  數(shù)組paiqiang[0..143],其中
paiqiang[0]~paiqiang[35]為東(莊)家
paiqiang[36]~paiqiang[71]為南家
paiqiang[72]~paiqiang[107]為西家
paiqiang[108]~paiqiang[143]為北家

玩家數(shù)據(jù)結(jié)構(gòu):
玩家wanjia:{
     門風:
        menfeng:(27,28,29,30)
     杠:
        gangpai{
        pai:0~33
        mingAn:0|1
              }
       gangarr[0..3]:gangpai(最多四個杠,數(shù)字表示杠的牌,結(jié)構(gòu)體第二位的0表示明杠,1表示暗杠)
     碰:pengpai[0..3]:0~33最多四個碰牌
     吃:
        chipai{
           chimin0~6,9~15,18~24)
           chimax2~8,11~17,20~26)
              }吃牌中只用記錄順子的收尾即可
        chiarr[0..3]:chipai(最多有三個吃牌)
      花牌:0~8(初始化為0,每摸到一個花牌加一)
      手牌:paiInHand{
               pai[0..13],
               num:1,4,7,10,13
                     }
      要牌pai[13]:除莊家外,初始化為-1,待摸牌上手(吃牌,碰牌,杠牌摸牌,任何一家打牌)后,將對應的牌值賦值給要牌,要牌為玩家需要處理牌的標志(當非負時),當玩家處理完牌后,將牌整理后,將要牌置-1

}
當要牌置位(非負)時,要對手牌進行胡牌判斷:
由于手牌已經(jīng)除掉了大量的碰杠吃等情況,簡化的胡牌算法:
先對pai數(shù)組加上要牌一起排序;
然后用遞歸算法判斷是否胡牌;
最后判斷是否為7對,十三么,全不靠牌型:(注,這些牌型一般不容易胡,故番數(shù)也不小哦,^_^)

  1. if(num==13)
  2. {
  3.   if(pai[0]==pai[1]&pai[2]==pai[3]&pai[4]==pai[5]&pai[6]==pai[7]&pai[8]==pai[9]&pai[10]==pai[11]&pai[12]==pai[13])
  4.     return 1;//七對

  5.   dblpos=-1;  //記錄數(shù)組中對牌的位置;-1為沒有對牌
  6.   dblnum=0;//對的個數(shù)(如果超過兩個對(可能是一個刻子)則不能胡十三么,全不靠牌型)
  7.   for(i=0;i<14;i++}
  8.    {
  9.      if(pai[i]==pai[i+1])
  10.        {
  11.            dblpos=i;
  12.            dblnum++;
  13.        }
  14.       if(dblnum>;1) break;
  15.    }


  16.    if(dblnum==1) //可能為十三么
  17.     {
  18.        tirteen=1;
  19.        for(i=0;i<14;i++)
  20.        {
  21.           if(pai[i]>;0&[pai]<8)
  22.             {
  23.                 tirteen=0;
  24.                 break;
  25.             }
  26.           else if(pai[i]>;9&[pai]<17)
  27.             {
  28.                 tirteen=0;
  29.                 break;
  30.             }
  31.            else if(pai[i]>;18&[pai]<26)
  32.             {
  33.                 tirteen=0;
  34.                 break;
  35.             }//如果任何一張牌為非么九和非字牌,則不能胡十三么,
  36.            if(tirteen) return 1;//如果全部是么九和字牌,加上進入該段程序的牌只有一個對,則十三么胡牌
  37.        }
  38.     }
  39.     else//可能為全不靠
  40.     {
  41.       nowordpos=14;//記錄下最后一個不是字牌的位置
  42.       for (i=13;i>;=0;i--)
  43.        {
  44.           if(pai[i]<=26)
  45.              {
  46.               nowordpos=i;
  47.               break;
  48.              }
  49.        }
  50.       if(nowordpos<=8)//如果非字牌有9個以上,肯定不能胡全不靠
  51.      {
  52.       istirteen=1;
  53.       for(i=0;i<=nowordpos;i++)
  54.         {
  55.            if(pai[i+1]-pai[i]<3&&pai[i+1]/9==pai[i]/9)//如果存在同一花色里兩張可以吃別人的牌,則不能胡全不靠
  56.            {
  57.               istirteen=0;
  58.               break;
  59.             }
  60.         }
  61.       if(istirteen)
  62.       {
  63.        for(i=0;i<nowordpos;i++)
  64.       {
  65.            for(j=i+1;j<=nowordpos;j++)
  66.               if(pai[i]==pai[j] mod 9)
  67.                {
  68.                   istirteen=0;
  69.                   break;
  70.                }
  71.             if(istirteen==0) break;
  72.         }
  73.      }
  74.     }
  75.     }
  76. }

復制代碼

論壇徽章:
0
2 [報告]
發(fā)表于 2005-09-09 14:01 |只看該作者

麻將游戲開發(fā)


  1. /***************************************************************
  2. * 文件名:hu.cpp *
  3. * *
  4. * 功 能:演示一個簡潔明了的遞歸函數(shù)——判斷[麻將]的和牌。 *
  5. * *
  6. * 說 明:1. 此函數(shù)不判斷七對和十三幺,讀者不難自行判斷; *
  7. *     同時由于麻將的規(guī)則各不相同,也請讀者自己添加和修改。*
  8. * *
  9. *     2. 其他與麻將類似的游戲,如[字牌](又稱跑胡子、 *
  10. *     二七十)等牌類游戲,也可采用類似的判斷函數(shù)。 *
  11. * *
  12. * 環(huán) 境: VC 6.0, 但符合ANSI C標準,隨便移植 ^_^ *
  13. * *
  14. * 作 者:shyworm(怕怕蟲) *
  15. * E_Mail: shyworm@sina.com *
  16. ***************************************************************/
  17. #include <stdio.h>;

  18. int Hu(int PAI[38]);
  19. int Remain(int PAI[38]);

  20. int main()
  21. {
  22. // 把一副牌放在下面的數(shù)組里,可以任意填入數(shù)字來測試函數(shù)正確與否。
  23. // 為了方便,PAI[0],PAI[10],PAI[20],PAI[30]都棄之不用,并且必須
  24. // 置為0,千萬注意!
  25. int PAI[38] = { 0,
  26. 1,1,1,0,1,1,1,0,0, // PAI[ 1- 9] 壹萬~玖萬的個數(shù)
  27. 0,
  28. 0,0,0,0,0,3,0,0,0, // PAI[11-19] 壹銅~玖銅的個數(shù)
  29. 0,
  30. 0,0,0,0,0,0,0,0,0, // PAI[21-29] 壹條~玖條的個數(shù)
  31. 0,
  32. 0,1,1,1,0,0,0 // PAI[31-37] 東南西北中發(fā)白的個數(shù)
  33. };

  34. // 請務必先排除“七對” 和“十三幺”,由于簡單,所以不提供了
  35. // if( QIDUI(PAI) )...
  36. // if( SHISANYAO(PAI) )...

  37. if( Hu(PAI) )
  38. printf("哈!我和啦!\n");
  39. else
  40. printf("哎,和不成!\n");

  41. return 1;
  42. }

  43. // 判斷和牌的遞歸函數(shù),不考慮“七對” 和“十三幺”。因為如果
  44. // 把“七對” 和“十三幺”的判斷放在遞歸函數(shù)里,將得不償失。
  45. int Hu(int PAI[38])
  46. {
  47. static int JIANG = 0; // 將牌標志,即牌型“三三三三二”中的“二”

  48. if( !Remain(PAI) ) return 1; // 遞歸退出條件:如果沒有剩牌,則和牌返回。

  49. for(int i=1;!PAI[i]&&i<38;i++); // 找到有牌的地方,i就是當前牌, PAI[i]是個數(shù)

  50. printf("i = %d\n",i); // 跟蹤信息

  51. // 4張組合(杠子)
  52. if ( PAI[i] == 4 ) // 如果當前牌數(shù)等于4張
  53. {
  54. PAI[i] = 0; // 除開全部4張牌
  55. if( Hu(PAI) ) return 1; // 如果剩余的牌組合成功,和牌
  56. PAI[i] = 4; // 否則,取消4張組合
  57. }

  58. // 3張組合(大對)
  59. if ( PAI[i] >;= 3 ) // 如果當前牌不少于3張
  60. {
  61. PAI[i] -= 3; // 減去3張牌
  62. if( Hu(PAI) ) return 1; // 如果剩余的牌組合成功,和牌
  63. PAI[i] += 3; // 取消3張組合
  64. }

  65. // 2張組合(將牌)
  66. if ( !JIANG && PAI[i] >;= 2 ) // 如果之前沒有將牌,且當前牌不少于2張
  67. {
  68. JIANG = 1; // 設置將牌標志
  69. PAI[i] -= 2; // 減去2張牌
  70. if( Hu(PAI) ) return 1; // 如果剩余的牌組合成功,和牌
  71. PAI[i] += 2; // 取消2張組合
  72. JIANG = 0; // 清除將牌標志
  73. }


  74. if ( i >; 30 ) return 0; // “東南西北中發(fā)白”沒有順牌組合,不和

  75. // 順牌組合,注意是從前往后組合!
  76. if( i%10 != 8 && i%10 != 9 && // 排除數(shù)值為8和9的牌
  77. PAI[i+1] && PAI[i+2] ) // 如果后面有連續(xù)兩張牌
  78. {
  79. PAI[i]--;
  80. PAI[i+1]--;
  81. PAI[i+2]--; // 各牌數(shù)減1
  82. if( Hu(PAI) ) return 1; // 如果剩余的牌組合成功,和牌
  83. PAI[i]++;
  84. PAI[i+1]++;
  85. PAI[i+2]++; // 恢復各牌數(shù)
  86. }

  87. // 無法全部組合,不和!
  88. return 0;
  89. }

  90. // 檢查剩余牌數(shù)
  91. int Remain(int PAI[38])
  92. {
  93. int sum = 0;
  94. for(int i=1;i<38;i++)
  95. sum += PAI[i];
  96. return sum;
  97. }
復制代碼

論壇徽章:
0
3 [報告]
發(fā)表于 2005-09-13 13:05 |只看該作者

麻將游戲開發(fā)

胡牌判斷函數(shù)
  1. //----------------unt_mainwin.cpp---------------------------------------------------------

  2. /*-----------------------------------------------------------------------------------------
  3. *該函數(shù)判斷手牌有沒有胡牌,手牌的數(shù)量一定為[2,5,8,11,14]
  4. *當手牌數(shù)量為14時,判斷是否有特殊牌型的胡牌[十三么,七對,全不靠]
  5. *當不存在以上牌型時,用遞歸算法判斷是否存在一般的胡牌牌型
  6. *
  7. *作者:yutian(于恬)
  8. *E_main:yution@126.com
  9. *
  10. *作者聲明:本代碼為學習時編寫的代碼,大家可以隨意轉(zhuǎn)貼及編譯修改
  11. *但不得用于商業(yè)用途和賭博,作者保留一切權力
  12. *
  13. *鳴謝:網(wǎng)友  shyworm(怕怕蟲) E_mail:shyworm@sina.com
  14. *       CSDN  ChinaUnix
  15. */

  16. //-----------------------------------------------------------------------------------------------
  17. int       TWanJia::IsWin()
  18. {
  19.     int i,dblpos,dblcount;

  20.     if(this->;PaiCount==13) //先處理特殊牌型,七對、十三么及全不靠
  21.     {
  22.        if((this->;PaiInHand[0]==this->;PaiInHand[1])&(this->;PaiInHand[2]==this->;PaiInHand[3])
  23.        &(this->;PaiInHand[4]==this->;PaiInHand[5])&(this->;PaiInHand[6]==this->;PaiInHand[7])
  24.        &(this->;PaiInHand[8]==this->;PaiInHand[9])&(this->;PaiInHand[10]==this->;PaiInHand[11])
  25.        &(this->;PaiInHand[12]==this->;PaiInHand[13]))
  26.          return SevenDbl; //七對胡了   

  27.        dblcount=0;


  28.        for(i=0;i<13;i++)  //以下判斷手牌中對子的數(shù)量及位置
  29.        {
  30.          if(this->;PaiInHand[i]==this->;PaiInHand[i+1])
  31.          {
  32.             dblcount++;
  33.          }

  34.          if(dblcount>;1) break; //如果手牌中含有兩個對子(或一個刻子)以上,只能胡基本牌型
  35.        }



  36.        if(dblcount==1) //有一個對子的十三張手牌,可能為十三么
  37.          {
  38.            /***********************************************
  39.             十三么牌型必須是么九牌和字牌組成的十四張牌,按牌的數(shù)值定義
  40.              手牌數(shù)組PaiInHand中,只要沒有1~7,10~16,19~25這些值,
  41.             則可以斷定,該數(shù)組為十三么
  42.            */
  43.           int IsThirteen=1;
  44.           for(i=0;i<14;i++)
  45.            {
  46.               if(this->;PaiInHand[i]>;0&&this->;PaiInHand[i]<8)
  47.                 {
  48.                     IsThirteen=0;
  49.                     break;
  50.                 }
  51.               else if(this->;PaiInHand[i]>;9&&this->;PaiInHand[i]<17)
  52.                 {
  53.                     IsThirteen=0;
  54.                     break;
  55.                 }
  56.               else if(this->;PaiInHand[i]>;18&&this->;PaiInHand[i]<26)
  57.                 {
  58.                     IsThirteen=0;
  59.                     break;
  60.                 }
  61.            }
  62.           if(IsThirteen) return ThirteenSmall;
  63.          }   //end of 十三么

  64.        if(dblcount==0)//沒有對子,可能是全不靠
  65.          {
  66.          /*-------------------------------------------
  67.          十三不靠牌型為萬筒條三個花色的147,258,369加上字牌的七張牌共16張
  68.          的任意十四張組成的胡牌,147,258,369的花色可以為任意花色,但不能有兩副
  69.          出現(xiàn)相同的序數(shù),如一萬,四萬,一條,四條是不能組成胡牌的。

  70.          判定的算法是:
  71.          先確定所以序數(shù)牌(不是字牌)的個數(shù);
  72.          如果序數(shù)牌個數(shù)大于9,則返回錯誤;
  73.          如果有吃牌的序列(存在兩張牌可以吃掉另外一張牌),返回錯誤;
  74.          對于所有的序數(shù)牌,自第一個開始,分別與其后的所有牌值mod9得
  75.          到的值比較,如果存在相等,返回錯誤。
  76.          如果上面判斷都通過,則為十三不靠

  77.          */

  78.          int NoWordPos=14;

  79.          for(i=13;i>;=0;i--)
  80.            {
  81.               if(this->;PaiInHand[i]<=26)
  82.               {
  83.                  NoWordPos=i;
  84.                  break;
  85.               }
  86.            }

  87.          if(NoWordPos<=8)   //如果非字牌有9個以上,肯定不能胡全不靠
  88.            {
  89.               int IsThirteenSingle=1;

  90.               for(i=0;i<NoWordPos;i++)
  91.                 {
  92.                   if((this->;PaiInHand[i+1]<=(this->;PaiInHand[i]+2))&(this->;PaiInHand[i]%9==this->;PaiInHand[i+1]%9))
  93.                     {
  94.                        IsThirteenSingle=0;
  95.                        break;
  96.                     }
  97.                 }

  98.               if(IsThirteenSingle)
  99.                 {
  100.                   for(i=0;i<NoWordPos&IsThirteenSingle;i++)
  101.                     {
  102.                        for(int j=0;j<=NoWordPos;j++)
  103.                          {
  104.                             if(this->;PaiInHand[i]==this->;PaiInHand[j]%9)
  105.                               {
  106.                                 IsThirteenSingle=0;
  107.                                 break;
  108.                               }
  109.                          }
  110.                     }
  111.                 }

  112.                 if(IsThirteenSingle) return   ThirteenSingle;
  113.            }


  114.          } //end of 不靠
  115.     }
  116.    
  117.    
  118.     int TempPai[33];
  119.    
  120.     for(i=0;i<34;i++) TempPai=0;
  121.    
  122.     for(i=0;i<14;i++)
  123.       {
  124.         TempPai[this->;PaiInHand[i]]++;       
  125.       }      
  126.    if(HuPai(TempPai)) return GenaralWin;
  127.     return 0;
  128. }
  129. //-----------------------------------------------------------------------------------------------------------------
  130. int TWanJia::HuPai(int *arr)
  131. {
  132.         /*
  133.         以下代碼參考了網(wǎng)友
  134.         shyworm(怕怕蟲) E_mail:shyworm@sina.com
  135.         在csdn論壇發(fā)表的算法及源碼,在此感謝
  136.        
  137.         原來的算法中要對杠牌進行處理,但我設計的數(shù)據(jù)結(jié)構(gòu)中,不需要對他們進行判斷了,
  138.         故略去了一段代碼
  139.         */
  140.    static int Jiang=0;  // 將牌標志,即牌型“三三三三二”中的“二”
  141.    
  142.    if(!RemainPai(arr)) return 1;  // 遞歸退出條件:如果沒有剩牌,則和牌返回。
  143.    
  144.    for(int i=1;!arr[i]&i<34;i++);  // 找到有牌的地方,i就是當前牌, arr[i]是個數(shù)
  145.   
  146.   // 3張組合(刻子)
  147.    if(arr[i]>;=3)  // 如果當前牌不少于3張
  148.    {
  149.       arr[i]-=3;  // 減去3張牌
  150.       if(HuPai(arr)) return 1;   // 如果剩余的牌組合成功,和牌
  151.       arr[i]+=3;  // 取消3張組合        
  152.    }
  153.    
  154.    // 2張組合(將牌)
  155.    if(!Jiang&arr[i]>;=2)  // 如果之前沒有將牌,且當前牌不少于2張
  156.    {
  157.      Jiang=1;  // 設置將牌標志
  158.      arr[i]-=2;  // 減去2張牌
  159.      if(HuPai(arr)) return 1;  // 如果剩余的牌組合成功,和牌
  160.      arr[i]+=2;  // 取消2張組合
  161.      Jiang=0;        // 清除將牌標志
  162.    }
  163.    
  164.    if(i>;26) return 0;  // “東南西北中發(fā)白”沒有順牌組合,不和
  165.    
  166.    
  167.    // 順牌組合,注意是從前往后組合!
  168.    if(i%9!=7&i%9!=8&arr[i+1]&arr[i+2])// 排除數(shù)值為8和9的牌且如果后面有連續(xù)兩張牌  
  169.    {
  170.      arr[i]--;
  171.      arr[i+1]--;
  172.      arr[i+2]--;   // 各牌數(shù)減1
  173.      if(HuPai(arr)) return 1;  // 如果剩余的牌組合成功,和牌
  174.      arr[i]++;
  175.      arr[i+1]++;
  176.      arr[i+2]++;  // 恢復各牌數(shù)        
  177.    }
  178.    
  179.    
  180.    // 無法全部組合,不和!
  181.    return 0;
  182. }
  183. //----------------------------------------------------------------------------
  184. // 檢查剩余牌數(shù)
  185. int TWanJia::RemainPai(int *arr)
  186. {
  187.         int sum=0;
  188.        
  189.         for(int i=0;i<34;i++)
  190.           sum+=arr[i];       
  191.          
  192.         return sum;  
  193.        
  194. }
  195. //----------------------------------------------------------------------------

復制代碼


頭文件



  1. //-------------------玩家類及窗體的頭文件(修改中)----------------------------------------

  2. #ifndef unt_mainwinH
  3. #define unt_mainwinH
  4. //---------------------------------------------------------------------------
  5. #include <Classes.hpp>;
  6. #include <Controls.hpp>;
  7. #include <StdCtrls.hpp>;
  8. #include <Forms.hpp>;
  9. #include <Buttons.hpp>;

  10. #define   SevenDbl              7       //七對
  11. #define   ThirteenSmall         13      //十三么
  12. #define   ThirteenSingle        14      //十三不靠
  13. #define   GenaralWin            15      //一般胡牌

  14. //============================================
  15. // 0    1     2   3    4    5    6    7    8
  16. //============================================
  17. //一萬 二萬 三萬 四萬 五萬 六萬 七萬 八萬 九萬
  18. //============================================
  19. // 9    10   11   12   13   14   15   16   17
  20. //============================================
  21. //一條 二條 三條 四條 五條 六條 七條 八條 九條
  22. //============================================
  23. //18    19   20   21   22   23   24   25   26
  24. //============================================
  25. //一筒 二筒 三筒 四筒 五筒 六筒 七筒 八筒 九筒
  26. //============================================
  27. //27    28   29   30   31   32   33   34   35
  28. //============================================
  29. //東風 南風 西風 北風 紅中 發(fā)財 白板  花1  花2
  30. //============================================









  31. //---------------------------------------------------------------------------
  32. struct SChiPai  //吃牌的結(jié)構(gòu)體,吃的牌為順子,故記錄首尾兩張牌
  33. {
  34.   int MinPai;    //麻將牌值,吃牌中最小的牌
  35.   int MaxPai;   //麻將牌值,吃牌中最大的牌
  36. };
  37. //---------------------------------------------------------------------------
  38. struct SGangPai     //杠牌的結(jié)構(gòu)體
  39. {
  40.   int Pai;    //麻將牌值,取值范圍為[0..33]
  41.   int MingAn;//數(shù)值為0或1,1代表為暗杠,0代表明杠
  42. };
  43. //---------------------------------------------------------------------------
  44. class TWanJia
  45. {
  46. //__published:

  47. private:
  48.       AnsiString PlayerID;
  49.       int        FenShu;                //玩家的分數(shù),要和數(shù)據(jù)庫保持一致

  50.       int        MenFeng;               //玩家的門風

  51.       SGangPai   Gangpai[3];            //玩家手中杠的牌

  52.       SChiPai    ChiPai[3];             //玩家手中吃的牌

  53.       int        PengPai[3];            //玩家手中的碰牌

  54.       int        HuaPai;                //花牌的數(shù)量,算番時要用

  55.       int        PaiInHand[13];         //玩家的手牌,除掉吃碰杠牌后手中的牌
  56.                                         //即其他玩家看不到的牌,最多為十四張
  57.                                         //其中,PaiInHand[13]在處理完成后,被賦值為-1

  58.       int        PaiCount;              //手牌的數(shù)量,取值為1,4,7,10,13

  59.       int        NewPai;                //新摸到或別人打的牌,在處理完成后,被賦值為-1
  60.                                         //如果NewPai為非負值,則必須處理掉一張牌或胡牌

  61. protected:
  62.         int HuPai(int *arr);
  63.         int RemainPai(int *arr);
  64. public:
  65.                  TWanJia(AnsiString PlayID,int fenzhi);
  66.      int       SetMenFeng(int menfeng);
  67.      int       SetFenShu(int fenshu);
  68.      int       SetGangPai(int pai,int mingan);
  69.      int       SetChiPai(int min,int max);
  70.      int       SetPengPai(int pengpai);
  71.      int       SetPaiInHand(int * paiarr);
  72.      int       SetPaiCount(int count);

  73.      int       GetMenFeng();
  74.      int       GetFenShu();
  75.      SGangPai * GetGangPai();
  76.      int      * GetPengPai();
  77.      SChiPai  * GetChiPai();
  78.      int      * GetPaiInHand();
  79.      int       GetPaiCount();

  80.      int       Buhua();
  81.      int       ChiPaiWithTwoPai(int min,int max);
  82.      int       PengPaiWithOneDbl(int pai);
  83.      int       IsWin();
  84.      int       SendThePaiToServer();
  85.      int       RequireOnePai();
  86. };
  87. //---------------------------------------------------------------------------
  88. class TMJZhuo
  89. {
  90. //__published:

  91. private:
  92.      int QuanFen,Header,Tail;
  93.      int PaiQiang[143];
  94.      TWanJia Players[3];
  95. public:

  96. };

  97. //----------------------------------------------------------------------------
  98. class Tfrm_mainwin : public TForm
  99. {
  100. __published:        // IDE-managed Components
  101.         TEdit *edt_paiInHand1;
  102.         TLabel *Label1;
  103.         TEdit *edt_GangPai1;
  104.         TLabel *Label2;
  105.         TLabel *Label3;
  106.         TLabel *Label4;
  107.         TEdit *edt_ChiPai11;
  108.         TEdit *edt_ChiPai12;
  109.         TEdit *edt_ChiPai21;
  110.         TEdit *edt_ChiPai22;
  111.         TEdit *edt_ChiPai31;
  112.         TEdit *edt_ChiPai32;
  113.         TEdit *edt_ChiPai41;
  114.         TEdit *edt_ChiPai42;
  115.         TEdit *edt_GangPai2;
  116.         TEdit *edt_GangPai3;
  117.         TEdit *edt_GangPai4;
  118.         TEdit *edt_GangPai11;
  119.         TEdit *edt_GangPai22;
  120.         TEdit *edt_GangPai33;
  121.         TEdit *edt_GangPai44;
  122.         TEdit *edt_PengPai1;
  123.         TEdit *edt_PengPai2;
  124.         TEdit *edt_PengPai3;
  125.         TEdit *edt_PengPai4;
  126.         TEdit *edt_paiInHand2;
  127.         TEdit *edt_paiInHand3;
  128.         TEdit *edt_paiInHand4;
  129.         TEdit *edt_paiInHand5;
  130.         TEdit *edt_paiInHand6;
  131.         TEdit *edt_paiInHand7;
  132.         TEdit *edt_paiInHand8;
  133.         TEdit *edt_paiInHand9;
  134.         TEdit *edt_paiInHand10;
  135.         TEdit *edt_paiInHand11;
  136.         TEdit *edt_paiInHand12;
  137.         TEdit *edt_paiInHand13;
  138.         TEdit *edt_paiInHand14;
  139.         TBitBtn *btn_IsWin;
  140.         void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
  141.         void __fastcall btn_IsWinClick(TObject *Sender);
  142.         void __fastcall FormCreate(TObject *Sender);
  143. private:        // User declarations
  144.     TWanJia * Player;

  145. public:                // User declarations
  146.         void SendDataToWanJia();
  147.         void DispWanJiaData();
  148.         __fastcall Tfrm_mainwin(TComponent* Owner);
  149.         
  150. };
  151. //---------------------------------------------------------------------------
  152. extern PACKAGE Tfrm_mainwin *frm_mainwin;
  153. //---------------------------------------------------------------------------
  154. #endif

復制代碼


敬請斧正,謝謝

論壇徽章:
0
4 [報告]
發(fā)表于 2005-09-13 16:30 |只看該作者

麻將游戲開發(fā)

  1. /*-----------------------------------------------------------------------------
  2. *該函數(shù)為牌墻洗牌
  3. *先分配一個temparr[143]的數(shù)組(牌堆),依次賦值為0~35,每個數(shù)字的個數(shù)為4個;
  4. * 設置剩余牌數(shù)為144;
  5. * 當剩余牌數(shù)不為0時:
  6. *   產(chǎn)生一個隨機數(shù)n;
  7. *   將n模去剩余牌數(shù)再加一賦值給num;
  8. * 在牌堆里找到第num個牌,存進牌墻中;
  9. *
  10. *
  11. *作者:yutian(于恬)
  12. *E_main:yution@126.com
  13. *
  14. *作者聲明:本代碼為學習時編寫的代碼,大家可以隨意轉(zhuǎn)貼及編譯修改
  15. *但不得用于商業(yè)用途和賭博,作者保留一切權力
  16. ******************************************************************************/

  17. #include <math.h>;
  18. #include <time.h>;
  19. #include <stdlib.h>;

  20. int arr[143];

  21. int initpaiqiang()
  22. {
  23.    int temparr[143];
  24.    int i,j,rempai;

  25.    j=0;
  26.    rempai=144;   //設置剩余牌數(shù)
  27.    
  28.   for(i=0;i<144;i++)
  29.    {
  30.     temparr[i]=i/4; //將牌堆初始化
  31.    }

  32.   while(rempai)
  33.   {
  34.     srand((unsigned)time(NULL));
  35.     int num=random()%rempai+1;

  36.     for(i=0;i<144;i++)
  37.       {
  38.         if(temparr[i]!=-1) num--;//找到第num張牌
  39.         
  40.         if(!num)
  41.           {
  42.             arr[j]=temparr[i];   //將這張牌放入牌墻
  43.             j++;
  44.             rempai--;
  45.             temparr[i]=-1;
  46.             break;
  47.           }
  48.       }
  49.   }
  50. }
復制代碼


洗牌的函數(shù)

論壇徽章:
0
5 [報告]
發(fā)表于 2005-09-15 17:23 |只看該作者

麻將游戲開發(fā)

只能說句佩服佩服...

不過我可以提個需求嘛? 北京的玩法是每局有個牌是混,就是可以替代任何字,可不可以把這種牌型也算進去?

論壇徽章:
0
6 [報告]
發(fā)表于 2005-09-16 09:02 |只看該作者

麻將游戲開發(fā)

原帖由 "yulc" 發(fā)表:
只能說句佩服佩服...

不過我可以提個需求嘛? 北京的玩法是每局有個牌是混,就是可以替代任何字,可不可以把這種牌型也算進去?


謝謝你的建議

可以是當然可以的,但要實現(xiàn)就可能要更改類的實現(xiàn),

我是根據(jù)麻將的規(guī)則寫的,至于其他的牌型及規(guī)則,兄臺可以修改一下代碼
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術有限公司. 版權所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP