Java写的斗地主游戏源码

简介:

源码下载在最后

我们的前年的课设要求做一个斗地主程序,当时正在愁如何做界面,当时刚好在学习C#,于是就用C#完成了这个程序。
一方面,当时我C#功底还很差(其实现在也不怎么样),很多地方用了“笨办法”,实现的比较幼稚,程序效率很低,另一方面感觉很对不起老师,因为做这个程序的本意是研究斗地主程序的AI出牌等等算法相关的东西,而我却几乎忽略了这些内容。(我会好好学习算法的……^-^)

最可怕的是,由于当时时间比较紧,只有几天的时间,所以我本着“能跑就行”的想法完成了这个程序。从程序本身来说,我觉得我的代码几乎没有任何参考价值,满篇的switch...case...,乱七八糟的结构,而且最可怕的是,所有代码几乎都集中在了一个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      */
 4     public static final int BG_NORMAL = -3;
 5     public static final int BG_NONGMING = -2;
 6     public static final int BG_DIZHU = -1;
 7 
 8     public static final int F_3 = 0;
 9     public static final int M_3 = 1;
10     public static final int X_3 = 2;
11     public static final int T_3 = 3;
12 
13     public static final int F_4 = 4;
14     public static final int M_4 = 5;
15     public static final int X_4 = 6;
16     public static final int T_4 = 7;
17 
18     public static final int F_5 = 8;
19     public static final int M_5 = 9;
20     public static final int X_5 = 10;
21     public static final int T_5 = 11;
22 
23     public static final int F_6 = 12;
24     public static final int M_6 = 13;
25     public static final int X_6 = 14;
26     public static final int T_6 = 15;
27 
28     public static final int F_7 = 16;
29     public static final int M_7 = 17;
30     public static final int X_7 = 18;
31     public static final int T_7 = 19;
32 
33     public static final int F_8 = 20;
34     public static final int M_8 = 21;
35     public static final int X_8 = 22;
36     public static final int T_8 = 23;
37 
38     public static final int F_9 = 24;
39     public static final int M_9 = 25;
40     public static final int X_9 = 26;
41     public static final int T_9 = 27;
42 
43     public static final int F_10 = 28;
44     public static final int M_10 = 29;
45     public static final int X_10 = 30;
46     public static final int T_10 = 31;
47 
48     public static final int F_J = 32;
49     public static final int M_J = 33;
50     public static final int X_J = 34;
51     public static final int T_J = 35;
52 
53     public static final int F_Q = 36;
54     public static final int M_Q = 37;
55     public static final int X_Q = 38;
56     public static final int T_Q = 39;
57 
58     public static final int F_K = 40;
59     public static final int M_K = 41;
60     public static final int X_K = 42;
61     public static final int T_K = 43;
62 
63     public static final int F_A = 44;
64     public static final int M_A = 45;
65     public static final int X_A = 46;
66     public static final int T_A = 47;
67 
68     public static final int F_2 = 56;
69     public static final int M_2 = 57;
70     public static final int X_2 = 58;
71     public static final int T_2 = 59;
72 
73     public static final int JOKER_XIAO = 60;
74     public 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后会得到同一个结果。
            //.net提供了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);

                    p.remove(n);
            }




            for (i = 0; i < len; i++)
            {
                    n = r.nextInt(p.size());

                    grid[1][i] = p.get(n);

                    p.remove(n);
            }



            for (i = 0; i < len; i++)
            {
                    n = r.nextInt(p.size());

                    grid[2][i] = p.get(n);

                    p.remove(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集成环境)

 

成品下载地址

http://pan.baidu.com/s/1gdjOIYZ 

 独立数据库,需要VPS或独立主机一台,有独立外网IP
可与论坛放同一主机,或分开放也可(共用论坛的数据库)

安装说明
1.将斗地主客户端所有文件 拷贝到论坛根目录

2.在服务器上安装好Java 8

   修改DdzServer、RecordServer 目录里的run.bat,将里面路径修改为当前路

RecordServer 参数还包括连接论坛MYSQL数据库的用户名,密码等

 

   依次启动DdzServer,RecordServer 和SecurityServer安全策略服务


支持win,Linux操作系统,
Linux在terminal上输入 sudo java -jar 完整路径

*需要服务器开放9300 ,843 TCP端口 

3.在浏览器输入 http://你的网址/ddz.php 开始游戏
可多人同时玩,有排行榜,可聊天

 

源码

https://github.com/wdmir/521266750_qq_com.git

本文转自jiahuafu博客园博客,原文链接http://www.cnblogs.com/jiahuafu/p/4936111.html如需转载请自行联系原作者


jiahuafu

相关文章
|
5月前
|
前端开发 Java 关系型数据库
基于Java+Springboot+Vue开发的鲜花商城管理系统源码+运行
基于Java+Springboot+Vue开发的鲜花商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的鲜花商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。技术学习共同进步
386 7
|
5月前
|
消息中间件 算法 安全
JUC并发—1.Java集合包底层源码剖析
本文主要对JDK中的集合包源码进行了剖析。
|
1月前
|
设计模式 人工智能 前端开发
现代 Java 实现数字华容道与石头迷阵游戏的项目实战及项目开发指南
本项目基于Java 17+,采用JavaFX与MVC架构,实战开发数字华容道/石头迷阵游戏。内容涵盖技术选型、核心逻辑、现代GUI设计、动画实现及项目打包发布,结合sealed class、record等新特性,打造简洁可维护的游戏代码结构。
80 0
|
2月前
|
机器学习/深度学习 存储 Java
Java 大视界 -- Java 大数据机器学习模型在游戏用户行为分析与游戏平衡优化中的应用(190)
本文探讨了Java大数据与机器学习模型在游戏用户行为分析及游戏平衡优化中的应用。通过数据采集、预处理与聚类分析,开发者可深入洞察玩家行为特征,构建个性化运营策略。同时,利用回归模型优化游戏数值与付费机制,提升游戏公平性与用户体验。
|
4月前
|
JavaScript Java 关系型数据库
家政系统源码,java版本
这是一款基于SpringBoot后端框架、MySQL数据库及Uniapp移动端开发的家政预约上门服务系统。
142 6
家政系统源码,java版本
|
3月前
|
存储 安全 Java
Java 集合面试题从数据结构到 HashMap 源码剖析详解及长尾考点梳理
本文深入解析Java集合框架,涵盖基础概念、常见集合类型及HashMap的底层数据结构与源码实现。从Collection、Map到Iterator接口,逐一剖析其特性与应用场景。重点解读HashMap在JDK1.7与1.8中的数据结构演变,包括数组+链表+红黑树优化,以及put方法和扩容机制的实现细节。结合订单管理与用户权限管理等实际案例,展示集合框架的应用价值,助你全面掌握相关知识,轻松应对面试与开发需求。
185 3
|
4月前
|
供应链 JavaScript 前端开发
Java基于SaaS模式多租户ERP系统源码
ERP,全称 Enterprise Resource Planning 即企业资源计划。是一种集成化的管理软件系统,它通过信息技术手段,将企业的各个业务流程和资源管理进行整合,以提高企业的运营效率和管理水平,它是一种先进的企业管理理念和信息化管理系统。 适用于小微企业的 SaaS模式多租户ERP管理系统, 采用最新的技术栈开发, 让企业简单上云。专注于小微企业的应用需求,如企业基本的进销存、询价,报价, 采购、销售、MRP生产制造、品质管理、仓库库存管理、财务应收付款, OA办公单据、CRM等。
259 23
|
5月前
|
Java
【源码】【Java并发】【ConcurrentHashMap】适合中学体质的ConcurrentHashMap
本文深入解析了ConcurrentHashMap的实现原理,涵盖JDK 7与JDK 8的区别、静态代码块、构造方法、put/get/remove核心方法等。JDK 8通过Node数组+链表/红黑树结构优化并发性能,采用CAS和synchronized实现高效锁机制。文章还详细讲解了hash计算、表初始化、扩容协助及计数更新等关键环节,帮助读者全面掌握ConcurrentHashMap的工作机制。
128 6
【源码】【Java并发】【ConcurrentHashMap】适合中学体质的ConcurrentHashMap
|
5月前
|
Java 关系型数据库 MySQL
Java汽车租赁系统源码(含数据库脚本)
Java汽车租赁系统源码(含数据库脚本)
88 4
|
IDE 小程序 前端开发
详细解读java的俄罗斯方块游戏的源代码--【课程设计】
详细解读java的俄罗斯方块游戏的源代码--【课程设计】