Java写的⽃地主游戏源码
原⽂地址为:
下载在最后
我们的前年的课设要求做⼀个⽃地主程序,当时正在愁如何做界⾯,当时刚好在学习C#,于是就⽤C#完成了这个程序。
⼀⽅⾯,当时我C#功底还很差(其实现在也不怎么样),很多地⽅⽤了“笨办法”,实现的⽐较幼稚,程序效率很低,另⼀⽅⾯感觉很对不起⽼师,因为做这个程序的本意是研究⽃地主程序的AI出牌等等算法相关的东西,⽽我却⼏乎忽略了这些内容。(我会好好学习算法的……^-^)
最可怕的是,由于当时时间⽐较紧,只有⼏天的时间,所以我本着“能跑就⾏”的想法完成了这个程序。从程序本⾝来说,我觉得我的代码⼏乎没有任何参考价值,满篇的,乱七⼋糟的结构,⽽且最可怕的是,所有代码⼏乎都集中在了⼀个mainform.xaml.cs⽂件⾥。。。太恐怖了。我⼀直为我会写出这样的代码感到羞耻……因此也就没敢发布这些源码。
最近⼜在研究Java,做另外的项⽬,看了看以前的代码,觉得虽然代码很烂,但有些地⽅的处理还是有⼀定意义的,毕竟这也算是个中⼩应⽤,于是⼜⽤JAVA重写了⼀遍,发上来和⼤家分享。如果能对你的
学习或者⼯作起到任何作⽤,我都会⾮常⾼兴。
此源码完全⾃由使⽤,你可以利⽤它做任何事情,包括商业应⽤,⽽不需要提前通知我。
这次采⽤的是JAVA8 ,最新发布的JAVA版本,
IDE是netbeans,⼀共有80MB左右⼤⼩,体积不⼤,安装也容易
程序⽂件夹结构是从C#转过来的,期间使⽤⼀个叫C#转JAVA的⼯具,转换了⼀下语法,效果不是很理想,还是⼿⼯改了许多地⽅
可以看到,程序是从Program.java启动(和VS的项⽬⼀样)
游戏是⽹页版联机的,因此分服务端和客户端⼆部分,
服务端JAVA包括⽃地主逻辑服务 和 记录服务(⽣成SQL语句发给数据库)
游戏客户端 -》 ⽃地主逻辑服务 - 》 记录服务 -》 数据库
《- 《- 《-
客户端发消息到⽃地主逻辑,⽃地主逻辑转发到记录服务,再返回来,这样⼀个通信过程
分成逻辑和记录⼆部分的好处是 可以并⾏运⾏提⾼效率,⽐如在SQL语句执⾏时,⽃地主逻辑可以继续处理请求
现在开始构架游戏,为了不让代码那么难看,我们很有必要加⼊设计模式和⾯向对象思想。
⾸先,我们列出54张牌。
⼤家可以看到,扑克数字相同时,有4种花⾊,桃⼼梅⽅
利⽤这个特性,我们采⽤了数字间隔,0-3⼀组 , 4-7⼀组,如果想得到花⾊,取模就可以了,是不是很⽅便?
1/**
2 * 背⾯牌都是负数
3*/
4public static final int BG_NORMAL = -3;
5public static final int BG_NONGMING = -2;
6public static final int BG_DIZHU = -1;
7java怎么编写
8public static final int F_3 = 0;
9public static final int M_3 = 1;
10public static final int X_3 = 2;
11public static final int T_3 = 3;
12
13public static final int F_4 = 4;
14public static final int M_4 = 5;
15public static final int X_4 = 6;
16public static final int T_4 = 7;
17
18public static final int F_5 = 8;
19public static final int M_5 = 9;
19public static final int M_5 = 9;
20public static final int X_5 = 10;
21public static final int T_5 = 11;
22
23public static final int F_6 = 12;
24public static final int M_6 = 13;
25public static final int X_6 = 14;
26public static final int T_6 = 15;
27
28public static final int F_7 = 16;
29public static final int M_7 = 17;
30public static final int X_7 = 18;
31public static final int T_7 = 19;
32
33public static final int F_8 = 20;
34public static final int M_8 = 21;
35public static final int X_8 = 22;
36public static final int T_8 = 23;
37
38public static final int F_9 = 24;
39public static final int M_9 = 25;
40public static final int X_9 = 26;
41public static final int T_9 = 27;
42
43public static final int F_10 = 28;
44public static final int M_10 = 29;
45public static final int X_10 = 30;
46public static final int T_10 = 31;
47
48public static final int F_J = 32;
49public static final int M_J = 33;
50public static final int X_J = 34;
51public static final int T_J = 35;
52
53public static final int F_Q = 36;
54public static final int M_Q = 37;
55public static final int X_Q = 38;
56public static final int T_Q = 39;
57
58public static final int F_K = 40;
59public static final int M_K = 41;
60public static final int X_K = 42;
61public static final int T_K = 43;
62
63public static final int F_A = 44;
64public static final int M_A = 45;
65public static final int X_A = 46;
66public static final int T_A = 47;
67
68public static final int F_2 = 56;
69public static final int M_2 = 57;
70public static final int X_2 = 58;
71public static final int T_2 = 59;
72
73public static final int JOKER_XIAO = 60;
74public static final int JOKER_DA = 64;
在PaiBoardByDdz类中,负责⽣成新牌和洗牌操作。我的思想是这样的,先通过算法按顺序⽣成54张牌,然后随机抽取这些牌,被抽取的牌从原来集合中删除,直到所有的牌都被抽取完毕为⽌,从⽽达到洗牌的⽬的。参考如下代码:可以看出⽣成新牌的时候使⽤了增强的随机数。
/**
洗牌
洗牌
*/
public final void xipai()
{
//
reset();
//
int i = 0;
int len = 0;
int n = 0;
//clone pai name
java.util.ArrayList<String> p = PAI_NAME.GetList();
//第⼀次发17张牌
len = 17;
//提⾼随机数不重复概率的种⼦⽣成⽅法:
//Millisecond 取值范围是 0 - 999
//DateTime.Now.Ticks是指从1970年1⽉1⽇(具体哪年忘了哈,好像是1970)开始到⽬前所经过的毫秒数——刻度数。
//54张牌的组合是 54!
//是⼀个⾮常⼤的数,结果是: 2.3e + 71
//因此我们的seed的取值范围也应该⾮常⼤,也就是0到上⾯的结果,
//Millisecond⼩了,导致只会出现999种牌的组合
//guid⽅法不可取,每回都是⼀样的
//直接以Random做为随机数⽣成器因为时钟精度问题,
//在⼀个⼩的时间段内会得到同样的伪随机数序列,
//你shuffle后会得到同⼀个结果。
//提供了RNGCryptoServiceProvider可以避免这种情况
//GetRandSeed后的取值范围是 0 - int32.MaxValue,虽然还差很远,但是999要好很多
java.util.Random r = new java.util.Random(RandomUtil.GetRandSeed());
for (i = 0; i < len; i++)
{
n = r.nextInt(p.size());
grid[0][i] = p.get(n);
}
for (i = 0; i < len; i++)
{
n = r.nextInt(p.size());
grid[1][i] = p.get(n);
}
for (i = 0; i < len; i++)
{
n = r.nextInt(p.size());
grid[2][i] = p.get(n);
grid[2][i] = p.get(n);
} //end for
//底牌
grid2[0] = p.get(0);
grid2[1] = p.get(1);
grid2[2] = p.get(2);
//distory
p.clear();
}
过Win7的纸牌游戏的朋友,⼀定对于游戏中的发牌动画记忆深刻,现在我们⾃⼰来实现这个动画过程。
提到发牌动画,90%的程序员肯定会想到利⽤位置(Location)的变化来刷新界⾯,可能需要启⽤⼀些线程或者计时器之类的。但是Flash天⽣就是⽤来做动画的,⽤Tween 缓动可以很容易实现。
客户端采⽤了FLASH编写,IDE为Flash Builder,语⾔则换成了AS3,由于本篇主讲JAVA,因此这⾥略过。
唯⼀需要注意的是,为保证程序代码的⼀致性,基本都是JAVA写好后,直接复制到客户端那边,这样省了建模字段不⼀样,或者名称不⼀致的问题
这个游戏采⽤了插件设计, ⽬前可以整合DISCUZ,
⾃已不需要独⽴的数据库,共⽤DISCUZ的,
需要使⽤的童鞋,先架设好DISCUZ和MYSQL数据库(可以⽤WAMP集成环境)
独⽴数据库,需要VPS或独⽴主机⼀台,有独⽴外⽹IP
可与论坛放同⼀主机,或分开放也可(共⽤论坛的数据库)
安装说明
1.将⽃地主客户端所有⽂件 拷贝到论坛根⽬录
2.在服务器上安装好Java 8
修改DdzServer、RecordServer ⽬录⾥的run.bat,将⾥⾯路径修改为当前路
RecordServer 参数还包括连接论坛MYSQL数据库的⽤户名,密码等
源码
转载请注明本⽂地址:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论