摘 要:斗地主發(fā)牌程序是撲克牌發(fā)牌程序的一種,本程序由C語言編寫,主要涉及一維二維數(shù)組、全局變量、隨機數(shù)的生成、排序、函數(shù)的定義等基本知識。本程序由五個函數(shù)模塊來實現(xiàn)功能,分別為洗牌、發(fā)牌、排序、打印四個子函數(shù)和主函數(shù),分別使用到了隨機數(shù)的生成、數(shù)組、選擇排序、switch語句等知識。另外,程序還使用了全局變量來簡化程序內容。
關鍵詞:子函數(shù);隨機變量;排序;數(shù)組
中圖分類號:TP311.1
1 問題說明
1.1 在編寫斗地主發(fā)牌程序過程中,主要實現(xiàn)以下功能
計算機能生成一副54張的牌,并且按照斗地主的規(guī)則,能隨機打亂牌的順序(洗牌),并且分牌給3名玩家(發(fā)牌),并分出3張牌作為底牌。每位玩家的手牌和底牌都應按照大小、花色排列好(排序)。最后,計算機能顯示出每位玩家的手牌以及底牌(打?。?。
1.2 在編寫斗地主發(fā)牌程序過程中,主要遇到的問題
(1)如何實現(xiàn)牌的打亂;(2)如何將牌發(fā)給玩家,一次性還是一個一個的發(fā)等等;(3)如何將按既按照大小,又按照花色進行排序;(4)如何將花色進行打印。
2 程序內容
2.1 程序流程圖
圖1
2.2 算法描述
本程序主要使用了兩個算法:隨機數(shù)的生成和選擇排序法。
2.2.1 隨機數(shù)的生成
隨機數(shù)的生成主要使用了srand(time(0))和r=rand()%(54-i)+i兩段代碼,先從1-54中隨機選擇一個數(shù)與1交換,再從2-54中隨機選擇一個數(shù)與2交換……依次類推,從而達到了洗牌的目的。其復雜度為O(N),N=54。
2.2.2 選擇排序。選擇排序主要用到的算法程序為:
for(i=0;i { for(j=i+1;j { if(S[i]>S[j]) { temp=S[i]; S[i]=S[j]; S[j]=temp; } } } 既將數(shù)組中,每一位的數(shù)都與其后面的數(shù)進行比較,若比后面的大,則交換數(shù)的位置,直到最后,將這組數(shù)組按從小到大的順序排序。在本程序中,也運用選擇排序,將每位玩家的手牌和底牌都進行排序,不同的是進行了兩次排序,分別對牌的大小和花色進行排序。其復雜度為2*O(N^2),N=54,空間復雜度為2*1。 2.3 變量說明 全局變量:程序中定義了多了全局變量,大大簡化了程序的復雜程度和繁瑣的定義以及函數(shù)實參的調用,具體有存放三玩家手牌的數(shù)組player[][],存放底牌的數(shù)組LastCard[],以及循環(huán)計數(shù)量i,j,k。 2.4 函數(shù)說明 2.4.1 void shuffle()——洗牌函數(shù) 洗牌函數(shù)的思路是先定義數(shù)組poker[],用來存放54張撲克牌,然后運用隨機數(shù)的生成,從1-54中隨機抽取一個數(shù),與1交換;從2-54中隨機抽取一個數(shù),與2交換……從i-54中抽取一個數(shù),與i交換,再借助于循環(huán)語句,從而數(shù)組poker[]中的54個定義撲克牌的數(shù)隨機打亂交換,達到了類似洗牌的目的,并且仍舊存放在poker[]中。 2.4.2 void deal()——發(fā)牌函數(shù) 發(fā)牌函數(shù)定義時使用了形參a[],在實際調用時,傳遞進去的是之前已經(jīng)隨機打亂的數(shù)組poker[]。此函數(shù)的目的是將撲克牌發(fā)給3位玩家,并留3張牌最為底牌。因為從概率上來講,對于隨機打亂的牌,一次發(fā)一張和一次發(fā)一沓是一樣的,并且這次程序最終是顯示玩家手牌,不顯示發(fā)牌過程。所以,在發(fā)牌時,滿足公平的情況下,側重于編程的簡單,不考慮實際規(guī)則,選擇一次發(fā)一沓的發(fā)牌方式。運用循環(huán)語句以及player[j][i%17]=a[i]語句,將牌“發(fā)”給每位玩家,并取最后3張牌最為底牌。 2.4.3 void sort()——排序函數(shù) 排序函數(shù)主要運用循環(huán)語句,if語句以及選擇排序算法對每位玩家以及底牌進行排序。由于之前對54張撲克牌進行定義,分別另花色紅桃、方塊、草花、黑桃為1、2、3、4;另A-k為1-13,從而每一張牌定義成一個3位數(shù),大小王分別定義為613和513。在排序過程中,先不考慮百位,僅對十位和個位構成的數(shù)進行比較,既對牌的大小進行排序;若出現(xiàn)牌大小一樣,則再為百位的數(shù)進行比較排序。 2.4.4 void print()——打印函數(shù) 打印函數(shù)主要是將排序好的數(shù)組player[][]和LastCard[]進行輸出(既顯示玩家的手牌以及底牌),主要運用了switch語句來實現(xiàn),并用了ASCLL碼表中的003、004、005、006來輸出四種花色。 3 程序執(zhí)行結果 第一次執(zhí)行: 圖2 第二次執(zhí)行: 圖3 第三次執(zhí)行 圖4 4 結束語 由多次執(zhí)行結果可以看出,本程序思路正確,結果準確,符合題目要求,可以作為斗地主發(fā)牌程序來執(zhí)行。 同時,在編寫程序過程中,也發(fā)現(xiàn)了一些缺陷和有待改進的地方,如排序和打印函數(shù)相對比較繁瑣,有待進一步的簡化;另外,對于完美的斗地主發(fā)牌程序,發(fā)牌的方式也有待改進和提高。因為對指針和結構體的不熟悉,所以在編寫程序時相對套路和方法比較麻煩。 參考文獻: [1]譚浩強.C程序設計(第三版)[M].北京:清華大學出版社,2005(07). [2]嚴蔚敏,吳偉民.數(shù)據(jù)結構(C語言版)[M].北京:清華大學出版社,2008(10). [3]殷建平.算法導論[M].北京:機械工業(yè)出版社,2013(01). 作者簡介:錢學林(1992.02-),男,浙江紹興人,在校三年級本科生,研究方向:數(shù)學與應用數(shù)學。 作者簡單:西安電子科技大學,西安 710126