JAVA網絡版鬥地主遊戲

你們好,歡迎各位前輩看小弟寫的一個網絡版的鬥地主程序,下面是小弟用了兩個多星期的心血寫成的,請各位前輩多指教!使小弟我可以獲得前輩的指點,更上一層樓,謝謝支持!
下面是我寫的項目分析和講解:
因爲我裝的eclipse沒有裝UML插件,因此就沒有設計UML圖,可是個人源碼當中大部分有註解講解。
在此程序當中,個人主要抽象對象是牌這個對象
Puker.java代碼以下:
/*
 * 這是一個牌對象的抽象類
 * 是爲了表現牌這個對象
 * */
import java.awt.*;
 
public class Puker
{
       public int P_x,P_y; //表示牌X,Y座標的屬性
       private final int P_w=60,P_h=80; //表示牌寬,高的屬性
       public Puker_num puker_num=null; //表示牌的牌值的屬性
       public Puker_hushe puker_hushe=null; //表示牌的花色的屬性
       public String puker_n=null;    //表示畫牌時用到的一個屬性
       public int puker_num1,puker_hushe1; //用整數形式表示牌的牌值和花色的屬性
       public int puker_dx;       //表示牌的大小的值
       public boolean bUp=false; //表示牌是否被選中的屬性
      
       /*
        * 用於構造用戶本身的牌的構造方法
        * */
       public Puker(int P_x,int P_y,Puker_num puker_num,Puker_hushe puker_hushe)
       {
              this.P_x=P_x;
              this.P_y=P_y;
              this.puker_num=puker_num;
              this.puker_hushe=puker_hushe;
              this.BPuker_num();
       }
      
       /*
        * 用於構造54張牌組的構造方法
        * */
       public Puker(int puker_num1,int puker_hushe1)
       {
              this.puker_num1=puker_num1;
              this.puker_hushe1=puker_hushe1;
       }
      
       /*
        *用於畫牌這個對象的方法
        * */
       public void paint(Graphics g)
       {
              Color c=g.getColor();
              g.setColor(Color.WHITE);
              g.fill3DRect(this.P_x, this.P_y, this.P_w, this.P_h, true);
              g.setColor(Color.BLACK);
              g.draw3DRect(this.P_x, this.P_y, this.P_w, this.P_h, true);
              g.drawString(this.puker_n, this.P_x+5, this.P_y+20);
              if(this.puker_n.equals("大王")||this.puker_n.equals("小王"))
              {
                    
              }else g.drawString(this.puker_hushe.toString(), this.P_x+20, this.P_y+20);
              g.setColor(c);
       }
      
       /*
        * 此方法根據構造方法當中的屬性來
        * 決定牌的其餘屬性
        * */
       public void BPuker_num ()
       {
              switch(puker_num)
              {
                     case p1: this.puker_n="1";
                            this.puker_dx=14;
                            this.puker_num1=1;
                           break;
                     case p2: this.puker_n="2";
                            this.puker_dx=15;
                            this.puker_num1=2;
                            break;
                     case p3: this.puker_n="3";
                            this.puker_dx=3;
                            this.puker_num1=3;
                           break;
                     case p4: this.puker_n="4";
                            this.puker_dx=4;
                            this.puker_num1=4;
                            break;
                     case p5: this.puker_n="5";
                            this.puker_dx=5;
                            this.puker_num1=5;
                            break;
                     case p6: this.puker_n="6";
                            this.puker_dx=6;
                            this.puker_num1=6;
                            break;
                     case p7: this.puker_n="7";
                            this.puker_dx=7;
                            this.puker_num1=7;
                            break;
                     case p8: this.puker_n="8";
                            this.puker_dx=8;
                            this.puker_num1=8;
                            break;
                     case p9: this.puker_n="9";
                            this.puker_dx=9;
                            this.puker_num1=9;
                            break;
                     case p0: this.puker_n="10";
                            this.puker_dx=10;
                            this.puker_num1=10;
                            break;
                     case pJ: this.puker_n="J";
                            this.puker_dx=11;
                            this.puker_num1=11;
                            break;
                     case pQ: this.puker_n="Q";
                            this.puker_dx=12;
                            this.puker_num1=12;
                            break;
                     case pK: this.puker_n="K";
                            this.puker_dx=13;
                            this.puker_num1=13;
                            break;
                     case pD: this.puker_n="大王";
                            this.puker_dx=17;
                            this.puker_num1=15;
                            break;
                     case pX: this.puker_n="小王";
                            this.puker_dx=16;
                            this.puker_num1=14;
                            break;
              }
              switch(puker_hushe)
              {
                     case 黑桃: this.puker_hushe1=1;
                     break;
                     case 紅心: this.puker_hushe1=2;
                     break;
                     case 梅花: this.puker_hushe1=3;
                     break;
                     case 方塊: this.puker_hushe1=4;
                     break;
                     case : if(this.puker_num1==14){
                            this.puker_hushe1=5;
                     }else if(this.puker_num1==15){
                            this.puker_hushe1=6;
                     }
                     break;
              }
       }
      
