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一组,如果想得到花色,取模就可以了,是不是很方便?
/**
* 背面牌都是负数
*/
public static final int BG_NORMAL = -3;
public static final int BG_NONGMING = -2;
public static final int BG_DIZHU = -1; public static final int F_3 = 0;
public static final int M_3 = 1;
public static final int X_3 = 2;
public static final int T_3 = 3; public static final int F_4 = 4;
public static final int M_4 = 5;
public static final int X_4 = 6;
public static final int T_4 = 7; public static final int F_5 = 8;
public static final int M_5 = 9;
public static final int X_5 = 10;
public static final int T_5 = 11; public static final int F_6 = 12;
public static final int M_6 = 13;
public static final int X_6 = 14;
public static final int T_6 = 15; public static final int F_7 = 16;
public static final int M_7 = 17;
public static final int X_7 = 18;
public static final int T_7 = 19; public static final int F_8 = 20;
public static final int M_8 = 21;
public static final int X_8 = 22;
public static final int T_8 = 23; public static final int F_9 = 24;
public static final int M_9 = 25;
public static final int X_9 = 26;
public static final int T_9 = 27; public static final int F_10 = 28;
public static final int M_10 = 29;
public static final int X_10 = 30;
public static final int T_10 = 31; public static final int F_J = 32;
public static final int M_J = 33;
public static final int X_J = 34;
public static final int T_J = 35; public static final int F_Q = 36;
public static final int M_Q = 37;
public static final int X_Q = 38;
public static final int T_Q = 39; public static final int F_K = 40;
public static final int M_K = 41;
public static final int X_K = 42;
public static final int T_K = 43; public static final int F_A = 44;
public static final int M_A = 45;
public static final int X_A = 46;
public static final int T_A = 47; public static final int F_2 = 56;
public static final int M_2 = 57;
public static final int X_2 = 58;
public static final int T_2 = 59; public static final int JOKER_XIAO = 60;
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
Java写的斗地主游戏源码的更多相关文章
- Android掌中游斗地主游戏源码完整版
源码大放送-掌中游斗地主(完整版),集合了单机斗地主.网络斗地主.癞子斗地主等,有史以来最有参考价值的源码,虽然运行慢了一点但是功能正常,用的是纯java写的. 项目详细说明:http://andro ...
- Java版的扫雷游戏源码
package com.xz.sl; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; i ...
- Java Swing打猎射击游戏源码
代码如下 <font size="3">package Game; import java.awt.Graphics; import java.awt.Image; i ...
- html5 canvas简易版捕鱼达人游戏源码
插件描述:html5利用canvas写的一个js版本的捕鱼,有积分统计,鱼可以全方位移动,炮会跟着鼠标移动,第一次打开需要鼠标移出背景图,再移入的时候就可以控制炮的转动,因为是用的mouseover触 ...
- [置顶] ios 水果连连看游戏源码
原创文章,转载请注明出处:http://blog.csdn.net/donny_zhang/article/details/9251917 demo功能:水果连连看游戏源码.iphone6.1 测试通 ...
- java多线程系列(九)---ArrayBlockingQueue源码分析
java多线程系列(九)---ArrayBlockingQueue源码分析 目录 认识cpu.核心与线程 java多线程系列(一)之java多线程技能 java多线程系列(二)之对象变量的并发访问 j ...
- Java集合系列[4]----LinkedHashMap源码分析
这篇文章我们开始分析LinkedHashMap的源码,LinkedHashMap继承了HashMap,也就是说LinkedHashMap是在HashMap的基础上扩展而来的,因此在看LinkedHas ...
- 【JVM】深度分析Java的ClassLoader机制(源码级别)
原文:深度分析Java的ClassLoader机制(源码级别) 为了更好的理解类的加载机制,我们来深入研究一下ClassLoader和他的loadClass()方法. 源码分析 public abst ...
- 15款Cocos2d-x游戏源码
(1)用cocos2d-x开发的中国象棋游戏源码 使用Cocos2d-X2.2.3开发的一款中国象棋游戏,游戏中可以实现.新局面.悔棋.游戏音乐.胜利后会显示游戏结果. 源码下载:http://www ...
随机推荐
- HTML <fieldset> 标签将表单内的相关元素分组
<fieldset> 标签将表单内容的一部分打包,生成一组相关表单的字段. 当一组表单元素放到 <fieldset> 标签内时,浏览器会以特殊方式来显示它们,它们可能有特殊的边 ...
- sharepoint多个NLB的web前段如何进行文件同步?
大家都知道,sharepoint2010服务器场可能有2个或2个以上的web服务器做NLB,有个时候牵涉到上传文件到文件夹(说到这里,有人会说全部以二进制文件保存到文档库啊,但是有些情况不允许的,比如 ...
- 学习笔记:腾讯云——服务器mysql操作
1.进入数据库 (注意:在linux系统下要进入mysql所在的文件夹下才能打开数据库) 操作1:进入到指定目录下 命令行:cd /opt/lampp/bin 操作2:进入到数据库 命令行:./mys ...
- 原创:phoenix4.6.0连接hbase1.1.2(不使用phoenix-4.6.0-HBase-1.1-client.jar)
官网上面的例子是在phoenix-4.6.0-HBase-1.1-client.jar完成的,这个jar包含了phoenix4.6连接hbase1.1.2所有的依赖,真是包罗万象(里面竟然还包括了se ...
- Emacs学习心得之 基础配置
作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 Emacs学习心得之 基础配置 1.前言2.基础配置 一.前言 本篇博文记录了Emacs的一 ...
- 在Android中引入Java8的lambda表达式
我用的是retrolambda这个插件,下面来说下如何添加它. 项目地址:https://github.com/evant/gradle-retrolambda 在根项目的build.gradle中添 ...
- 颜色线性渐变-CAGradientLayer
我们先来看一下效果图吧: 其实,就是一个颜色的线性渐变,使用CAGradientLayer很容易就能实现.由于代码很简单,就不做过多讲解了,直接看代码吧. import UIKit class Vie ...
- Quartz2D复习(二) --- 手势解锁
这次支付宝手机客户端升级,把手势解锁那个功能去掉了,引起很多人的抱怨,觉得少了手势解锁的保护,个人信息容易泄漏了... 那么手势解锁功能是怎么是实现的呢,这里使用Quart2D来简单模拟一下, 先看下 ...
- HTTPS时代全面到来,你准备好了吗?
近一年可能有很多朋友发现在使用百度搜索时,是这个样子的 如我们所见,浏览器地址栏里的HTTP可能将成为永远的过去时,取而代之的是更安全的HTTPS. 首先,HTTPS是什么? HTTPS是Http O ...
- 巧用Xode中的代码块(转)
在我们编码的过程中,总会发现有一些重复的编码工作,可能你会不厌其烦的去copy and paste,但是你有去考虑过怎样解决这样的问题吗?其实现在很多的编程IDE都能帮助我们减少一些编码的任务,提高编 ...