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:
其实在选择要出的牌时,不光可以单击一张牌,也可以用鼠标拖动来选择牌。
游戏说明就说到这了,谢谢大家支持。由于时间原因在这里我可能没有把网络实现讲一下,我可能会在以后有时间再写出来,就发到网上去,希望大家支持。可能我的网络这一方面写的不是很优美,需要改进的地方可能会有很多。

本文出自 “老舒的博客” 博客,转载请与作者联系!

你可能感兴趣的:(职场,java技术,休闲)