       /*
        * 此方法是獲得一個牌
        * 的一矩形對象,是爲了
        * 選擇牌時用鼠標拖一個矩形而後
        * 與牌對象的矩形對象進行相交決定
        * 是否被選中
        * */
    public Rectangle getRect(){
           return new Rectangle(P_x,P_y,P_w,P_h);
    }
}
應該說我這個程序主要是圍繞着這個對象再操做。
 
那麼表示牌的牌值我是用了一個枚舉類型表示的
Puker_num.java代碼以下:
/*
 * 此枚舉是表示牌
 * 的牌值的一個枚舉
 * */
public enum Puker_num
{
       p1,p2,p3,p4,p5,p6,p7,p8,p9,p0,pJ,pQ,pK,pX,pD;
      
}
這個枚舉主要表現牌的牌值的做用。
那麼表示牌的花色我也是用了一個枚舉類型表示的
Puker_hushe.java代碼以下:
/*
 * 此枚舉是一個表示牌
 * 花色的枚舉
 * */
public enum Puker_hushe {
       黑桃,紅心,梅花,方塊,;
}
在這裏主要表示牌上的花色的一個做用。那麼裏有個「無」是表示大小王的時候用到的。
 
下面就來說一講出牌的規則算法的類吧,我在這裏設計的是一個靜態類,裏的成員方法和屬性也都是靜態,由於規則嗎,我想應該是不須要構造的,只要你出牌,你就使用。
可能Rule.java這個算法類的代碼會相對的多一點,我就不在這個地列出來了,朋友們能夠下載個人源代碼。能夠到個人我的站點上去下載http://smq-java.javaeye.com/http://smqnetwork.blog.51cto.com/
 
再設計算法的同時,我也設計了一個出牌類型的枚舉的類。這個類主要是表現全部可能出現出牌的類型狀況。
PukerGroupLaiXin.java代碼以下:
*此枚舉是一個區分出的牌組
 * 和區分接收的牌組類型的做用
 * */
public enum PukerGroupLaiXin
{
       個子,對子,雙王×××,一飛機,一飛機帶翅膀,×××,五順子,六張順子,二飛機,三連對,×××帶二,
       七張順子,八張順子,二飛機帶翅膀,四連對,九張順子,三飛機,十張順子,五連對,十一張順子,
       十二順子,三飛機帶翅膀,六連對,四飛機,七連對,五飛機,四飛機帶翅膀,八連對,九連對,六飛機,
       十連對,五飛機帶翅膀,發送無,接收無;
}
程序的設計就說到這了。而後謝謝你們的支持,個人QQ是:565345652,但願你們可以給提一些意見。
 
下面說一說此程序的使用方法:
由於這是一個網絡版的鬥地主遊戲,我設計的是三我的玩的,因此要開三個程序,才能玩,個人服務器和客戶端都寫在了一塊兒,因此無論是誰,均可以服務器的程序,可是三個程序當中只能有一個服務器端的程序,那麼執行什麼纔是服務器的程序的:
樣例圖以下:
選擇「遊戲管理」 》「建立遊戲」就彈出一個界面以下:
能夠輸入本身的真實明字或隨便的遊戲名字,只要不爲空就能夠了,而後點擊建立遊戲就能夠了!就點擊主界面上的「準備」按鈕,而後就出現一個「開始」按鈕,而後服務器端的這個程序就等待客戶端的鏈接,只要有兩個客戶端鏈接上來,而且它們都點擊了「準備」按鈕以後,服務器端再點「開始」按鈕纔會有效。
效果圖以下:
這時等待客戶端的鏈接。
 
那麼怎樣建立客戶端程序呢!
樣例以下:
選擇「遊戲管理」 》「加入遊戲」就彈出一個界面以下:
輸入服務器端程序的IP地址,和本身的用戶名後點擊「鏈接」按鈕便可鏈接服務,若是鏈接上了會彈出一個對話框以下:
點擊肯定以後:
點擊「準備」按鈕以後,等待服務器端的發牌。
當有兩個客戶端鏈接以後,而且它們都點擊了「準備」按鈕以後,服務器端就能夠點擊「開始」按鈕發牌開始遊戲了。這時服務器也會將地主選擇出來,此例當中選擇的第二個用戶爲地主。
效果圖以下:
服務器端:
客戶端1
客戶端2
 
下面再來看一出牌的效果圖:
先從地主開始出牌:
Client1:
Client2:
Server:
其實在選擇要出的牌時,不光能夠單擊一張牌,也能夠用鼠標拖動來選擇牌。
遊戲說明就說到這了,謝謝你們支持。因爲時間緣由在這裏我可能沒有把網絡實現講一下,我可能會在之後有時間再寫出來,就發到網上去,但願你們支持。可能個人網絡這一方面寫的不是很優美,須要改進的地方可能會有不少。
相關文章
相關標籤/搜索