你们好,欢迎各位前辈看小弟写的一个网络版的斗地主程序,下面是小弟用了两个多星期的心血写成的,请各位前辈多指教!使小弟我可以获得前辈的指点,更上一层楼,谢谢支持!
下面是我写的项目分析和讲解:
因为我装的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 {
黑桃,红心,梅花,方块,无;
}
在这里主要表示牌上的花色的一个做用。那么里有个“无”是表示大小王的时候用到的。
下面就来说一讲出牌的规则算法的类吧,我在这里设计的是一个静态类,里的成员方法和属性也都是静态,由于规则吗,我想应该是不须要构造的,只要你出牌,你就使用。
再设计算法的同时,我也设计了一个出牌类型的枚举的类。这个类主要是表现全部可能出现出牌的类型状况。
PukerGroupLaiXin.java代码以下:
*此枚举是一个区分出的牌组
* 和区分接收的牌组类型的做用
* */
public enum PukerGroupLaiXin
{
个子,对子,双王×××,一飞机,一飞机带翅膀,×××,五顺子,六张顺子,二飞机,三连对,×××带二,
七张顺子,八张顺子,二飞机带翅膀,四连对,九张顺子,三飞机,十张顺子,五连对,十一张顺子,
十二顺子,三飞机带翅膀,六连对,四飞机,七连对,五飞机,四飞机带翅膀,八连对,九连对,六飞机,
十连对,五飞机带翅膀,发送无,接收无;
}
程序的设计就说到这了。而后谢谢你们的支持,个人QQ是:565345652,但愿你们可以给提一些意见。
下面说一说此程序的使用方法:
由于这是一个网络版的斗地主游戏,我设计的是三我的玩的,因此要开三个程序,才能玩,个人服务器和客户端都写在了一块儿,因此无论是谁,均可以服务器的程序,可是三个程序当中只能有一个服务器端的程序,那么执行什么才是服务器的程序的:
样例图以下:
选择“游戏管理” 》“建立游戏”就弹出一个界面以下:
能够输入本身的真实明字或随便的游戏名字,只要不为空就能够了,而后点击建立游戏就能够了!就点击主界面上的“准备”按钮,而后就出现一个“开始”按钮,而后服务器端的这个程序就等待客户端的链接,只要有两个客户端链接上来,而且它们都点击了“准备”按钮以后,服务器端再点“开始”按钮才会有效。
效果图以下:
这时等待客户端的链接。
那么怎样建立客户端程序呢!
样例以下:
选择“游戏管理” 》“加入游戏”就弹出一个界面以下:
输入服务器端程序的IP地址,和本身的用户名后点击“链接”按钮便可链接服务,若是链接上了会弹出一个对话框以下:
点击肯定以后:
点击“准备”按钮以后,等待服务器端的发牌。
当有两个客户端链接以后,而且它们都点击了“准备”按钮以后,服务器端就能够点击“开始”按钮发牌开始游戏了。这时服务器也会将地主选择出来,此例当中选择的第二个用户为地主。
效果图以下:
服务器端:
客户端1:
客户端2:
下面再来看一出牌的效果图:
先从地主开始出牌:
Client1:
Client2:
Server:
其实在选择要出的牌时,不光能够单击一张牌,也能够用鼠标拖动来选择牌。
游戏说明就说到这了,谢谢你们支持。因为时间缘由在这里我可能没有把网络实现讲一下,我可能会在之后有时间再写出来,就发到网上去,但愿你们支持。可能个人网络这一方面写的不是很优美,须要改进的地方可能会有不少。